시스템 내의 프로세스들은 반드시 동적으로 생성되고, 제거되어야 한다. 따라서 운영체제는 프로세스 생성 및 종료를 위한 기법을 제공해야 한다.
그래서 이번에는 프로세스를 생성하고 제거하는 방법에 대해서 알아보고자 한다.
[프로세스 생성]
실행되는 동안 프로세스는 여러 개의 새로운 새로운 프로세스들을 생성할 수 있다. 생성하는 프로세스를 부모 프로세스, 새로운 프로세스는 자식 프로세스라고 하는데 이런 구조가 반복되면서 트리를 형성한다.
현대 운영체제들은 유일한 프로세스 식별자(pid)를 사용하여 프로세스를 구분하고 프로세스의 속성에 접근한다.
일반적으로 프로세스가 자식 프로세스를 생성할 때, 자식 프로세스는 자신의 역할을 수행하기 위해 특정 자원(CPU 시간, 메모리)등이 필요하다. 이런 자원을 얻기 위한 2가지 방법이 있다.
1 ) 운영체제로부터 직접 얻는 방법.
2 ) 부모 프로세스가 가진 자원의 부분 집합을 사용
- 자식 프로세스들을 많이 생성하여 시스템을 과부하 상태로 만드는 상황을 방지할 수 있음.
프로세스를 새로 생성할 때는 fork() 시스템 콜을 사용한다. Fork()는 부모와 똑 같은 프로그램을 하나 만드는 역할은 한다. Fork() 이후 두 프로세스 중 한 프로세스가 exec() 시스템 콜을 사용하여 자신의 메모리 공간을 새로운 프로그램으로 교체한다. 그 후 부모는 더 많은 자식을 생성하거나 자식이 실행하는 동안 할 일이 없으면 자식이 종료될 때까지 준비 큐에서 자신을 제거하기 위해 wait() 시스템 콜을 한다.
Cf ) windows에서는 CreateProcess() 가 fork와 비슷한 역할을 한다.
WaitForSingleObject()는 wait()과 비슷한 역할
STARTUPINFO : 윈도 크기와 모양 표준 입력과 출력 파일에 대한 핸들과 같은 새로운 프로세스의 특성 지정
PROCESS_INFORMATION : 새로 생성된 프로세스와 스레드에 대한 핸들과 식별자들을 포함.
Cf ) 부모로 부터 자원과 스케줄링 속성을 상속받은 자식 프로세스는 execlp 시스템 콜을 사용하여 자신의 주소 공간을 unix명령 /bin/ls로 덮어쓴다.
[프로세스 종료]
Exit()시스템 콜을 사용하면 프로세스를 종료할 수 있다. 이 때 프로세스의 모든 자원이 할당 해제되고 운영체제로 반납된다.
프로세스를 종료할 때 부모는 여러가지 이유로 자식 중 하나의 실행을 종료할 수 있다.
1 ) 자식이 자신에게 할당된 자원을 초과 사용할 때
2 ) 자식에게 할당된 태스크가 필요 없을 때
3 ) 부모가 exit를 하는데 운영체제는 부모의 exit이후 자식의 실행을 허용하지 않을 때
부모 프로세스가 종료한 이후에 자식 프로세스가 존재할 수 없는 시스템들이 있는데 이런 시스템에서는 프로세스가 종료되면 그로부터 비롯된 모든 자식 프로세스들도 종료되어야 한다. 이것을 연쇄식 종료라고 부르며 이 작업을 운영체제가 시행한다.
프로세스가 자신이 종료될 때는 exit 시스템콜을 사용하면 되지만 부모 프로세스에서 자식 프로세스를 종료시키고 싶은 경우 abort() 시스템 콜을 이용할 수 있다.
부모 프로세스는 wait() 시스템 콜을 사용해서 자식의 종료 상태를 얻어낼 수 있도록 하나의 인자를 전달 받는다.
종료되었지만 부모 프로세스가 아직 wait() 호출을 하지 않은 프로세스를 좀비 프로세스
Wait()을 호출하지 않고 종료한 경우 자식 프로세스를 고아 프로세스라고 부른다.
Cf ) 윈도우는 TerminateProcess() 명령어를 이용한다.