실행 파일이 메모리에 로드 → 프로그램(수동적)이 프로세스(능동적)가 됨
프로세스 메모리 배치
Process State
- new : 프로세스가 생성됨 (컴파일한 후 디스크에 저장)
- running : CPU를 받아서 수행 중인 프로세스
- waiting : I/O와 같은 이벤트가 일어나기를 기다림
- ready : 프로세스가 CPU가 할당되기를 기다리는 상태
- terminated : 프로세스 실행 완료
Diagram of Process State
- new → ready : disk에서 메인 메모리로 이동
- ready → running : scheduler dispatch(준비 상태의 프로세스 중 하나를 선택하여 실행시킴) 수행
- scheduler : 메인 메모리에서 누구를 선택할 것인가
- dispatcher : 스케줄러에게 선택된 process에게 CPU를 넘겨주는 모듈
- running → ready : 수행을 마치고 interrupt 발생
- running → waiting : I/O나 이벤트를 기다림
- waiting → ready : I/O나 이벤트가 끝남
Process Control Block (PCB)
- PCB = Context, 프로세스에 대한 정보를 가지고 있는 메모리 구조체
- 각 프로세스와 관련된 정보로 프로세스가 생성될 때마다 만들어지며 메인 메모리 안에 있다.
- Process state – running, waiting, etc
- PC – 다음에 실행할 명령어의 위치
- CPU register – 모든 프로세스 중심 레지스터의 내용
- CPU scheduling 정보 - 우선 순위, 스케줄링 대기열 포인터
- 메모리 관리 정보 – 프로세스에 할당된 메모리
- Accounting 정보 – 사용된 CPU, 시작 후 경과된 클럭 시간, 제한 시간
- I/O status 정보 – 프로세스에 할당된 I/O 장치, 열려 있는 파일 목록
CPU Switch From Process to Process
Context(PCB) Switch → 짧아야 하기 때문에 assembly language로 구성됨
Process Scheduling
- CPU 사용을 극대화하고 시간 공유를 위해 CPU를 프로세스에 신속하게 할당
- Process scheduler는 CPU에서 다음 실행을 위해 사용 가능한 프로세스 중에서 선택함
- 프로세스의 scheduling queues 유지
- Job queue – 시스템의 모든 프로세스 집합 (disk 안에서 메인 메모리에 들어가기를 기다리는 프로세스들)
- Ready queue – 메인 메모리 안에 있는 모든 프로세스, 실행 준비 및 대기 (메인 메모리로 들어온 CPU를 기다리는 프로세스들을 담고 있는 큐)
- Device queues – I/O 장치를 기다리는 프로세스들
- 다양한 queue 사이에서 프로세스 이동
Queueing diagram
- ready queue → CPU : CPU를 할당 받아 running 상태로 바뀜
- I/O request → I/O queue : waiting 상태로 바뀌어 I/O를 기다림
- I/O → ready queue : I/O가 끝나고 ready 상태로 바뀌어 CPU 할당을 기다림
- time slice expired → ready queue : 주어진 시간을 사용하고 ready 상태로 바뀜
- fork a child → child executes : 중간에 ready queue로 가 CPU를 할당 받는 과정 존재
- child 프로세스를 만들고 child의 종료를 기다리는 동안 ready queue에 놓임
- wait for an interrupt → interrupt occurs : waiting 상태에서 interrupt 발생을 기다림
- interrupt occurs → ready queue : 인터럽트 발생 후 ready 상태로 바뀌어 CPU 할당을 기다림
- I/O request → I/O queue : waiting 상태로 바뀌어 I/O를 기다림
Schedulers
Short-term scheduler (CPU scheduler)
- ready queue에 있는 프로세스 중 누구에게 CPU를 줄 것인지 결정
- 자주 실행됨 → milliseconds 시간 빠름
Long-term scheduler (job scheduler)
- job queue에서 어떤 프로세스를 ready queue, 메인 메모리로 올릴 것인지 결정
- MM가 disk보다 용량이 작으므로 수행되며, 실행되는 주기가 길다.
- multiprogramming의 정도를 결정한다. (I/O process와 CPU-bound process의 개수를 적절하게 조절해주는 역할)
I/O-bound process - CPU 사용 시간이 짧고, 대부분을 I/O 기다리는 시간에 사용한다.
- 메모리에 I/O process의 수가 많아진다면, ready queue가 금방 비게 되므로 CPU 효율이 낮아진다.
CPU-bound process - 대부분 CPU 사용하는 시간에 소비한다.
- 메모리에 CPU 프로세스가 많아진다면, I/O device가 놀게 되고, device queue가 비게 된다.
두 프로세스들이 동시에 존재할 때, I/O process를 CPU process보다 먼저 수행해야 한다!
- 이유 : I/O process가 CPU를 조금만 사용하고 빨리 수행하기 때문이다.
Medium-term scheduler
- Process가 많아지면 CPU를 가지고 경쟁함 → 필요 없는 애들을 swap out 하여 disk에 둠 → MM에 process의 개수가 줄어든다.
- multiprogramming의 정도를 완화할 때 사용한다.
Context(PCB) Switch
- CPU가 어떤 프로세스에서 다른 프로세스로 바뀔 때 저장, 복원되는 과정을 의미한다.
- Context Switch 시간은 일종의 overhead로 짧아야 좋다.
- CPU quantum (time-slice)
- CPU quantum ↓ : context switch overhead ↑ 비효율적
- CPU quantum ↑ : 수행시간이 짧은 프로세스가 긴 수행시간을 가지는 프로세스를 기다리게 된다.
Process Creation
- 상위 프로세스는 하위 프로세스를 생성, 이 프로세스는 다른 프로세스를 생성하여 프로세스 트리를 형성
- 일반적으로 프로세스 식별자(pid)를 통해 프로세스를 식별하고 관리
- 리소스 공유 옵션
- parent 및 child가 모든 리소스를 공유
- child가 parent 리소스의 부분 집합과 공유
- parent 및 child가 리소스를 공유하지 않음
- 실행 옵션
- parent 및 child가 동시에 실행됨
- parent는 child가 종료될 때까지 대기
fork() : parent가 child 프로세스를 생성한다.
exec() : child를 완전히 다른 프로그램으로 바꿔준다. (child process를 생성시키는 것이 아님)
wait() : parent는 wait를 호출하여 child가 끝날 때까지 기다린다. (동기화를 시켜준다)
Process Termination
- 프로세스는 마지막 문을 실행한 다음 exit() 시스템 콜을 사용하여 운영 체제에 삭제를 요청
- wait()를 통해 child에서 parent로 상태 데이터를 반환
- 프로세스의 리소스가 운영 체제별로 할당 해제됨
- parent는 abort() 시스템 호출을 사용하여 child process의 실행을 종료
- child가 할당된 리소스를 초과했을 때
- child에 할당된 작업은 더 이상 필요하지 않을 때
- parent가 종료된 경우
- 일부 운영 체제에서는 parent가 종료된 경우 child의 존재를 허용하지 않음 (프로세스가 종료되면 모든 child 프로세스도 종료되어야 함)
- 연쇄적 종료 : 모든 자녀, 손주 process가 종료됨
- 종료는 운영 체제에 의해 시작됨
- parent 프로세스는 wait() 시스템 콜을 사용하여 child 프로세스가 종료될 때까지 기다릴 수 있다. 시스템 콜은 종료된 프로세스의 상태 정보와 pid를 반환함. pid = wait(&status);
- 대기 중인 parent가 없는 경우(wait()를 호출하지 않은 경우) 프로세스가 zombie
- 대기를 호출하지 않고 parent가 종료된 경우 프로세스는 orphan
- child process의 메모리가 필요없는데 존재하는 문제가 생김
Interprocess Communication(IPC)
- 프로세스들 사이에서 서로 데이터를 공유하는 통신
- 프로세스가 협력해야 하는 이유
- 정보 공유 : 여러 프로그램이 동일한 정보를 사용할 수 있음
- 계산 속도 향상
- 모듈화
- 편리
- IPC의 두 가지 모델
- 공유 메모리
- 메시지 전달
(a) message passing
- 사용자 간의 동기화가 필요 없다.
- 종류
- message queue
- 같은 머신에서 두 프로세스 간의 통신으로 send와 receive로 보내고 받음
- 공유 메모리가 필요 없다.
- 시스템 콜을 호출하기 때문에 kernel의 간섭이 있고, overhead가 많은 편
- Socket
- 여러 머신에서의 통신
- message queue
(b) shared memory
- 처음에 attach, 마지막에 detach, 시스템 콜이 필요 없다.
- 사용자가 직접 동기화를 수행해야 함
- 사용자 프로세스가 공유 메모리에 액세스할 때 작업을 동기화할 수 있는 메커니즘을 제공
- shmget : 공유 메모리 공간 할당, shmat(buffer) : 공유 메모리를 attach
- cache coherency (캐시 일관성)
- core가 많을 때, 캐시에 있는 데이터가 일관되지 못하게 되는 문제가 일어나 overhead가 발생한다.
- 따라서 동기화가 필요하다! 동기화하지 않으면 garbage 값이 나올 수 있다.
Producer-Consumer Problem
unbounded-buffer - 무한히 큰 버퍼의 크기를 가정
bounded-buffer - 한정된 버퍼의 크기를 가정
- Producer : 버퍼가 다 찼을 경우 기다려야 한다. 동기화 문제
- Consumer : 읽어낼 내용이 없을 경우 Producer가 내용을 넣을 때까지 기다려야 한다.
Synchronization
- Blocking - 동기식
- Blocking send - 보내고 수신될 때까지 다음 명령어가 수행되지 않는다.
- Blocking receive - 데이터가 들어올 때까지 다음 명령어가 수행되지 않는다.
- Non-Blocking - 비동기식
- Non-Blocking send - 보내고 동시에 다른 일을 수행 가능하다.
- Non-Blocking receive - 데이터가 들어올 때까지 기다릴 필요가 없다.
참고 자료 : Operating System Concepts - 10th edition, Sliberscahatz, Galvin and Gagne
'CS > 운영체제' 카테고리의 다른 글
운영체제 ch 7. Synchronization Examples (0) | 2023.05.02 |
---|---|
운영체제 ch 6. Synchronization Tools (0) | 2023.04.18 |
운영체제 ch 5. CPU Scheduling (0) | 2023.04.12 |
운영체제 ch 2. OS 구조 (0) | 2023.04.09 |
운영체제 ch 1. Introduction (0) | 2023.04.07 |