목차
- 프로세스 생성 (Process Creation)
- 프로세스 종료 (Process Termination)
- fork( ) System Call
- exec( ) System Call
- wait( ) System Call
- exit( ) System Call
- 프로세스 간 협력
프로세스 생성 (Process Creation)
➳ 부모 프로세스 (parent process)가 자식 프로세스 (children process)를 생성한다.
• 운영체제에게 만들어달라고 요청한다. - fork() system Call
➳ 프로세스의 트리 (계층 구조)를 형성한다.
➳ 프로세스는 자원을 필요로 한다.
• 운영체제로부터 받는다.
• 부모와 공유한다.
➳ 자원의 공유
• 부모와 자식이 모든 자원을 공유하는 모델
• 일부를 공유하는 모델
• 전혀 공유하지 않는 모델
➳ 수행 (execution)
• 부모와 자식은 공존하며 수행되는 모델
• 자식이 종료 (terminate)될 때까지 부모가 기다리는 (wait) 모델
➳ 주소 공간 (address space)
• 자식은 부모의 공간을 복사한다. (biinary and OS data)
• 자식은 그 공간에 새로운 프로그램을 올린다.
➳ 유닉스의 예
• fork() System Call이 새로운 프로세스를 생성한다. 부모를 그대로 복사 (OS data except PID + binary) 후, 주소 공간을 할당한다.
• fork() 다음에 이어지는 exec() System Call을 통해 새로운 프로그램을 메모리에 올린다.
프로세스 종료 (Process Termination)
프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려준다. (exit)
➳ 자식이 부모에게 output data를 보낸다. (via wait)
➳ 프로세스의 각종 자원들이 운영체제에게 반납된다.
부모 프로세스가 자식의 수행을 종료시킨다. (abort)
➳ 자식이 할당 자원의 한계치를 넘어선 경우
➳ 자식에게 할당된 task가 더 이상 필요하지 않은 경우
➳ 부모가 종료 (exit)하는 경우
• 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다.
• 단계적인 종료이다.
• e.g. 티스토리 글쓰기 창을 없애면 글쓰기 창 안의 여러 프로세스들도 동시에 없어지는 것과 같다.
fork( ) System Call
" create a child (copy) "
➳ A process is created by the fork() system call.
• creates a new address space that is a duplicate of the caller.
fork()는 자식을 하나 만들어달라고 요청하는 함수이다. fork() 하는 순간 아래와 같이 복제한다.
물론 메모리 공간, Program Counter도 복제한다.
부모와 자식 모두 fork() 한 다음부터 실행한다. 그리고 이 둘은 별개의 프로세스가 되는 것이다. 복제했기 때문에 내가 부모인지 자식인지 알 수가 없어 서로 구분할 필요가 있다. fork()를 호출한 return 값이 부모 프로세스는 양수 값, 자식 프로세스는 0이므로 이를 통해 구분이 가능하다.
fork()는 한 프로세스의 동일한 실행 파일을 실행한 것과 같다. 완전히 다른 프로그램을 실행하고 싶다면 fork() system call 로만은 어렵다. 새로운 프로그램을 덮어 씌우는 서비스가 필요한데, 이를 위한 것이 바로 exec() system call이다.
• pid = 프로세스 식별자
exec( ) System Call
" overlay new image "
➳ A process can execute a different program by the exec() system call.
• replaces the memory image of the caller with a new program.
wait( ) System Call
" sleep utill child is done "
프로세스 A가 wait() System Call을 호출하면
➳ 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다. (block 상태)
➳ child process가 종료되면 커널은 프로세스 A를 깨운다. (ready 상태)
아래 프로세스의 상태를 살펴보면, 자식의 종료를 기다리며 block 상태가 되도록 하는 부분이 wait() system call이라고 볼 수 있다.
만약 wait() system call이 없다면 부모 프로세스와 자식 프로세스는 CPU를 먼저 차지하기 위해 서로 경쟁할 것이다. 하지만 부모 프로세스가 fork() 후, wait()를 호출한다면 자식이 종료될 따까지 부모는 block 상태에 있는 것이다.
exit( ) System Call
" frees all the resources, notify parent "
프로세스의 종료
🔮 자발적 종료
➳ 마지막 statement 수행 후 exit() system call을 통해 종료한다.
➳ 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어준다.
🔮 비자발적 종료
➳ 부모 프로세스가 자식 프로세스를 강제 종료시키는 경우
• 자식 프로세스가 한계치를 넘어서는 자원을 요청하는 경우
• 자식에게 할당된 task가 더 이상 필요하지 않은 경우
➳ 키보드로 kill, break 등을 친 경우
➳ 부모가 종료하는 경우
• 부모 프로세스가 종료하기 전에 자식들이 먼저 종료된다.
프로세스 간 협력
✔ 독립적 프로세스 (Independent process)
프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못한다.
✔ 협력 프로세스 (Cooperating process)
프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있다.
✔ 프로세스 간 협력 메커니즘 (IPC, Interprocess Communication)
1) 메시지를 전달하는 방법
" message passing "
커널을 통해 메시지를 전달한다.
2) 주소 공간을 공유하는 방법
" shared memory "
서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있다.
" thread "
thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 프로세스를 구성하는 thread 간에는 주소 공간을 공유하므로 협력이 가능하다.
원칙적으로는 각 프로세스는 본인만의 code, data, stack만 접근할 수 있으므로 서로 다른 프로세스가 메모리 공간을 share 할 수 없다. Shared Memory를 위해 운영체제에게 system call로 부탁하는 것이다. 프로세스 간 서로 신뢰할 수 있는 경우에만 shared memory를 만들어야 한다.
Reference
KOCW 운영체제 강의 (이화여자대학교, 반효경 교수님)
'CS > OS' 카테고리의 다른 글
프로세스 동기화 (Process Synchronization) (0) | 2022.12.28 |
---|---|
CPU 스케줄링 (2) | 2022.12.26 |
프로세스 (Process)와 스레드 (Thread) (2) | 2022.12.14 |
컴퓨터 시스템의 구조에 대하여 (0) | 2022.12.11 |
운영체제란 무엇인가 ? (0) | 2022.12.09 |