1. 운영체제의 큰 그림
- 커널: 운영체제의 핵심 기능을 담당하는 부분
- 운영체제는 응용 프로그램 대신 컴퓨터 부품에 접근해 효율적으로 사용되도록 관리하고 이러한 자원들을 다시 응용 프로그램에게 할당함
1) 운영체제의 역할
(1) 자원 할당 및 관리
- 자원: 프로그램 실행에 필요한 요소
ex. 데이터, 컴퓨터 핵심 부품
- CPU, 메모리, 파일/디렉터리와 같은 자원을 할당하고 관리함
(2) 프로세스 및 스레드 관리
- 프로세스: 실행 중인 프로그램을 지칭
- 스레드: 프로세스를 이루는 실행의 단위
동시다발적으로 실행되는 프로세스와 스레드를 올바르게 처리할 수 있도록 실행순서를 제어하고 요구자원을 적절하게 배분함
2) 시스템 콜과 이중 모드
- 커널 영역: 운영체제가 적재되는 영역
- 사용자 영역: 사용자 응용 프로그램이 적재되는 영역
- 시스템 콜: 소프트웨어 인터럽트의 일종으로 응용 프로그램의 자원 접근 및 조작을 대행하는 운영체제 코드를 실행할 수 있는 방법
- 커널 모드: 커널 영역에 적재된 코드를 실행할 때의 실행 모드
- 사용자 모드: 사용자 영역에 적재된 코드를 실행할 때의 실행 모드
- 이중 모드: 위 2개의 모드로 구분하여 실행하는 것
2. 프로세스와 스레드
1) 프로세스를 구성하는 메모리 정보
(1) 커널 영역
- 프로세스 제어 블록(PCB)
- 프로세스를 식별할 수 있는 정보
- 프로세스 테이블 형태로 관리되며 추가/삭제를 통해 자원 할당/해제함
(2) 사용자 영역
- 정적 할당 영역: 코드 영역, 데이터 영역
- 동적 할당 영역: 힙 영역, 스택 영역
- 데이터 영역
- 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
- 정적 변수, 전역 변수
- 힙 영역
- 사용자가 직접 할당 가능한 저장공간
- 메모리 누수 발생 위험이 있음
- 이를 해결하기 위해 가비지 컬렉션 기능을 제공하기도 함
- 스택 영역
- 일시적으로 사용할 값들이 저장되는 공간
- 매개변수, 지역변수, 스택 트레이스 형태의 함수 호출 정보 등
- 스택 트레이스: 특정 시점에 스택 영역에 저장된 함수 호출 정보
2) 프로세스
(1) 프로세스 실행과정
- 프로세스가 실행된다 = 운영체제에 의해 CPU의 자원을 할당받았다
- 프로세스는 타이머 인터럽트에 의해 정해진 시간만큼 CPU를 사용
- 프로세스를 다시 수행하기 위해 중간 정보를 백업
- 백업된 정보를 PCB에 명시하고 다음 프로세스의 중간 정보를 백업
- 문맥: 프로세스 수행 재개를 위해 기억해야 할 정보
- 문맥교환: 기존 프로세스의 문맥을 PCB에 백업하고 PCB에서 문맥을 복구하여 새로운 프로세스를 실행하는 것
(2) 프로세스 상태
- 생성 상태
- 프로세스를 생성 중으로 메모리에 적재되어 PCB를 할당받은 상태
- 생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 준비 상태가 됨
- 준비 상태
- CPU 할당을 받는 것을 기다리고 있는 상태
- 준비 상태인 프로세스가 CPU 할당받으면 실행 상태가 됨
- 디스패치: 준비 상태인 프로세스가 실행 상태로 전환되는 것
- 실행 상태
- CPU를 할당받아 실행 중인 상태로 일정 시간 동안 CPU 사용 가능한 상태
- 타이머 인터럽트가 발생하며 할당된 시간을 모두 사용하면 준비 상태로 전환
- 실행 중 입출력장치를 사용해 입출력장치의 작업이 끝날 때까지 기다려야 하면 대기 상태로 전환
- 대기 상태
- 프로세스가 입출력 작업을 요청하거나 바로 확보할 수 없는 자원을 요청하는 등 바로 실행히 불가한 조건에 놓이는 경우의 상태
- 실행 가능한 상태가 되면 준비 상태가 됨
- 종료 상태
- 프로세스가 종료된 상태
- 운영체제가 PCB, 프로세스가 사용한 메모리를 정리
3) 멀티프로세스와 멀티스레드
(1) 멀티프로세스
- 동시에 여러 프로세스가 실행되는 것
- 자원 공유X: 독립적으로 실행하며 다른 프로세스에 문제가 발생해도 지장이 없거나 적음
(2) 멀티스레드
- 프로세스를 동시에 실행하는 여러 스레드
- 자원 공유: 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하며 협력 및 통신이 가능
4) 프로세스 간 통신
(1) 공유 메모리
- 공유하는 메모리 영역을 토대로 데이터를 주고받는 통신 방식
- 자신에게 할당된 메모리 공간처럼 사용하며 통신 속도가 빠름
- 데이터의 일관성이 훼손되는 레이스 컨디션이 발생할 수 있음
- 레이스 컨디션: 프로세스 또는 스레드가 동시에 임계 구역의 코드를 실행하여 문제가 발생하는 상황
- 임계 구역: 공유 자원에 접근하는 코드 중 동시에 실행했을 때 문제가 발생할 수 있는 코드
(2) 메시지 전달
- 프로세스 간 데이터가 커널을 거쳐 송수신되는 통신 방식
- 파이프, 시그널, 소켓, 원격 프로시저 호출 등이 있음
- 파이프
- 단방향 프로세스 간 통신 도구
- 양방향으로 사용할 경우 읽기용, 쓰기용 2개를 활용
- 시그널
- 프로세스에게 특정 이벤트가 발생했음을 알리는 비동기적 신호
- 시그널 발생 시 하던 일을 잠시 중단
- 시그널 처리를 위해 시그널 핸들러 실행 뒤 실행을 재개
- 원격 프로시저 호출(PRC)
- 원격 코드를 실행하는 IPC 기술
- 프로그래밍 언어나 플랫폼과 무관하게 성능 저하를 최소화하고 메시지 송수신이 가능하므로 대규모 트래픽 처리환경, 서버 간 통신 환경에서 주로 사용
3. 동기화와 교착 상태
1) 동기화
- 레이스 컨디션을 방지하면서 임계 구역을 관리하기 위해 실행 순서 제어, 상호 배제를 준수하며 실행하는 것
(1) 동기화 조건
- 실행 순서 제어: 프로세스 및 스레드를 올바른 순서로 실행
- 상호 배제: 동시 접근이 불가한 자원에 하나의 프로세스 및 스레드만 접근
(2) 동기화 기법
- 뮤텍스 락
- 동시 접근이 불가한 자원에 동시 접근할 수 없도록 상호 배제를 보장하는 동기화 도구
- 한번에 하나의 프로세스 및 스레드만 공유 자원을 이용할 수 있도록 하는 데에 적합
- 세마포
- 하나의 공유 자원을 고려하는 동기화 도구
- 공유자원이 여러 개 있는 상황에서 동기화 가능
- 모니터
- 공유 자원과 그 공유 자원을 다루는 함수로 구성된 동기화 도구
- 상호 배제뿐만 아니라 실행 순서 제어 동기화도 가능
- 스레드 안전
- 멀티스레드 환경에서 어떤 변수나 함수, 객체에 동시 접근이 이루어져도 실행에 문제가 없는 상태
- 어떤 함수가 스레드 안전하다면 여러 스레드에 의해 호출되어도 레이스 컨디션이 발생하지 않음
2) 교착 상태
- 일어나지 않을 사건을 기다리며 프로세스의 진행이 멈춰 버린 현상
- 한정된 자원의 무분별한 할당으로 인해 발생하는 문제
(1) 교착 상태 발생 조건
다음과 같은 4개의 조건이 모두 만족했을 때 발생 가능성이 생김
-
상호 배제: 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때 발생할 수 있음
-
점유와 대기: 한 프로세스가 어떤 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다릴 때 발생할 수 있음
-
비선점: 해당 자원을 이용하는 프로세스의 작업이 끝날 때까지 대기해야 할 때 해당 자원을 강제로 빼앗지 못하는 경우 발생할 수 있음
-
원형 대기: 프로세스와 프로세스가 요청한 자원의 원의 형태를 이룰 때 발생할 수 있음
(2) 교착 상태 해결법
- 예방: 교착 상태 발생 조건 중 하나를 만족시키지 못하게 함
- 회피: 프로세스에 할당할 수 있는 자원이 충분한 상태에서 적은 프로세스에게 자원을 할당
- 검출 후 회복: 교착 상태 검출 시 자원 선점을 통해 회복시키거나 교착 상태에 놓인 프로세스를 강제 종료함으로써 회복시킴