1. 운영체제 및 커널 개요
- 운영체제(Operating System)
- 데스크탑(Windows, macOS, Linux)과 모바일(iOS, Android) 등 다양한 종류가 존재함
- 응용 프로그램에 필요한 자원(데이터, 하드웨어 부품)을 할당 및 관리함
- 커널(Kernel)
- 운영체제의 핵심 기능 담당
- 두 가지 핵심 기능
- 자원 할당 및 관리
- 프로세스 및 스레드 관리
2. 시스템 콜과 이중 모드
운영체제의 메모리 적재
- 운영체제도 하나의 프로그램이며, 메모리에 적재되어야 실행 가능
- 응용 프로그램과 다르게 커널 영역이라는 전용 공간에 적재
- 응용 프로그램이 적재되는 공간은 사용자 영역
- 사용자 영역에서는 CPU, 메모리 등 주요 자원에 직접 접근 불가
- 응용 프로그램이 운영체제의 기능을 사용하려면 시스템 콜을 호출해야 함
시스템 콜 (System Call)
- 응용 프로그램이 운영체제의 서비스를 요청하는 함수 형태의 인터페이스
- 실행 방식:
1. 응용 프로그램이 시스템 콜 호출
2. 소프트웨어 인터럽트 발생 → CPU가 현재 작업 백업
3. 커널 모드로 전환 → 운영체제 코드 실행
4. 실행 완료 후 다시 사용자 모드로 복귀
- 시스템 콜을 통해 파일 시스템 접근, 프로세스 생성, 네트워크 통신 등 수행 가능

이중 모드 (Dual Mode)
- CPU가 사용자 모드와 커널 모드로 구분되어 실행
- 사용자 모드
- 응용 프로그램 실행
- 제한된 명령어만 실행 가능
- 직접적인 자원 접근 불가 (시스템 콜을 통해 접근)
- 커널 모드
- 운영체제 실행
- 모든 명령어 실행 가능
- 하드웨어 및 시스템 자원 직접 관리
- 시스템 콜 호출 시 사용자 모드 ↔ 커널 모드 전환이 빈번하게 발생
3. 자원 할당 및 관리
- 시스템 자원(System Resource)
- 프로그램 실행에 필요한 요소(데이터와 하드웨어 부품)를 의미함
- CPU, 메모리, 보조기억장치 등 컴퓨터의 핵심 부품 포함
- 운영체제의 역할
- 응용 프로그램 대신 자원에 접근하여 효율적으로 관리함
- 응용 프로그램이 자원을 문제 없이 할당받아 실행되도록 지원함
- 주요 관리 대상
- CPU 관리: CPU 스케줄링
- 한정된 CPU 자원을 여러 프로그램이 공정하고 합리적으로 사용하도록 순서 및 사용 시간을 결정함
- 우선순위, 스케줄링 큐, 선점형/비선점형 알고리즘 적용
- 메모리 관리: 가상 메모리
- 다수의 실행 프로그램을 메모리에 적재하고 불필요한 메모리 낭비 없이 관리함
- 물리적 메모리보다 큰 메모리 사용을 가능하게 하는 가상 메모리 기법 적용
- 물리 주소와 논리 주소, 페이징, 페이지 교체 알고리즘 등으로 구성됨
- 파일/디렉터리 관리: 파일 시스템
- 보조기억장치의 정보를 파일 및 폴더(디렉터리) 단위로 체계적으로 관리함
- 정리되지 않은 상태에서는 원하는 데이터를 찾기 어려움
- 입출력 장치 및 캐시 메모리 관리
- 입출력 장치 드라이버, 인터럽트 서비스 루틴, 캐시 일관성 유지 등으로 지원함
4. 프로세스와 스레드
프로세스(Process)
- 실행 단위: 프로그램이 메모리에 적재되어 실행되는 단위
- 유형:
- 포그라운드: 사용자와 직접 상호작용
- 백그라운드: 사용자 눈에 보이지 않는 작업 수행 (데몬/서비스)
- 메모리 배치:
- 커널 영역: PCB(프로세스 제어 블록) 등 운영체제 관리 정보 저장
- 사용자 영역:
- 코드 영역: 실행 가능한 명령어(읽기 전용)
- 데이터 영역: 초기값이 있는 정적 변수, 전역 변수 저장
- BSS 영역: 초기값이 없는 정적 변수 저장
- 힙 영역: 동적 메모리 할당 영역 (개발자가 직접 관리)
- 스택 영역: 함수 호출 시 생성되는 매개변수, 지역 변수, 복귀 주소 등 저장
PCB와 문맥 교환
- 프로세스 제어 블록(PCB)
- 저장 정보: PID, 프로세스 상태, 레지스터 값, 메모리 배치, 입출력 관련 정보
- 관리 방식: 여러 PCB는 프로세스 테이블로 관리되며, 프로세스 생성/종료 시 추가/삭제됨
- 문맥 교환 (Context Switching)
- 동작 과정:
1. 현재 프로세스의 문맥(레지스터, 프로그램 카운터 등)을 PCB에 저장
2. 다음 프로세스의 PCB에서 문맥을 복구하여 실행
프로세스 상태
- 프로세스 상태(Process States)
- 생성 상태 (new): 프로세스를 생성 중인 상태로, 메모리에 적재되어 PCB를 할당받은 상태
- 준비 상태 (ready): CPU 할당 대기 중인 상태. 준비 상태인 프로세스는 디스패치(dispatch)를 통해 실행 상태로 전환됨
- 실행 상태 (running): CPU를 할당받아 실행 중인 상태. 일정 시간 동안만 실행되고 타이머 인터럽트 발생 시 다시 준비 상태로 전환됨
- 대기 상태 (blocked): 입출력 요청 등으로 인해 곧장 실행할 수 없는 상태. 입출력 작업 등이 완료되면 다시 준비 상태로 전환됨
- 종료 상태 (terminated): 프로세스가 종료된 상태로, 종료 후 PCB와 사용한 메모리를 운영체제가 정리함

