따라서 명령이 셸에서 시작되면 fork ()는 자식 프로세스를 상속하고 exec ()는 자식 프로세스를 메모리에로드하고 실행합니다.
좀 빠지는. fork()
현재 프로세스를 복제하여 동일한 자식을 만듭니다. exec()
새로운 프로그램 을 현재 프로세스에 로드하여 기존 프로그램 을 대체합니다.
내 질문은 :
자식 프로세스에 부모 프로세스의 모든 속성 (원래 프로세스)이 포함되어 있으면이 자식 프로세스의 필요성은 무엇입니까? 원래 프로세스도 메모리에로드되었을 수 있습니다.
부모 프로세스가 아직 종료되기를 원하지 않기 때문입니다. 새로운 프로세스가 진행되고 동시에 실행되는 무언가를 원합니다.
이 포크와 실행 개념은 UNIX의 모든 실행 프로그램에 적용됩니까? 쉘 스크립트와 마찬가지로 명령에만 적용됩니까? 쉘 내장 명령에도 적용됩니까?
외부 명령의 경우, 쉘은 fork()
명령이 새 프로세스에서 실행되도록합니다. 내장은 쉘에 의해 직접 실행됩니다. 또 다른 주목할만한 명령은이며 exec
, 먼저 쉘을 exec()
외부 프로그램에 알리지 않습니다 fork()
. 이것은 쉘 자체가 새로운 프로그램으로 교체되어 더 이상 종료 될 때 해당 프로그램으로 돌아 오지 않음을 의미합니다. 당신이 말한다면, exec true
다음 /bin/true
은 종료됩니다, 그래서 더 이상 터미널에서 실행 아무것도 남기지 않고, 쉘, 즉시 종료를 대체합니다.
명령 / 스크립트를 실행하면 copy on write 개념이 사용되는 경우
석기 시대에는 fork()
실제로 호출 프로세스의 모든 메모리를 새 프로세스로 복사해야했습니다. 쓰기시 복사는 두 프로세스가 동일한 메모리를 모두 공유하기 시작하고 필요한 경우 두 프로세스가 기록한 페이지 만 복사되도록 페이지 테이블을 설정하는 최적화입니다.