서브쉘의 수명은 생성 직후에 끝나나요? 즉, 해당 자산이 해당 자산 내에서 실행될 프로세스로 대체됩니까? bash에서 실행 중이라고 가정하면
grep -r "something"
쉘(bash)은 처음에는 "grep"이 아닌 하위 프로세스를 생성하고 bash 자체의 포크로 시작하지만 결국 "grep"이 런타임이 되기를 원하기 때문에 , 하위 프로세스 셸의 자산은"빠르게"grep 프로세스로 대체되었습니다. (사진 속 : Shell ---> "Child Shell"(수명이 짧은가?) ---> Process)모든 쉘 명령이 서브쉘을 생성합니까? 예를 들어, "ls -l"과 같은 간단한 명령을 실행해도 짧은 시간 동안 하위 프로세스가 생성됩니까? 1에서 설명한 것과 같은 이유가 여기에 다시 적용되기 때문에 "ls" 자체는 프로그램이며 실행 시 해당 프로세스가 자체 쉘 프로세스를 대체하는 것을 원하지 않습니다.
2에 대한 대답이 "예"라면 이는 많은 쉘 명령이 포함된 쉘 스크립트를 실행하면 "많은" 하위 쉘과 프로세스가 생성된다는 의미입니까?
답변1
프로세스와 그 내부에서 실행되는 항목을 구별하는 것이 중요합니다(귀하의 질문에 따르면 이러한 구별을 알고 있음이 표시됩니다). 프로세스에서 실행 중인 특정 프로그램이 다른 프로그램을 실행하려고 할 때마다 두 가지 옵션이 있습니다. 운영 체제에 현재 프로세스의 프로그램을 새 프로그램으로 교체하도록 요청할 수 있습니다(exec
함수 계열) 또는 운영 체제에 새 프로세스를 생성하도록 요청할 수 있습니다(fork
기능그런 다음 프로세스는 운영 체제에 새 프로세스의 새 프로그램으로 교체하도록 요청합니다.
grep
셸에서 실행할 때 셸은 일반적으로 나중에 제어권을 다시 되찾기를 원하므로grep
분기되고, 분기된 프로세스가 완료될 때까지 기다립니다. 그렇습니다. 포크에 있는 셸은 일시적이지만 대부분의 최신 운영 체제에서는 포크에 있는 셸의 "자산"을 "생성"하는 데 비용이 많이 들지 않습니다(기록 중 복사 기능 덕분에). 기구).대화형 쉘 에도 동일하게 적용됩니다
ls -l
. 그러나 어떤 경우에는 쉘이 분기되지 않고 자체적으로 대체됩니다.bash가 간단한 명령에 대해 하위 쉘을 생성하지 않는 이유는 무엇입니까?더 알아보기.셸 스크립트를 실행하면 스크립트를 실행하는 셸에 대한 프로세스, 셸의 각 외부 명령에 대한 프로세스 및 특정 셸 구성에 대한 하위 셸이 생성될 수 있습니다.
프로세스를 생성하는 것은 저렴하지만 exec
비용이 덜 듭니다. 이것이 사람들이 사용 중인 프로세스 수를 제한하는 데 관심을 두는 이유 중 하나입니다. 두 가지 다른 이유(아마도 더 중요함)는 프로그램을 시작하는 데 해당 프로그램을 시작하는 데 드는 비용이 포함되고 종종 전체 프로세스의 일부를 반복하는 것과 관련이 있다는 것입니다(후자와 시스템의 비교 find ... -exec grep
또는 여러 호출 등). 또는). 외부 명령에 대한 과도한 의존으로 인해 셸 스크립트에서 속도 문제가 발생하기 시작하면 일반적으로 다른 프로그램을 사용하지 않고도 더 많은 데이터를 처리할 수 있는 보다 유능한 프로그래밍 환경으로 전환해야 한다는 신호입니다.grep -r
grep
sed
sed
awk