- 블로킹 입출력 (Blocking I/O)과 논블로킹 입출력 (Non-blocking I/O)
- 블로킹 입출력 (Blocking I/O)
- 대기 상태로 접어들고, 입출력 작업이 완료되면 준비 상태가 되어 실행을 재개
- 논블로킹 입출력 (Non-blocking I/O)
- 출력 장치에게 입출력 작업을 맡긴 뒤, 곧바로 이어질 명령어를 실행

멀티프로세스 vs. 멀티스레드
- 멀티프로세스
- 각 프로세스는 독립적으로 실행되어 자원을 별도로 할당받음
- 한 프로세스에 문제가 생겨도 다른 프로세스에 영향을 미치지 않음
- 예시: 웹 브라우저의 각 탭이 별도 프로세스로 실행
- 멀티스레드
- 하나의 프로세스 내 여러 스레드가 동시에 실행됨
- 스레드들은 프로세스의 자원(코드, 데이터, 힙 등)을 공유
- 장점: 자원 공유를 통한 빠른 협력과 통신
- 단점: 한 스레드의 오류가 전체 프로세스에 영향을 줄 수 있음
스레드 생성과 조인
- 스레드 생성
- 각 스레드는 동일 프로세스의 PID를 공유하지만 고유의 스레드 ID, 프로그램 카운터, 스택 등 개별 실행 정보 보유
- 프로그래밍 언어(C/C++, 자바, 파이썬, Go 등)에서 스레드 생성 및 관리 지원
- 스레드 조인 (Thread Join)
- 생성한 스레드가 종료될 때까지 호출한 스레드(예: main 스레드)가 대기
- 모든 스레드가 종료된 후에야 이후 작업이 진행되도록 함
5. 프로세스 간 통신 (IPC)
- 공유 메모리 (Shared Memory)
- 여러 프로세스가 공통 메모리 영역을 할당받아 데이터를 직접 읽고 쓰며 통신하는 방식
- 프로세스 A가 공유 메모리 영역에 데이터를 쓰면, 프로세스 B는 해당 영역에서 데이터를 읽음
- 시스템 콜을 통해 공유 메모리 영역을 확보하거나, 파일과 같이 공유 가능한 자원을 활용 가능
- 커널 개입 없이 직접 메모리 접근이 이루어져 통신 속도가 빠름
- 다만, 여러 프로세스가 동시에 접근할 경우 데이터 일관성이 훼손될 위험(레이스 컨디션) 존재
- 메시지 전달 (Message Passing)
- 데이터를 커널을 거쳐 송수신하는 통신 방식
- 송신 측과 수신 측이 명확히 구분되어 있으며, 대표적으로 send()와 recv() 시스템 콜을 사용
- 주요 수단:
- 파이프 (Pipe): 단방향 통신 도구
- 익명 파이프: 부모-자식 간 통신에 주로 사용
- 지명 파이프: 임의의 프로세스 간 양방향 통신 지원
- 시그널 (Signal): 비동기 이벤트 알림을 통해 통신 수행
- 다양한 시그널(SIGCHLD, SIGILL, SIGINT, SIGKILL, SIGSEGV, SIGTERM, SIGUSR1, SIGUSR2)을 활용하여 프로세스 간 이벤트를 전달
- 프로세스는 시그널이 발생하면 기존 작업을 중단하고, 미리 정의된 시그널 핸들러를 실행한 후 다시 작업을 재개함
- 소켓 (Socket)
- 원격 프로시저 호출 (RPC): 원격 프로세스의 코드를 실행하는 방식으로, 플랫폼에 관계없이 메시지 송수신 가능
- 메시지 전달은 커널의 개입으로 인해 동기화나 레이스 컨디션 문제를 상대적으로 덜 고려하지만, 통신 속도는 공유 메모리 방식에 비해 느림

