운영체제
메모리 계층 구조
- 사용 목적에 따라 메모리를 여러 계층으로 둠
- 레지스터, 캐시 메모리, RAM, 하드 디스크
시스템 콜
- 운영체제의 커널 모드에 접근해 필요한 기능을 수행하기 위해 프로세스에서 호출하는 함수
- 프로세스 제어, 파일 조작, 장치 조작 등을 수행함.
프로세스
- 실행 중인 하나의 프로그램으로, 하나 이상의 스레드를 가짐
- PCB(Process Control Block)에 프로세스의 현재 상태, PID(Process ID), 부모 PID 등을 저장함.
- 프로세스 마다 독립된 메모리 공간을 가짐
- 스택: 지역 변수, 함수의 매개변수, 반환 주소 값 저장
- 힙: 동적 메모리 할당
- 데이터: 전역 변수, 정적 변수, 배열, 구조체 저장. 세부적으로 초기화된 데이터는 데이터 영역에, 초기화되지 않은 데이터는 BSS 영역에 저장됨
- 코드: 기계어
스레드
- 프로세스에서 실제 실행되는 흐름의 단위
- 각 스레드는 스택 영역을 할당받음
- 스택을 제외한 영역은 다른 스레드와 공유
멀티 프로세스와 멀티 스레드
- 멀티 프로세스
- 응용 프로그램을 여러 개의 프로세스로 구성하는 것
- 프로그램을 하나의 프로세스로 구성하는 것보다 안정적임
- 콘텍스트 스위칭으로 오버헤드가 발생함
- 독립된 메모리 공간을 갖기 때문에 IPC를 사용함
- 멀티 스레드
- 스레드를 여러 개 생성해 작업을 처리하는 것
- 스택을 제외한 영역은 다른 스레드와 공유하므로 데이터 동기화 필요
- 콘텍스트 스위칭 시 멀티 프로세스 대비 오버헤드가 적음
콘텍스트 스위칭
- 멀티 프로세스 환경에서 CPU가 다른 프로세스를 처리하기 위해 처리 중인 프로세스를 변경하는 것
- 처리하던 프로세스 정보를 저장하고, 다음으로 처리할 프로세스 정보를 레지스터에 로드하면서 오버헤드 발생
프로세스 동기화
- 멀티 프로세스 환경에서 공유자원의 일관성을 보장하기 위한 방법
- 상호배제 기법 이용
- 뮤텍스: 락(lock)을 가진 한 프로세스만 임계 영역에 접근 가능
- 세마포어: 정해진 개수의 프로세스만 임계 영역에 접근 가능
교착 상태
- 상호배제: 하나의 공유 자원을 한 개의 프로세스만 사용할 수 있음
- 점유와 대기: 프로세스가 최소 하나의 자원을 점유하고 있는 상태에서 추가로 다른 프로세스가 사용 중인 자원을 점유하기 위해 대기함
- 비선점: 다른 프로세스에 할당된 자원을 뺏을 수 없음
- 환형 대기: 프로세스가 자신의 자원을 점유하면서 앞이나 뒤에 있는 프로세스의 자원 요구
비연속적 메모리 할당
- 페이징
- 프로세스의 메모리 영역과 물리 메모리 영역을 일정 크기로 분할하는 방식
- 프로세스의 메모리 영역을 페이지로, 물리 메모리 영역을 프레임으로 나눔
- 내부 단편화 문제 발생 가능
- 세그먼테이션
- 프로세스를 논리적 단위로 분할하는 방식
- 데이터를 보호하기 쉬움
- 스택 세그먼트 영역에서 스택 오버플로 발생 가능
가상 메모리
- 메모리 공간의 한계를 극복하기 위해 고안한 방식으로, 프로세스 일부만 메모리에 올림
- 많은 프로세스를 메모리에 로드할 수 있음.
- 요구 페이징: 필요한 페이지만 메모리에 로드, 페이지 폴트 발생 가능
- 스레싱: 가상 메모리 환경에서 다중 프로그래밍 정도가 높아지면서 페이지 폴트가 빈번히 발생해 CPU 이용률이 오히려 낮아지는 증상
스택 오버플로와 힙 오버플로에 관해 설명해 보세요.
스택 오버플로는 메모리에서 스택 영역이 힙 영역을 침범할 때 발생합니다.
예: 과도한 재귀 호출
힙 오버플로
예: 과도한 동적 메모리 할당
PCB가 무엇인지 설명해보세요.
PCB는 Process Control Block의 약자로, 프로세스에 대한 정보를 저장하는 구조체입니다. 저장되는 정보로는 PID, 프로세스가 다음으로 실행해야 하는 명령어의 주소 값인 PC, CPU의 레지스터에 저장되는 정보
스레드 안전이란
스레드 안전은 하나의 자원 또는 객체에 여러 스레드가 접근해도 프로그램을 실행하는 데 문제가 없는 것을 의미합니다.
캐시 메모리
캐시 메모리는 CPU와 메모리 간의 속도 차이를 좁히기 위해 사용합니다. CPU에서 자주 사용하는 데이터를 접근 속도가 빠른 캐시 메모리에 저장합니다. 이때 적중률을 높이기 위해 자주 사용하는 데이터를 저장하는 지역성 원리를 사용합니다.
네트워크
TCP
- 송신부와 수신부의 연결을 확인하는 연결형 서비스
- 패킷이 전달되는 회선이 정해져 있는 가상 회선 패킷 교환 방식 사용
- 데이터 손실이 없음을 보장하므로 신뢰성이 높음
- 연결할 때는 3-way 핸드쉐이킹, 해제할 때는 4-way 핸드쉐이킹
- 신뢰성 보장 방법
- 흐름 제어: 수신부와 송신부 간 데이터 처리 속도 제어
- 혼잡 제어: 송신부의 데이터 전달 속도와 네트워크 속도 차이 해결
- 오류 제어: 데이터의 오류 검출 및 재전송
UDP
- 송신부와 수신부의 연결이 보장되지 않는 비연결형 서비스
- 패킷이 서로 다른 회선으로 교환될 수 있는 데이터그램 패킷 교환 방식 사용
- 데이터의 신뢰성이 낮음
- 체크섬 필드를 이용해 최소한의 오류 검출 가능
HTTP
- 인터넷에서 데이터를 전송하기 위한 클라이언트-서버 구조의 통신 프로토콜
- 비연결성: 서버에서 응답을 받으면 연결을 끊음
- 무상태: 서버가 클라이언트를 식별하지 못함
- 쿠키와 세션을 통해 비연결성과 무상태의 단점 보완
- 쿠키: 클라이언트 로컬에 저장되는 키와 값이 들어 있는 작은 데이터 파일
- 세션: 서버에 저장되는 연결 관련 정보
TCP Keep Alive와 HTTP Keep Alive
- TCP Keep Alive: 연결된 세션을 계속 유지하기 위한 방식, 일정 시간 동안 패킷 교환이 없으면 연결 유지 여부를 확인하는 패킷을 던짐
- HTTP Keep Alive: 일정 시간 동안 연결을 유지하는 방식, 정해진 시간이 끝나면 연결 해제
REST
- URI로 자원을 명시하고 HTTP 메서드로 CRUD 연산을 하는 소프트웨어 아키텍처
- HTTP 프로토콜을 사용하므로 별도 인프라를 구축할 필요가 없음
- HTTP 프로토콜을 따르는 모든 플랫폼에서 사용할 수 있음
- 사용 가능한 메서드가 한정적이라는 단점이 있음
- 구성요소
- 자원: URI를 이용해 클라이언트에서 서버로 자원 조작을 요청할 수 있음
- 행위: HTTP 메서드로 자원에 대한 연산을 수행하게 함
- 표현: JSON or XML로 데이터를 주고 받음
RESTful API의 특징
| 특징 | 설명 |
|---|
| 무상태성(Stateless) | 서버는 클라이언트의 상태를 저장하지 않음 |
| 일관된 인터페이스 | HTTP 메서드와 URI로 자원에 접근 |
| 계층 구조 | 서버 구조는 클라이언트에 감춰짐 (프록시, 게이트웨이 허용) |
| 캐시 처리 가능 | HTTP 응답에 따라 캐싱 가능 |
| 클라이언트-서버 구조 | 역할을 명확히 분리 (UI는 클라이언트, 데이터 처리는 서버) |
3. RESTful API 예시
사용자 정보를 다루는 API를 예로 들면:
| HTTP 메서드 | URI | 설명 |
|---|
| GET | /users | 유저 목록 조회 |
| GET | /users/1 | ID=1 유저 조회 |
| POST | /users | 유저 생성 |
| PUT | /users/1 | ID=1 유저 전체 수정 |
| PATCH | /users/1 | ID=1 유저 일부 수정 |
| DELETE | /users/1 | ID=1 유저 삭제 |
RESTful API의 장단점
장점
- URL 구조가 직관적이고 이해하기 쉬움
- HTTP 표준을 따르므로 범용성이 높음
- 프론트엔드/백엔드 분리에 유리함
단점
- 복잡한 트랜잭션 처리에 불리
- 실시간 통신에 부적합 (이럴 땐 WebSocket이나 GraphQL이 적합)
데이터베이스
데이터베이스
여러 사용자 및 프로그램에서 사용하기 위해 저장 및 관리하는 데이터 집합
구성 요소
- 개체(entity): 데이터로 표현하려는 대상
- 속성(attribute): 개체의 특성 및 상태
- 관계(relationship): 개체 간 관계
관계형 데이터베이스
- 테이블을 이용해 데이터의 종속성과 구조를 나타내는 데이터베이스
- 스키마: 데이터의 구조와 표현 방식, 제약 조건 등을 정의해 데이터베이스의 전체적인 구조를 나타냄
- 릴레이션: 데이터베이스에서 데이터의 개념적 모델
- 테이블: 릴레이션을 실제로 구현한 개체로, 행과 열로 관례형 데이터베이스를 구성함
- 튜플: 테이블의 행에 해당하는 데이터 묶음으로, 레코드라고도 함
- 속성: 테이블의 열에 해당하고 이름과 타입을 가짐, 필드라고도 함
NoSQL 데이터 베이스
- 비관계형 데이터베이스로, 다양한 형태의 데이터를 저장함
- 대용량 데이터 조회 시 속도가 빠르고 수평적 확장성이 좋음
키
데이터베이스에서 튜플을 구분하기 위한 속성 또는 속성의 집합
무결성
데이터베이스의 데이터와 현실의 데이터가 일치하는 정확성과 데이터의 일관성을 의미함
- 개체 무결성: 모든 테이블이 NULL 값이 아닌 기본 키를 가져야 함
- 도메인 무결성: 테이블의 속성 값은 도메인에 속해야 함
- 참조 무결성: 외래 키의 값은 참조하는 테이블의 기본 키 값과 동일하거나 NULL이어야 함
인덱스
튜플 검색 성능을 높이기 위해 속성 값과 튜플이 저장된 주소를 저장하는 것
장점: 정렬된 상태를 유지해 데이터 검색 속도를 향상함
단점:
인덱스 테이블을 저장하기 위한 저장 공간이 따로 필요하고 데이터 추가/수정/삭제 시 속도가 느림
삭제 연산 시 인덱스 테이블에는 값이 남아서 불필요한 데이터가 남게 됨
트랜잭션
데이터베이스의 상태를 바꾸기 위해 수행하는 작업의 단위
특성: Atomic Consistency Isolation Durability(원자성, 일관성, 독립성, 영속성)
TCL: 트랜잭션을 제어하는 데 사용하는 명령어의 집합
COMMIT: 트랜잭션의 정상 종료, 데이터베이스에 변경 사항 반영
ROLLBACK: 트랜잭션의 비정상 종료, 데이터베이스를 이전 상태로 되돌림
SAVEPOINT: 트랜잭션의 특정 지점 지정
락
트랜잭션이 처리되는 순서를 보장해 데이터베이스의 무결성을 유지하려고 사용함
공유 락: 데이터를 읽는 락, 여러 공유 락이 동시에 접근 가능
베타 락: 데이터를 수정하는 락, 하나의 베타 락이 처리 중일 때 다른 베타 락이 동시 접근 불가능
조인
여러 테이블을 합쳐 원하는 데이터를 얻으려는 작업
내부 조인: 2개 이상의 테이블에서 공통되는 속성을 가진 데이터를 검색하기 위한 연산
외부 조인: 테이블에서 조인 조건에 해당하는 속성 값이 없는 데이터까지 모두 조회하는 연산