cd
쉘에 입력하면 되어 cd
그 순간의 메모리에서로드? 내 직관은이 내장 명령이 커널이로드 된 후 시스템 메모리에 사전로드되지만 누군가가 실제로 명령을 호출 할 때만로드되도록 주장했습니다 (쉘에서 Enter 키를 누름). 이것을 설명하는 참조가 있는지 알려 주시겠습니까?
cd
쉘에 입력하면 되어 cd
그 순간의 메모리에서로드? 내 직관은이 내장 명령이 커널이로드 된 후 시스템 메모리에 사전로드되지만 누군가가 실제로 명령을 호출 할 때만로드되도록 주장했습니다 (쉘에서 Enter 키를 누름). 이것을 설명하는 참조가 있는지 알려 주시겠습니까?
답변:
쉘에 cd를 입력한다고 가정 해 봅시다. 그때 메모리에서 cd가로드 되었습니까? 내 직감은이 내장 명령이 커널이로드 된 후 시스템 메모리에 사전로드되지만 누군가가 실제로 명령을 호출 할 때만로드되도록 주장했습니다 ...
넓은 의미에서 다른 대답은 정확합니다. 내장에는 셸이로드되고 독립형은 호출 될 때로드됩니다. 그러나 매우 끈적 거리는 족제비 "누군가"는 그렇게 단순하지 않다고 주장 할 수 있습니다.
이 토론은 OS의 작동 방식과 다른 OS의 작동 방식이 다소 다르지만 일반적으로 모든 현대 닉스에 대해 다음과 같은 사실이 일반적이라고 생각합니다.
먼저 "메모리에로드"는 모호한 문구입니다. 실제로 우리가 말하는 것은 가상 주소 공간이 메모리에 매핑되어 있다는 것 입니다. "가상 주소 공간"은 메모리에 배치해야 할 수있는 것을 의미하기 때문에 중요하지만 실제로는 처음에는 아닙니다. 실제로 실제로 메모리에로드되는 것은 대부분 맵 자체 이며 맵은 영역이 아닙니다. "영토"는 디스크 (또는 디스크 캐시)의 실행 파일이며 실제로 실행 파일을 호출 할 때 메모리에 대부분 로드 되지 않을 수 있습니다.
또한, "영토"의 대부분은 다른 영토 (공유 라이브러리)에 대한 참조이며, 다시 언급되었다고해서 실제로로드되었다는 의미는 아닙니다. 실제로 사용될 때까지로드되지 않으며 "사용"이 무엇이든 성공하기 위해 실제로로드해야하는 부분 만로드됩니다.
예를 들어, 다음 top
은 bash
인스턴스를 참조하는 Linux 의 출력 스 니펫입니다 .
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
113MB VIRT는 가상 주소 공간이며 RAM에 매핑 됩니다. 그러나 RES는 프로세스에서 소비하는 실제 RAM 양으로 3.7kB에 불과합니다. 그리고 그 중 일부는 위에서 언급 한 공유 영역의 일부인 1.8 kB SHR입니다. 그러나 내 /bin/bash
디스크는 930 kB이며 기본 라이브러리는 (공유 라이브러리) 두 배 더 커집니다.
그 껍질은 지금 아무것도하고 있지 않습니다. 내장 명령을 호출한다고 가정 해 보겠습니다. 이전 명령은 나머지 쉘과 함께 이미 "메모리에로드되었습니다". - 코드는지도의 한 점에서 참여의 시작이며, 정말로드되지 않은 코드에 대한 참조를 도달 할 때, 그것을로드 어떤 커널이 실행 디스크의 실행 이미지에서 - 심지어 더 캐주얼하지만 해당 실행 파일 (쉘, 독립형 도구 또는 공유 라이브러리)이 이미 "메모리에로드되었습니다"라는 의미가 있습니다.
이를 수요 페이징 이라고 합니다.
내장 된 명령이 실제로는 실행 파일의 일부로로드됨을 보여주기 위해 다음 실험을 수행했습니다 bash
. 따라서 왜 그것들을 내장이라고 부르지 만 데모는 항상 무언가를 증명하는 가장 좋은 방법입니다.
새 bash
쉘을 시작 하고 프로세스 ID (PID)를 기록하십시오.
$ bash
$ echo $$
6402
두 번째 터미널에서 ps
명령을 실행하여 bash
추가 메모리를 시작 하는지 확인하고 볼 수 있습니다 .
$ watch "ps -Fp 6402"
결과는 다음과 같습니다.
Every 2.0s: ps -Fp 6402 Sat Sep 14 14:40:49 2013
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
saml 6402 6349 0 28747 6380 1 14:33 pts/38 00:00:00 bash
참고 : 메모리 사용량은 여기에 SZ 및 RSS 열과 함께 표시됩니다.
쉘에서 명령 실행을 시작하십시오 (pid 6402).
cd
주변에서 알 수 있듯이 메모리가 실제로 증가한다는 것을 알 수 있지만 이는 실행 파일 cd
이 메모리에로드되기 때문이 아니라 디스크의 디렉토리 구조가 메모리에로드되기 때문입니다. 계속 cd
다른 디렉토리에 들어가면 계속 증가하는 것을 볼 수 있습니다.
Every 2.0s: ps -Fp 30208 Sat Sep 14 15:11:22 2013
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
saml 30208 6349 0 28780 6492 0 15:09 pts/38 00:00:00 bash
다음과 같이보다 정교한 테스트를 수행 할 수 있습니다.
$ for i in `seq 1000`; do cd ..; cd 90609;done
이 명령은 레벨을 올린 다음 디렉토리 90609로 1000 번 다시 내려갑니다. 이것을 실행하는 동안 ps
창 에서 메모리 사용량을 모니터링하면 변경되지 않음을 알 수 있습니다. 이와 같은 것을 실행하는 동안 추가 메모리 사용량을 알 수 없습니다.
strace
다음 bash
은 실제 실행 파일이 아닌 내장 함수를 처리하고 있다는 것을 알려줍니다 . 시도하고 실행 strace cd ..
하면 다음 메시지가 표시됩니다.
$ strace cd ..
strace: cd: command not found
"내장 명령"은 별도의 프로그램이 아니라 셸에 내장 된 명령을 나타냅니다. ls
예를 들어 실제로는 기본 제공 명령이 아니라 별도의 프로그램입니다. 디스크 캐시에없는 한, 호출 될 때 RAM에로드됩니다.
내장 명령의 예는 printf
또는 cd
입니다. 이들은 쉘의 일부이며 나머지 쉘과 함께로드됩니다.
이를 위해 시스템이 작성되었지만 기본적으로 명령이 사전로드되어 있지 않습니다.