6. 동기화 및 스레드 안전
- 동기화 (Synchronization)
- 여러 프로세스 또는 스레드가 공유 자원에 동시에 접근할 때, 임계 구역(critical section)에서 발생하는 문제를 방지하기 위한 기법
- 주요 목적:
- 실행 순서 제어: 프로세스 및 스레드의 올바른 순서 실행
- 상호 배제(Mutual Exclusion): 동시에 접근 불가 자원에 대해 단일 접근 보장
- 동기화 기법
- 뮤텍스 락(Mutex Lock)
- 임계 구역에 들어가기 전 반드시 락(acquire) 획득, 작업 종료 후 락(release) 해제
- 단일 자원에 대한 상호 배제를 보장
- 세마포 (Semaphore)
- 공유 자원의 사용 가능 개수를 나타내는 변수(S)를 기반으로 동기화를 수행
- wait() 함수: 임계 구역 진입 전 S 값을 감소시키며, S가 음수면 대기 상태 진입
- signal() 함수: 임계 구역 종료 후 S 값을 증가시키고, 대기 중인 프로세스 깨움
- 조건 변수와 모니터 (Condition Variable & Monitor)
- 조건 변수는 특정 조건 만족 시까지 대기(wait)하고, 조건 만족 시 signal을 통해 실행 재개
- 모니터
공유 자원과 이를 다루는 인터페이스(공유 자원 연산)를 하나로 묶어, 상호 배제와 실행 순서 제어를 자동화하는 동기화 도구

- 스레드 안전 (Thread Safety)
- 멀티스레드 환경에서 동시에 여러 스레드가 변수나 함수, 객체에 접근해도 문제 없이 동작하는 상태
- Vector 클래스는 스레드 안전성이 보장되는 반면, ArrayList는 그렇지 않음
7. 교착 상태 (Deadlock)
- 교착 상태 (Deadlock)
- 여러 프로세스가 서로가 보유한 자원을 기다리며 실행이 정지되는 현상
- 시스템 자원 회수와 프로세스 진행에 심각한 영향을 미침
- 교착 상태 발생 조건
1. 상호 배제 (Mutual Exclusion)
2. 점유와 대기 (Hold and Wait)
3. 비선점 (No Preemption)
4. 원형 대기 (Circular Wait)
- 교착 상태 해결 방법
- 예방(Prevention): 4가지 조건 중 하나라도 성립하지 않도록 자원 할당 방식을 설계
- 회피(Avoidance): 교착 상태가 발생하지 않을 정도로 자원을 제한적으로 할당
- 검출 후 회복(Detection and Recovery): 주기적으로 교착 상태 여부를 검사하고, 발생 시 자원 선점이나 프로세스 강제 종료 등으로 회복
참고
_이것이 취업을 위한 컴퓨터 과학이다 with CS 기술 면접 – 한빛미디어_