프로세스 생성 (process creation)
- 누가 프로세스 만들어? 부모 프로세스(한 개의 부모)가 자식 프로세스(여럿)를 생성한다.
- 생성 방법? 복제 생성.
- 부모 프로세스 하나가 자식 프로세스 여럿을 낳을 수 있고 자식 역시 마찬가지.
- 이 과정을 거치면 프로세스는 트리 구조를 형성
- 프로세스는 자원을 필요로 한다.
- 자원 공유 - 3가지 모델
- 자원 공유하는 것도 있고 아닌 것도 있는데 원칙은 자원 공유 안함. 자식 낳고 나면 그때부터는 경쟁 상태. 서로 CPU 얻으려고 경쟁함.
- 수행
- 부모와 자식은 공존하며 수행.
- 자식이 종료될 때까지 부모가 기다리는 모델도 있음.
- 주소 공간(Address space)
- 부모 프로세스의 주소공간을 자식이 복사해(바이너리 & OS 데이터를 복사)
- 자식을 일단 복제해놓고 그 위에 새로운 프로그램을 올릴 수 있어.
- fork() 시스템 콜: 시스템 콜이 새로운 프로세스를 생성하는 함수.
- 부모를 그대로 복사(PID를 제외한 OS 데이터 전부 + 바이너리 데이터를 복사)
- 새로운 주소 공간을 할당
- exec(): 시스템 콜 해서 새로운 프로그램을 메모리에 올린다.
- 굳이 자식 만들어서 하지 않고 부모 위에 exec() 실행하면 부모 자체가 새 프로그램을 메모리에 올린다.
- fork, exec: 운영체제가 수행하는 작업! 시스템 콜!
프로세스 종료
- 프로세스가 마지막 명령 수행 후 운체한테 exit이라고 알려주면 종료
- 자식이 부모에게 output data 보내 (wait 함수를 통해)
- C 언어로 프로그램 작성할 때 메인 함수 안에 문장 쭉 쓰고 중괄호 닫아 ⇒ 우리가 exit() 명시적으로 적어놓지 않아도 컴파일러가 알아서 exit 수행한다! (이미 우리가 쓰고 있던 것!)
- 프로세스 종료될 떄 ⇒ 자식이 부모한테 데이터를 보내. via 웨이트 시스템 콜
- (부모와 자식 프로세스가 있으면 자식 프로세스가 먼저 죽는게 프로세스 세계에서 원칙!)
- 자발적으로 종료할 때는 wait 시스템 콜