Linux에서 프로세스를 만드는 방법은 무엇입니까?

Linux에서 프로세스를 만드는 방법은 무엇입니까?

저는 대학원생이고 프로세스를 생성해야 하는 Linux 관련 실험을 하고 있습니다. 시스템 호출을 통해 생성하는 방법을 알고 있지만 fork()호출하는 프로세스를 복제하지 않고 생성할 수 있는 다른 방법이 있는지 궁금합니다.

답변1

새 프로세스가 생성되면 상위 프로세스는 새 프로세스가 사실상 독립적인 프로세스가 될 때까지 새 프로세스에서 소비하는 모든 리소스를 책임져야 합니다. 이를 처리하는 것은 fork()동작을 처리하는 것보다 더 복잡할 수 있지만 Fish and Chips의 @Derek이 주석에서 말했듯이 clone()스레드/프로세스 생성의 세부 사항을 더 효과적으로 제어할 수 있는 시스템 호출이 있습니다.

시스템 fork()호출은 실제로 쓰기 시 복사 메모리 관리를 사용하여 가능한 한 메모리 복사를 방지하려고 합니다. 실행되면 fork()새 프로세스와 해당 상위 프로세스는 처음에 동일한 메모리에 액세스하지만(처음에는 상위 프로세스의 페이지 테이블만 실제로 복사됨) 해당 메모리는 프로세서의 메모리 관리 장치에 의해 "쓰기 시 복사"로 표시됩니다. 하위 프로세스가 execve()새 프로그램을 로드하는 데 즉시 사용되는 경우 하위 프로세스는 자체 메모리 할당을 그 일부로 가져오고 execve()상위 프로세스의 쓰기 시 복사 제한이 제거됩니다. 최적화는 예상대로 작동합니다.

그러나 하위 프로세스가 실행되기 전에 상위 또는 하위 프로세스가 임시 공유 메모리 페이지를 수정하는 경우 execve()쓰기 시 복사 비트는 실제로 쓰기가 발생하기 전에 페이지 오류를 일으킬 수 있으며 커널은 메모리의 두 번째 복사본을 만듭니다. 페이지를 수정하면 부모 프로세스와 자식 프로세스 모두 예상 내용이 포함된 해당 메모리 페이지의 쓰기 가능한 일반 복사본을 얻습니다. 따라서 프로세스가 fork()Without를 사용하는 경우 execve()실제 복사는 나중에 실제로 작성된 페이지를 기반으로 하는 메모리 페이지별 세분성에서 발생합니다.

시스템 vfork()호출은 이러한 최적화를 명시적으로 만듭니다. 상위 프로세스/스레드 vfork()는 하위 프로세스가 execve()또는 를 호출할 때까지 실행 중에 일시 중지됩니다 _exit(). vfork()ed 하위 프로세스가 실행되기 전에 execve()특정 작업을 수행하는 것을 스스로 제한해야 합니다. 이렇게 하면 메모리 복사본이 필요할 가능성이 최소화됩니다.

내가 아는 한, 시스템 호출 fork()을 사용하는 것 외에 사용자 공간 내에서 새 프로세스를 생성하는 다른 방법은 없습니다 . 커널 코드를 사용하는 경우 현재 커널의 어느 부분에 있는지에 따라 사용 가능한 옵션이 다를 수 있습니다.vfork()clone()

관련 정보