[ Process Concept ]
Process is ...
- is a program in executation
- is the unit of work in an OS
프로세스는 실행중인 프로그램, 즉 하드디스크에 있던 프로그램이 메모리에 로드된 것을 의미한다.
프로세스는 OS 관점에서 봤을 때, 작업의 단위이며, 프로세스를 관리하는 것이 OS의 가장 기본적인 일이다.
Memory Layout
메모리에 로드된 프로세스는 다음으로 구성되어 있다.
- text section
: executable code - data section
: global variables - heap section
: memory that is dynamically allocated during program run time - stack section
: temproary data storage when invoking functions such as function parameters, return address and local variables
Process state
프로세스 상태에는 5가지가 있으며, 현재 활동에 따라 달라진다.
- New
: process is being created - Running
: instructions are being executed.
: CPU를 점유한 상태 - Waiting
: the process is waiting for some event to occur
: I/O device의 작업이 끝나길 기다리거나(I/O completion) signal을 받은 상태 - Ready
: the process is waiting to be assigned to a processor
: CPU를 점유할, 명령어를 실행시킬 준비가 완료되어 기다리고 있는 상태 - Terminated
: the process has finished execution
Process Control Block
OS는 프로세스를 관리하는데, 이때 PCB(or TCP, task contrl block)가 사용된다. PCB는 프로세스의 정보가 저장된 구조체이며, OS가 프로세스를 관리하는 데 필요한 프로세스 상태, 프로그램 카운터, 레지스터 등의 정보가 저장되어 있다.
PCB contains ...
- Process state
- Program counter
- CPU registers
- CPU-scheduling information
- Memory-management information
- Accounting information
- I/O status information
(+) 프로세스 카운터는 해당 프로세스가 이어서 실행해야 할 instruction을 가리키고 있다.
Thread
지금까지는 프로세스가 single thread of execution을 한다고 전제했다. 싱글 스레드 프로세스는 한 번에 하나의 작업만 수행할 수 있다. 현대의 OS는 CPU의 사용효율을 높이기 위해 멀티프로세싱(멀티태스킹)을 한다. 프로세스 내에서도 여러 개로 나누어 동시에 하나 이상의 작업을 수행하여 CPU의 사용효율을 높일 수 있다. 이때, 하나의 프로세스에서 나누어진 lightweight process를 thread라고 한다.
(멀티스레딩에 대한 내용은 이후에 자세히...!)
[ Process Scheduling ]
멀티프로그래밍의 목적은 동시에 여러 프로세스를 실행시켜 CPU의 사용효율을 높이는 것이다. time sharing의 목적은 프로세스 간에 CPU를 자주 빠르게 전환하여 사용자로 하여금 여러 프로그램이 동시에 실행되고 있는 것처럼 느끼게 하는 것이다.
이를 위해서 언제 어떤 프로세스를 CPU에서 실행시킬지 결정하는 과정이 필요한데, 이 과정이 Process Scheduling이다.
Scheduling queues
프로세스가 실행을 기다리고 있는 'ready' 상태일 때 ready queue에 쌓이며, 어떠한 이벤트가 발생되기를 기다리는 'waiting' 상태의 프로세스는 wait queue에 쌓인다. 이러한 queue는 보통 PCB의 링크드리스트 형태로 구현되어 있다.
(+) I/O completion을 기다리는 프로세스도 wait queue에 쌓이게 되는데, 이때 I/O device는 여러 개이므로 wait queue 또한 여러 개 일 수 있다.
Context Switch
어떤 interrupt가 발생하면 실행 중이던 프로세스를 중단하고 다른 프로세스를 실행시키는데 이러한 과정을 context switch라고 한다. 프로세스의 context란 프로세스가 실행되고 있는 상태를 의미하며, 이는 PCB에 저장되어 있으므로, context switch는 PCB의 정보를 바꾸는 것이라고도 할 수 있다. context switch를 위해 실행 중이던 프로세스의 상태를 저장하고, 실행시키고자 하는 다른 프로세스의 상태를 복구한다. (state save of the current process and state restore of a different process)
(+) 실행 중이던 프로세스의 상태를 PCB에 저장할 때, 다음에 이어갈 instruction의 주소를 program counter에 저장하여, 이후에 CPU가 그 프로세스로 전환되었을 때 이어서 실행될 수 있도록 한다.
[ Operations on Process ]
OS는 프로세스 생성과 프로세스 종료 메커니즘을 제공해야 한다.
프로세스는 여러 개의 프로세스를 생성할 수 있으며, 트리 구조를 띄고 있다. 즉, 부모 프로세스가 자식 프로세스를 생성한다.
Process Creation
부모 프로세스가 자식 프로세스를 생성했을 때, 각각의 프로세스가 작동되는 데에 있어 여러 가지 경우가 있다.
우선 실행 측면에서 봤을 때, 두 가지 경우가 있다.
- execute concurrently, 부모 프로세스와 자식 프로세스가 동시에 실행된다.
- wait termination of child, 자식 프로세스가 끝날 때까지 기다렸다가 실행된다.
address space 측면에서도 두 가지 경우가 있다.
- duplicate of the parent process, 부모 프로세스가 메모리에 복제된다.
- new program loades, 새로운 프로그램이 메모리에 로드된다.
UNIX 계열의 OS에서는 fork() 시스템 콜을 이용해 새로운 프로세스를 생성한다. 각 프로세스는 프로세스 고유번호인 pid를 갖는데, fork()의 리턴값이 0일 경우 자식 프로세스, 0 보다 큰 값이 경우 부모 프로세스를 의미한다.
fork()로 자식 프로세스를 생성하면, 부모 프로세스의 address space가 복제된다. 만약 자식 프로세스에서 exec 계열의 함수를 사용하게 되면 자식 프로세스의 메모리에 새로운 프로그램이 로드된다. 예를 들어 자식 프로세스에서 execlp("/bin/ls', "ls", 0); 을 실행시켰다면 자식 프로세스의 메모리 부분에 ls가 로드된다.
또한 부모 프로세스와 자식 프로세스가 fork() 호출 이후부터 동시에 실행된다. 부모 프로세스는 wait() 시스템 콜을 호출해 자식 프로세스의 종료를 기다릴 수 있는데, 이 경우 부모 프로세스는 wait queue로 이동하여 자식 프로세스 종료를 기다린다.
Process Termination
마지막 instruction이 실행되거나 exit() 을 호출하여 프로세스를 종료할 수 있다.
프로세스가 종료하면 OS는 해당 프로세스에서 사용된 할당된 메모리 open file, I/O 버퍼 등을 모두 해제한다.
좀비 프로세스(Zombie process)
자식 프로세스가 종료되었지만, 부모 프로세스가 자식 프로세스의 return 값을 회수하지 않으면 즉, 자식 프로세스가 종료했는데 부모 프로세스가 wait()을 호출하지 않았다면 자식 프로세스는 종료되었음에도 정보가 메모리에 남아있는 좀비 프로세스가 된다. 이후에 부모 프로세스가 wait()을 호출하여 자식 프로세스의 return 값을 회수하면 좀비 프로세스는 해제된다.
고아 프로세스(Orphan process)
반면, 자식 프로세스가 종료되지 않았는데 부모 프로세스가 먼저 종료될 경우, 자식 프로세스는 고아 프로세스가 된다. 고아 프로세스는 부모 프로세스를 잃어버리고 그 상위 프로세스를 바라보게 된다.
'CS > 운영체제' 카테고리의 다른 글
[OS] Synchronization (0) | 2023.04.24 |
---|---|
[OS] CPU Scheduling (0) | 2023.04.24 |
[OS] Thread (0) | 2023.04.20 |
[OS] 운영체제의 개념과 구조 (0) | 2023.04.18 |
[OS] signal (0) | 2023.04.10 |