Shell-Builtin

內置命令何時載入到記憶體

  • September 14, 2013

假設我cd在 shell 中輸入。那一刻是cd從記憶體中載入的嗎?我的直覺是,這些內置命令是在核心載入後預載入到系統記憶體中的,但有人堅持說它們只有在我實際呼叫命令時才會載入(在 shell 上按輸入鍵)。您能否告訴我是否有參考資料可以解釋這一點?

假設我在 shell 中輸入 cd 。cd 在那一刻是從記憶體中載入的嗎?我的直覺是這些內置命令是在核心載入後預載入到系統記憶體中的,但有人堅持說只有在我實際呼叫命令時才會載入它們……

從廣義上講,其他答案是正確的 - 內置程序與外殼一起載入,獨立程序在呼叫時載入。然而,一個非常粘人的黃鼠狼“某人”可能會堅持認為事情沒有那麼簡單。

這個討論在某種程度上是關於作業系統如何工作的,並且不同作業系統的工作方式不同,但我認為總的來說,對於所有當代 *nixes,以下內容可能都是正確的。

首先,“載入記憶”是一個模棱兩可的片語;實際上,我們所指的是其虛擬地址空間映射到記憶體中。這很重要,因為“虛擬地址空間”是指可能需要放入記憶體中的東西,但實際上最初並非如此:實際上傳入到記憶體中的是地圖本身——而地圖不是領土。“領土”將是磁碟上(或磁碟記憶體中)的執行檔,事實上,當您呼叫執行檔時 ,其中大部分可能沒有載入到記憶體中。

此外,大部分“區域”是對其他區域(共享庫)的引用,同樣,僅僅因為它們被引用並不意味著它們也確實被載入。它們在實際使用之前不會被載入,然後只有實際需要載入的部分才能使“使用”成功。

例如,下面是toplinux 上引用bash實例的輸出片段:

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

113 MB VIRT 是映射到 RAM 中的虛擬地址空間。但 RES 是程序實際消耗的 RAM 量——只有 3.7 kB。其中,一些是上述共享區域的一部分——1.8 kB SHR。但是我/bin/bash在磁碟上的大小是 930 kB,它連結到(共享庫)的基本 libc 又是原來的兩倍。

那個shell現在沒有做任何事情。假設我呼叫了一個內置命令,我們之前說過,它已經與 shell 的其餘部分一起“載入到記憶體中”。核心從映射中的某個點開始執行涉及的任何程式碼,當它到達對尚未真正載入的程式碼的引用時,它會從磁碟上的可執行映像載入它——即使以更隨意的方式從某種意義上說,該執行檔(無論是外殼程序、獨立工具還是共享庫)已經“載入到記憶體中”。

這稱為請求分頁

引用自:https://unix.stackexchange.com/questions/90648