내장 명령이 메모리에로드되는시기


11

cd쉘에 입력하면 되어 cd그 순간의 메모리에서로드? 내 직관은이 내장 명령이 커널이로드 된 후 시스템 메모리에 사전로드되지만 누군가가 실제로 명령을 호출 할 때만로드되도록 주장했습니다 (쉘에서 Enter 키를 누름). 이것을 설명하는 참조가 있는지 알려 주시겠습니까?


1
나는 이 답변 이 당신을 이해하는 데 도움 될 것이라고 생각 하지만, 그것은 중복되지는 않습니다.
CJM

@ cjm : 정말 좋은 설명이었습니다.
Forethinker

답변:


9

쉘에 cd를 입력한다고 가정 해 봅시다. 그때 메모리에서 cd가로드 되었습니까? 내 직감은이 내장 명령이 커널이로드 된 후 시스템 메모리에 사전로드되지만 누군가가 실제로 명령을 호출 할 때만로드되도록 주장했습니다 ...

넓은 의미에서 다른 대답은 정확합니다. 내장에는 셸이로드되고 독립형은 호출 될 때로드됩니다. 그러나 매우 끈적 거리는 족제비 "누군가"는 그렇게 단순하지 않다고 주장 할 수 있습니다.

이 토론은 OS의 작동 방식과 다른 OS의 작동 방식이 다소 다르지만 일반적으로 모든 현대 닉스에 대해 다음과 같은 사실이 일반적이라고 생각합니다.

먼저 "메모리에로드"는 모호한 문구입니다. 실제로 우리가 말하는 것은 가상 주소 공간이 메모리에 매핑되어 있다는 것 입니다. "가상 주소 공간"은 메모리에 배치해야 할 수있는 것을 의미하기 때문에 중요하지만 실제로는 처음에는 아닙니다. 실제로 실제로 메모리에로드되는 것은 대부분 맵 자체 이며 맵은 영역이 아닙니다. "영토"는 디스크 (또는 디스크 캐시)의 실행 파일이며 실제로 실행 파일을 호출 할 때 메모리에 대부분 로드 되지 않을 수 있습니다.

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

예를 들어, 다음 topbash인스턴스를 참조하는 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이며 기본 라이브러리는 (공유 라이브러리) 두 배 더 커집니다.

그 껍질은 지금 아무것도하고 있지 않습니다. 내장 명령을 호출한다고 가정 해 보겠습니다. 이전 명령은 나머지 쉘과 함께 이미 "메모리에로드되었습니다". - 코드는지도의 한 점에서 참여의 시작이며, 정말로드되지 않은 코드에 대한 참조를 도달 할 때, 그것을로드 어떤 커널이 실행 디스크의 실행 이미지에서 - 심지어 더 캐주얼하지만 해당 실행 파일 (쉘, 독립형 도구 또는 공유 라이브러리)이 이미 "메모리에로드되었습니다"라는 의미가 있습니다.

이를 수요 페이징 이라고 합니다.


9

헤비급 선수 중 하나가 와서 완전한 역사적 관점을 제시하기를 기다리는 동안, 나는 당신에게 더 제한된 이해를 줄 것입니다.

내장 같은 명령 alias, cd, echo등 쉘의 일부 ( bash, zsh, ksh또는 무엇이든). 그것들은 쉘과 동시에로드되며 단순히 그 쉘의 내부 기능입니다.


4

내장 된 명령이 실제로는 실행 파일의 일부로로드됨을 보여주기 위해 다음 실험을 수행했습니다 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. strace

    다음 bash은 실제 실행 파일이 아닌 내장 함수를 처리하고 있다는 것을 알려줍니다 . 시도하고 실행 strace cd ..하면 다음 메시지가 표시됩니다.

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

3

"내장 명령"은 별도의 프로그램이 아니라 셸에 내장 된 명령을 나타냅니다. ls예를 들어 실제로는 기본 제공 명령이 아니라 별도의 프로그램입니다. 디스크 캐시에없는 한, 호출 될 때 RAM에로드됩니다.

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

이를 위해 시스템이 작성되었지만 기본적으로 명령이 사전로드되어 있지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.