프로세스 생성 (Creation)
프로세스를 생성하기 위한 복잡한 절차는 커널안에 코드로 구현되어 있다.
하지만 프로세스 생성 요청은 사용자나 다른 프로그램이 시스템 API를 호출해야 가능하다.
1. 프로세스 ID (Process ID)
사용자나 현재 실행중인 어떤 프로세스에서 생성을 위한 시스템 호출을 요청하면
새로운 프로세스가 만들어지고, 고유 식별자인 프로세스 ID를 부여받는다.
2. 새 프로세스가 사용할 자원
새로운 프로세스는 운영체제로부터 직접 새로운 PCB와 주소 공간을 할당 받는다.
부모 프로세스로부터 Parameter로 전달 받을 수도 있다. (예를 들면, main() 의 arguments)
3. 프로세스 트리 (Process Tree)
생성을 요청한 프로세스와 새로 생성된 프로세스는 부모와 자식 관계가 만들어진다
=> 즉, 프로세스 트리가 만들어진다.
프로세스 개념 기본기를 다지기 위해...!!
[운영체제] 프로세스의 개념 정복하기
프로세스 생성 시스템 API
1. fork()
커널에서 새로운 프로세스(자식)를 생성하고 프로세스 ID를 반환한다.
새로운 프로세스는 새로운 주소 공간에 프로그램을 담을 틀이 마련되는 것이고 (메모리 공간 확보), 해당 공간의 내용은 부모와 동일한 텍스트 코드와 내용을 담게 된다.
부모 프로세스의 복사본이라 할 수 있다.
부모 정보가 복제 될 때, 부모의 PCB도 복제되기 때문에 자식 프로세스는 처음부터 실행되는 것이 아니라 fork() 직전 위치부터 실행된다.
부모 프로세스에서는 fork의 결과로 자식 프로세스의 PID를 return 받지만, 복제된 자식 프로세스에서는 fork()의 결과로 0을 return 받는다.
부모 프로세스가 명시적으로 wait()를 하지 않는 이상, 자식 프로세스와 동시에 실행되는 모양이 된다.
2. wait()
부모 프로세스가 자식 프로세스를 생성하고, wait()를 호출하면 자식 프로세스가 종료되기를 기다린다.
자신은 Ready queue에서 제외되고, Wait Signal Interrupt 발생하면 나중에 다시 실행에 복귀한다.
3. exec()
프로세스의 주소 공간을 새로운 프로그램의 내용으로 교체하는 것이다.
원래 있던 프로그램은 사라지는 것이고, 새로운 프로그램의 코드와 데이터를 적재한다.
맨 처음 프로세스를 생성할 때, 자기 자신과 동일한 메모리 내용으로 자식 프로세스를 생성한 뒤
exec()를 통해 새로운 프로그램을 적재시킬 수 있다.
프로세스 종료
1. 프로세스 자신의 실행을 종료 => exit()
부모 프로세스에 상태값을 반환하고, 메모리, 열린 파일, 입출력 버퍼 등의 자원을 운영체제에 반납한다.
2. 자식 프로세스를 강제로 종료 => kill()
자식 프로세스가 할당된 자원을 초과하여 사용할 때
자식 프로세스에게 주어진 작업이 필요하지 않을 때
부모 프로세스가 종료된 후 자식 프로세스의 실행이 허용되지 않는 시스템인 경우
'개발자 공부하기 > 운영체제' 카테고리의 다른 글
[운영체제] IPC, 프로세스 간 통신 방법 (0) | 2020.10.02 |
---|---|
[운영체제] 프로세스 스케줄링 알고리즘 정리 (0) | 2020.10.01 |
[운영체제] 프로세스 스케줄링 개념 정리 (0) | 2020.09.30 |
[Swift] Process 클래스로 다른 Application 실행 / 프로세스 제어하기 (0) | 2020.09.29 |
[운영체제] 프로세스의 개념 정복하기 (0) | 2020.09.26 |