본 글의 일부분은 서적 'Operating Systems: Three Easy Pieces by Remzi H.Arpaci-Dusseau, Andrea C.Arpaci-Dusseau' 내의 이미지와 내용을 포함하고 있습니다 :)
이번 시간에는 프로세스 API에 대해서 배워보고자 합니다.
운영체제는 프로세스 생성이나 삭제 등, 프로세스와 관련된 함수를 user에게 제공합니다.
프로세스의 생성
프로세스는 부모 프로세스가 자식 프로세스를 생성함으로써 만들어집니다.
즉, parnet process가 있어야 child process 도 있는 것입니다.
따라서 아래와 같은 트리의 모습으로 프로세스의 관계를 그릴 수 있습니다.
프로세스가 생성되면서 자원 공유나 실행 등의 측면에서 여러가지 선택이 가능한데, 하나씩 알아보겠습니다.
우선 프로세스가 생성될 때, child 프로세스는 프로세스를 위한 기본적인 자원들이 필요합니다.
이런 자원은 운영체제가 새로 주거나, 부모의 자원을 공유해서 사용할 수 있습니다.
또한, 자원을 공유할 때에도 운영체제에 따라 child가 parent의 자원을 공유하는 정도가 다릅니다.
모두 공유할 수도, 또는 일부분만 공유하거나 아예 공유하지 않을 수도 있습니다.
프로세스를 실행할 때에 parent와 child가 동시 실행되거나,
또는 parent가 child 프로세스의 종료를 기다릴 수 있습니다.
child 프로세스는 fork와 같이 부모의 address space(data, code ...)를 그대로 복사해서 쓰거나,
execute로 프로그램에 새로 적재할 수 있습니다.
UNIX를 예시로,
- fork : 새로운 프로세스를 만들며, 부모의 PCB를 복사하고, 메모리 공간을 할당
- execve : fork 이후에 호출되는 system call로, disk로부터 binary program(실행 파일)을 load하고 초기화
프로세스의 종료
스스로 프로세스를 종료한다면, 다음과 같은 흐름으로 이루어집니다.
1. 가장 마지막 문장을 만났거나, exit를 호출했거나, main 함수에서 return되면
2. parent에게 종료 상태를 반환하고, parent는 wait로 child의 종료 상태를 받음
3. 운영체제에게 종료해 달라고 요청함
4. 운영체제가 process의 resource들을 해제함
하지만 프로세스가 스스로 종료 되지 않고, abort를 이용하여 부모가 자식의 프로세스를 종료시킬 수 있습니다.
보통 child가 자원을 너무 많이 낭비하거나, 프로세스에게 할당 된 일이 더 이상 필요가 없을 때에 abort합니다.
아래는 fork, exec, exit, wait system call에 대한 흐름을 나타낸 것입니다.
fork : 새로운 프로세스를 만듦
exec : 자기만의 코드를 메모리에 적재하고, main 함수부터 시작함
exit : child가 종료되고, 종료된 상태를 wait에게 반환
wait : child의 종료 상태를 반환받음
예시로, linux에서 $ cmd 라는 명령어를 입력하였다고 생각해봅시다.
이 때, $ (쉘) 은 parent 프로세스이고, cmd 라는 프로세스가 child 프로세스가 될 것입니다.
그러면 cmd 라는 프로세스가 동작하는 동안에는 parent가 대기 중이기 때문에 쉘이 보이지 않습니다.
하지만 cmd가 종료되면, parent가 wait에서 종료된 상태를 반환받으면서 대기가 풀리기 때문에 다시 쉘 프롬포트가 보이게 됩니다.
'운영체제' 카테고리의 다른 글
[운영체제] System Call (0) | 2021.01.14 |
---|---|
[운영체제] Direct Execution과 Limited Direct Execution (0) | 2021.01.14 |
[운영체제] 프로세스(Process)란 무엇일까? (0) | 2021.01.10 |
[운영체제] CPU 가상화의 기본 개념 (0) | 2021.01.10 |
[운영체제] 운영체제 소개와 기본 개념 (2) (0) | 2021.01.06 |