내장 명령은 언제 메모리에 로드됩니까?

내장 명령은 언제 메모리에 로드됩니까?

cd쉘에 입력한다고 가정해 보겠습니다 . cd그 순간 메모리에서 로드 됩니까 ? 내 직감으로는 이러한 내장 명령이 커널이 로드된 후 시스템 메모리에 미리 로드되지만 누군가 실제로 명령을 호출할 때만 로드된다고 주장하는 사람이 있습니다(셸에서 Enter 키를 누름). 이것을 설명할 수 있는 참고 자료가 있는지 알려주실 수 있나요?

답변1

내가 쉘에 cd를 입력했다고 가정하자. 지금 CD가 메모리에서 로드됩니까? 내 직감으로는 이러한 내장 명령이 커널이 로드된 후 시스템 메모리에 미리 로드되지만 누군가는 실제로 명령을 호출할 때만 로드된다고 주장합니다...

대체로 말하면 다른 대답은 정확합니다. 내장형은 셸과 함께 로드되고 독립 실행형 프로그램은 호출될 때 로드됩니다. 그러나 매우 완고한 족제비 "누군가"는 그것이 그렇게 간단하지 않다고 주장할 수도 있습니다.

이 논의는 운영 체제가 작동하는 방식과 다양한 운영 체제가 서로 다른 방식으로 작동하는 방식에 관한 것이지만 일반적으로 다음 내용은 아마도 모든 최신 *nix에 적용 가능하다고 생각합니다.

첫째, "메모리에 로드됨"은 모호한 표현입니다.가상 주소 공간을 메모리에 매핑. "가상 주소 공간"은 메모리에 저장해야 하는 공간을 의미하지만 실제로는 원래의 공간과는 다르기 때문에 이것이 중요합니다. 실제로 메모리에 로드되는 대부분의 공간은지도 자체- 그리고지도는 영토가 아닙니다. "영역"은 디스크(또는 디스크 캐시)의 실행 파일이 될 것이며 실제로 대부분은아니요실행 파일을 호출할 때 메모리에 로드됩니다.

또한 대부분의 "영역"은 다른 영역(공유 라이브러리)에 대한 참조이며, 참조된다고 해서 실제로 로드된다는 의미는 아닙니다. 실제로 사용될 때까지는 로드되지 않으며, 실제로 로드해야 하는 부분만 성공적으로 "사용"됩니다.

예를 들어 다음은 topLinux 참조 인스턴스 bash의 출력 조각 입니다.

VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                  
113m 3672 1796 S  0.0  0.1   0:00.07 bash   

113MB VIRT는 가상 주소 공간입니다.매핑된기억 속에. 그러나 RES는 프로세스에서 소비하는 실제 RAM 양으로 3.7kB에 불과합니다. 이들 중 일부는 위에서 언급한 공유 영역(1.8kB SHR)의 일부입니다. 하지만 내 /bin/bash디스크 크기는 930kB이고 연결되는 기본 libc(공유 라이브러리)는 그 크기의 두 배입니다.

쉘은 현재 어떤 작업도 수행하지 않습니다. 앞서 쉘의 나머지 부분과 함께 "메모리에 로드"되었다고 말한 내장 명령을 호출한다고 가정해 보겠습니다. 커널은 맵의 특정 지점부터 관련된 모든 코드를 실행하기 시작하고 아직 실제로 로드되지 않은 코드에 대한 참조에 도달하면 이를 로드합니다.디스크의 실행 가능 이미지에서-- 보다 일반적인 의미에서도 실행 파일(셸, 독립 실행형 도구 또는 공유 라이브러리)은 이미 "메모리에 로드"되어 있습니다.

이것은 ... 불리운다페이징 요청.

답변2

나는 유력한 인물이 완전한 역사적 관점을 제공하기를 기다리는 동안, 내가 좀 더 제한된 이해를 여러분에게 제공할 것입니다.

aliascd기타 내장 명령은 셸 echo( 또는 기타 명령)의 일부 bash입니다 . 이는 쉘과 동시에 로드되며 단순히 해당 쉘의 내부 기능입니다.zshksh

답변3

내장 명령이 실제로 실행 파일의 일부로 로드된다는 것을 보여주기 위해 다음 실험을 수행했습니다 bash. 그래서 내장형이라고 부르지만 항상 무언가를 증명하는 가장 좋은 방법은 시연입니다.

  1. bash셸을 시작하고 해당 프로세스 ID(PID)를 기록해 둡니다.

    $ bash
    $ echo $$
    6402
    
  2. 두 번째 터미널에서 명령을 실행 하면 추가 메모리를 차지하기 시작 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 열은 메모리 사용량을 보여줍니다.

  3. 셸(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변화가 없는 것을 볼 수 있습니다. 유사한 프로그램을 실행할 때 추가 메모리 사용량이 표시되어서는 안 됩니다.

  4. 스트레스

    bash이는 실제 실행 파일이 아닌 내장 함수를 다루고 있음을 알려주는 또 다른 방법입니다 . 실행하려고 하면 strace cd ..다음 메시지가 표시됩니다.

    $ strace cd ..
    strace: cd: command not found
    

답변4

"내장 명령"은 별도의 프로그램이 아닌 셸에 내장된 명령입니다. ls예를 들어 실제로 내장된 명령이 아니라 별도의 프로그램입니다. 호출되면 이미 디스크 캐시에 있지 않는 한 RAM에 로드됩니다.

내장 명령의 예는 printf또는 입니다 cd. 이는 셸의 일부이며 나머지 셸과 함께 로드됩니다.

기본적으로 사전 로드되는 명령은 없지만 이를 수행하기 위해 시스템이 만들어졌습니다.

관련 정보