unix에서 새 프로세스를 생성할 때 왜 fork()와 exec()를 사용할까?

lsy·2022년 10월 31일
0

의문

계속 가지고 있던 의문인데, 왜 Unix에서는 프로세스를 생성할 때 직접 프로세스를 만들지 않고 부모 프로세스를 fork()로 복제 후에 exec()를 통해 내용을 갈아끼우는 걸까?

찾은 답

인터페이스를 단순화하기 위해서라고 한다.

fork()/exec()의 대안으로 윈도우의 CreateProcess() 시스템 콜이 존재한다.

fork()는 부모 프로세스의 자식 프로세스를 생성하고, exec()는 코드를 원하는 내용으로 덮어 쓴다.

CreateProcess()는 디스크에서 새 프로그램을 로드해 새 프로세스를 만든다. 즉 부모 프로세스를 복제하지 않고 새 프로세스를 하나 만든 뒤 프로그래머가 지시한 프로그램을 로드하게 한다.

그런데 CreateProcess()는 엄청 많은 매개변수를 요구한다. 왜냐하면 fork()/exec()는 부모 프로세스를 복제하면 자식 프로세스는 부모 프로세스의 각종 설정과 값들도 그대로 물려받기 때문에 그대로 사용하거나 원하는 값만 조금 바꿔주면 되지만, CreateProcess()는 새 프로세스를 바로 생성하는 것이기 때문에 내가 컨트롤하기 원하는 모든 설정과 값을 해당 함수에 매개변수로 전달해줘야 하기 때문이다.

추가로, CreateProcess()는 많은 매개변수 요구량에도 불구하고 충분하지 못해서 마이크로소프트는 CreateProcessAsUser()CreateProcessWithLogonW() 함수를 새로 만들었다고 한다.

따라서 fork()/exec()는 위에 설명한 이유로 매개변수가 필요하지 않다.

또 유닉스의 하나의 함수에 하나의 역할을 맡겨야 한다는 철학때문에 해당 함수들을 그렇게 디자인 했다고 생각하는 사람도 있었다.


Reference

https://unix.stackexchange.com/questions/136637/why-do-we-need-to-fork-to-create-new-processes
https://unix.stackexchange.com/questions/31118/why-is-the-default-process-creation-mechanism-fork
https://stackoverflow.com/questions/13839935/forking-and-createprocess
https://programmersheaven.com/discussion/279906/differences-between-createprocess-in-win32-and-fork-exec-in-unix

profile
server를 공부하고 있습니다.

0개의 댓글