I. Program과 Process의 차이
A. Program
디스크에 존재하는 실행 가능한 프로그램
B. Process
커널에 의해 메모리에 로드되고 실행중인 프로그램
Execution과 Scheduling의 기본 단위
고유한 PID를 부여 받음
Dynamic 하며 Active한 Entity
II. Process Address Space
Process가 생성 될 때 PCB가 생기고 Address Space를 부여 받게 되는데 Address Space의 구조는 다음과 같다.
A. Stack 영역: 함수 수행에 필요한 정보가 담기는 메모리 영역
B. Heap 영역: 동적 메모리 할당 시 필요한 메모리 영역
C. Static Data 영역: 상수, 전역변수 등이 저장되는 메모리 영역
D. Code 영역: Instruction이 저장되는 메모리 영역
III. Process State(상태)
A. New: 처음 프로세스를 만들고 초기화하는 상태(이 때 PCB가 만들어지고 PID를 부여 받는다)
B. Ready: 프로세스 초기화가 완료되고, 스케줄러에 의해 선택되어 CPU를 점유하기를 기다리는 상태
C. Running: 스케줄러에 의해 선택된 프로세스가 CPU를 점유중인 상태 (Time-Sharing에 의해 Timer Interrupt가 발생하면 Ready 상태로 변경되기도 한다.)
D. Waiting: I/O가 발생하여 I/O 작업이 끝나기를 기다리는 상태
E. Terminated: 더 이상 처리할 작업이 없는 상태
IV. PCB란
Process란 하나 혹은 그 이상의 Thread로 실행되는 컴퓨터 프로그램의 Instance이다. Process는 자신에 관한 정보를 하나의 데이터 구조(구조체)에 저장하여 관리하고 이를 Process Control Block이라고 부른다. 즉 PCB(Process Control Block)란 프로세스에 대한 상태 정보가 기록된 메타 데이터이며 운영체제가 프로세스 관리를 하기 위해 사용된다. 하나의 Process당 하나의 PCB만 가질 수 있으며, 운영체제에 의해 CPU 상에서 Context Switching이 발생할 때 현재 작업중인 프로세스의 상태 정보를 PCB에 저장해두고 새로 작업을 수행할 프로세스의 PCB에서 상태정보를 로드 한다.
V. Context Switching (CPU Switching)
Multiprogramming, Time-Sharing에 의해 CPU는 특정 프로세스를 처리 하는 도중 중단하고 다른 프로세스를 처리 해야 한다. 즉 운영체제가 CPU를 점유하는 프로세스를 교체하는 것을 Context Switching (CPU Switching)이라고 한다. 프로그래밍에서 Context는 (동작, 작업들의 집합)을 (정의, 관리, 실행)하도록 하는 (최소한의 상태, 재료, 속성)을 포함하는 (객체, 구조체, 정보)이다.
Context Switching(CPU Switching)은 무조건 좋은 것은 아니다. 1초에 100번에서 1000번 정도 발생하기 때문에 이로 인한 오버헤드가 분명히 존재한다. 하지만 하드웨어의 성능에 따라 이러한 오버헤드는 큰 리스크가 아닐 수 있다.
VI. Context Switching의 과정
A. Process0가 실행중일 때 인터럽트가 발생하거나 시스템 콜이 발생하면 OS가 PCB0에 Process0에 관한 상태 정보를 저장
B. PCB1에서 Process1의 상태를 Load
C. Process1 실행 (Running State로 변환)
D. 인터럽트 or 시스템 콜 발생시 PCB1에 Process1의 상태를 저장
E. PCB0로부터 Process0의 상태를 Load
F. 아무것도 실행되지 않는 구간은 IDLE Process 수행
VII. Scheduling의 종류
A. Short-Term Scheduling
Ready Queue에 존재하는 어떤 프로세스가 CPU를 점유할지를 결정하는 스케줄러이다.
B. Long-Term Scheduling
디스크에 존재하는 프로그램 중 어떤 프로그램을 메모리에 로드(Swap-In) 하여 프로세스로 만들지 결정하는 스케줄러이다. (프로세스는 Ready Queue에 들어가게 된다)
(ex – 현재 가용 가능한 메모리는 8GB, 메모리에 로드 해야 하는 프로그램은 8개, 각각 2GB)
C. Medium-Term Scheduler
메모리 자원을 할당 받은 프로세스들 중 어떤 프로세스를 디스크로 내릴지(Swap-Out) 결정하는 스케줄러이다.
VIII. Ready Queue와 Waiting Queue의 차이점
Waiting Queue는 Ready Queue와는 다르게 프로세스가 필요한 I/O작업을 수행하는 I/O 디바이스를 기준으로 Queue가 나뉘어서 존재한다.
IX. 프로세스 관련 System Call
A. fork()
부모 프로세스와 똑같은 Address Space를 갖고 똑같은 File Description을 갖는 자식 프로세스를 생성하는 시스템 콜이다. 부모 프로세스의 fork() 수행에 대한 반환 값은 자식 프로세스의 PID이며 자식 프로세스의 fork() 수행에 대한 반환 값은 0이기 때문에 부모/자식 프로세스간 구분이 가능하다. fork()는 부모/자식 프로세스가 협력하여 task를 수행하여야 할 때 유리하다.
B. exec()
exec()를 수행하는 프로세스의 address space가 새롭게 로드 되는 프로세스의 address space로 교체된다.
C. exit()
프로세스가 종료되기 위해 여러가지 사후처리를 수행한 다음 마지막에 _exit()를 통해 프로세스를 종료한다
D. _exit()
프로세스가 종료되기 위한 여러가지 사후처리를 수행하지 않고 프로세스를 종료한다.
E. abort()
에러 발생과 같은 비정상적인 상황에서 프로세스를 종료한다.
F. wait()
부모 프로세스가 자식 프로세스의 작업이 끝날 때까지 기다렸다가 자식 프로세스의 작업이 끝나면 같이 종료된다.
X. fork() 사용의 예시: Web Server
프로세스는 유저의 연결 요청을 기다렸다가. 연결 요청이 들어오면 유저와의 연결을 수행하고 이후 바로 fork()를 수행하여 자신과 똑같은 자식 프로세스를 만든다. 자식 프로세스는 연결된 유저의 추가적인 요청을 handling하고 부모 프로세스는 다시 새로운 유저의 연결 요청을 처리 할 수 있게 대기한다.
XI. fork() 과정
A. new PCB를 만들고 초기화
B. new Address Space를 만들고 초기화
C. new Address Space를 Parent Process의 Address Space 컨텐츠를 똑같이 갖도록 초기화
D. Parent Process가 사용했던 리소스의 포인트까지 Child Process가 똑같이 갖도록 Kernel Resource를 초기화
E. 운영체제 내 Parent Process가 하던 일도 똑같이 복사
F. Child Process의 PCB를 Ready Queue에 위치시키기
G. Child 의 PID (process id) 를 Parent에게 리턴, 그리고 Child는 0을 리턴
XII. Multi-Processing의 예시: Google Chrome
구글 크롬은 다음과 같은 3가지의 process들을 이용한다.
A. Browser Process: manage user interface, disk, network I/O
B. Renderer Process: render webpage, deals with HTML, JS
C. Plug-in Process
크롬에서 파일을 다운로드할 경우 Browser Process가 Network I/O 작업을 수행하여 파일을 다운로드하며,
이때 병렬적으로 Renderer Process가 화면 렌더링을 수행하여 유저는 한 번에 여러 Task를 수행할 수 있다.
XIII. IPC (Message Queue VS Shared Memory)
Message Queue는 우편함과 비슷하다. 우편함처럼 Message Queue를 만든 후 이를 통해 프로세스들이 Message를 주고 받는다. Shared Memory는 메모리상에 프로세스들이 데이터를 공유하는 영역을 두고 프로세스간 통신을 수행할 수 있게 하는 기법이다.
A. Message Queue의 장점:
커널에 의해 관리되기 때문에 안정성이 높다, 동기화(동시성) 문제가 발생하지 않는다.
B. Message Queue의 단점:
커널에 의해 관리 되기 때문에 커널 모드로 전환함으로써 발생하는 오버헤드가 존재하며, 속도가 느리다.
C. Shared Memory의 장점:
커널에 의해 관리되지 않기 때문에 속도가 빠르다.
D. Shared Memory의 단점:
동기화(동시성) 문제가 발생할 수 있다, 안정성이 낮다.
XIV. Another IPC: Socket, RPC
A. Socket: Message Queue와 Shared Memory는 한 시스템 내에서 프로세스간 통신이라면 소켓은 다른 시스템에 존재하는 프로세스간 통신을 의미한다.
B. RPC: RPC도 다른 시스템에 존재하는 프로세스간 통신을 의미하며, 원격에 존재하는 함수에 입력 파라미터를 전달하고 결과 값을 받는 작업을 수행한다. RMI는 Java에서의 RPC를 의미한다.