프로세스는 어떻게 생성할까요?
프로세스가 생성된다는 것은 text, data, bss, heap, stack 영역을 생성한다는 것입니다. 영역 별 공간을 만들고 프로세스 이미지를 해당 공간에 업로드하고, 실행을 시작하면서 생성이 됩니다.
fork()와 exec() 시스템콜
fork() 시스템 콜은 새로운 프로세스 공간을 별도로 만들고, fork() 시스템콜을 호출한 프로세스(부모 프로세스) 공간을 모두 복사합니다. 별도의 프로세스 공간을 만들고, 부모 프로세스 공간의 데이터를 그대로 복사합니다.
exec() 시스템 콜을 호출한 현재 프로세스 공간의 text, data, bss 영역을 새로운 프로세스의 이미지로 덮어씌웁니다. 별도의 프로세스 공간을 만들지 않습니다.
fork() 시스템 콜
pid = fork()가 실행되면 부모 프로세스와 동일한 자식 프로세가 별도 메모리 공간에 생성됩니다. 자식 프로세스는 pid가 0으로 리턴되며, 부모 프로세스는 실제 pid가 리턴됩니다. 두 프로세스의 변수 및 PC값은 동일합니다. 새로운 프로세스 공간을 별도로 만들고, fork() 시스템 콜을 호출한 프로세스 공간을 모두 복사한 후, fork() 시스템 콜 이후 코드부터 실행합니다.
exec() 시스템 콜
text, data, bss 영역이 덮어씌워집니다.
종류는 다음과 같습니다.
wait() 시스템 콜
wait() 함수를 사용하면, fork() 함수 호출시, 자식 프로세스가 종료할 때까지, 부모 프로세스가 기다리게 됩니다. 자식 프로세스와 부모 프로세스의 동기화, 부모 프로세스가 자식 프로세스보다 먼저 죽는 경우를 막기 위해 사용합니다.
'시스템 프로그래밍' 카테고리의 다른 글
프로세스 관리 - 프로세스 종료 (0) | 2021.05.06 |
---|---|
프로세스 관리 - 프로세스 생성 속도 향상 (copy on write) (0) | 2021.05.06 |
프로세스 관리 - 프로세스 ID (0) | 2021.05.05 |
리눅스 운영체제 종류와 장점 (0) | 2021.04.30 |
시스템콜, API, ABI, 표준 (0) | 2021.04.30 |