프로세스의 라이프 사이클
프로세스 생성
- 프로세스는 부모 프로세스가 자식 프로세스를 생성하여 트리 구조를 이룹니다.
- 프로세스의 생성은 오직 운영체제에 의해서만 이뤄집니다.
- 자식 프로세스는 부모 프로세스의 문맥을 복제해여 사용합니다.
- 운영체제에 따라 자식 프로세스의 자원을 운영체제로부터 바로 받을 수도 있고, 부모와 공유할 수도 있습니다.
- 자원을 공유하는 이유는 자원을 효율적으로 활용하기 위함입니다.
- 자식 프로세스를 생성하면 부모의 자원(코드, 스택, 데이터)를 복사하지 않고, 부모의 주소 공간을 공유합니다.
- 이후 자식 프로세스가 부모와 다른 자원을 필요하게 되는 시점에서 부모의 자원을 복사하여 독자적으로 사용합니다. 이것이 Copy-On_Write(COW)입니다.
- 프로세스 종료
- 프로세스가 마지막 명령을 수행한 후 운영체제에게 시스템콜(exit)를 통해 알려줍니다.
- 자식이 부모에게 wait 시스템콜을 통해 ouput data를 보냅니다.
- 프로세스의 자원들을 운영체제에게 반납합니다.
- 부모 프로세스가 자식 프로세스를 시스템 콜(abort)를 통해 종료시키는 경우도 있습니다.
- 자식이 할당된 자원을 초과해서 사용하거나, 자식의 태스크가 더 이상 필요하지 않는 경우입니다.
- 또는 부모 프로세스가 먼저 종료(exit)되는 경우도 있습니다.
- 이 경우에는 자식 프로세스부터 순차적으로 종료시킵니다.
프로세스 시스템 콜
fork()
- 자신의 프로세스를 복제하여 자식 프로세스를 만드는 시스템 콜
- 부모 프로세스의 경우 fork()의 return 값이 양수이고 자식 프로세스는 0입니다.
- fork()를 실행하면, 부모의 PC가 포함된 문맥이 복되제기 때문에, 자식 프로세는 fork()이후의 프로세스부터 실행합니다.
int main() { pid = fork(); if (pid == 0) printf("I am child\n"); else if (pid > 0) printf("I am parent\n"); }
exec()
- 완전히 새로운 프로세스를 실행시키는 시스템콜입니다.
- 꼭 자식을 만들어야하는 것은 아닙니다.
wait()
- 어떤 프로세스가 wait() 시스템 콜을 호출하면, 해당 프로세스를 sleep상태로 전환하고 자식 프로세스가 모두 종료된 후 다시 ready상태로 전환합니다.
exit()
- 프로세스를 종료시키는 시스템 콜입니다.
- 프로세스의 모든 인스트럭션을 수행하고 나면 수행합니다.
- 또는 자식 프로세스가 할당된 자원을 초과하서 사용하건, 자식이 더 이상 필요하지 않을 경우, 부모가 종료시킵니다.
- 또는 키보드를 통해 사용자가 강제 종료시킬 수 있습니다.
- 또는 부모가 종료하게 되면, 자식들을 먼저 종료시킨 후 마지막에 종료됩니다.
프로세스 간 협력
- 원칙적으로는 프로세스 간에 협력하지 않고 경쟁합니다.
- 협력 매커니즘을 통해 프로세스 간에 영향을 줄 수 있습니다.
- 메시지 전달
- Message Passing: 커널을 통해서 메시지를 전달
- 주소 공간 공유
- Shared Memory: 일부 주소 공간을 공유할 수 있습니다.
- 메시지 전달
'Computer Science > Operating System' 카테고리의 다른 글
| [운영체제] 여러 프로세스가 공유 데이터에 동시에 접근하면 어떻게 되나? (0) | 2023.02.12 |
|---|---|
| [운영체제] CPU Scheduling (0) | 2023.02.11 |
| [운영체제] 프로세스와 스레드 (0) | 2023.02.10 |
| [운영체제] 프로그램 실행 원리 (0) | 2023.02.02 |
| [운영체제] 컴퓨터 시스템의 구조 (0) | 2023.01.31 |