Katakanlah jika saya mengetikkan cd di shell saya. Apakah cd dimuat dari memori pada saat itu? Intuisi saya adalah bahwa perintah bawaan ini sudah dimuat sebelumnya ke memori sistem setelah kernel dimuat, tetapi seseorang bersikeras bahwa perintah itu dimuat hanya ketika saya benar-benar menjalankan perintah ...
Secara umum jawaban lain benar - built-in dimuat dengan shell, stand -one dimuat ketika dipanggil. Namun, "seseorang" musang yang sangat kuat bisa bersikeras bahwa itu tidak sesederhana itu.
Diskusi ini agak tentang bagaimana OS bekerja, dan OS yang berbeda bekerja dengan cara yang berbeda, tetapi saya pikir secara umum berikut ini mungkin benar untuk semua nix * kontemporer.
Pertama, "dimuat ke dalam memori" adalah frasa yang ambigu; benar-benar apa yang kita maksudkan adalah ruang alamat virtualnya dipetakan ke dalam memori . Ini penting karena "ruang alamat virtual" mengacu pada hal-hal yang mungkin perlu dimasukkan ke dalam memori, tetapi pada kenyataannya tidak pada awalnya: sebagian besar yang sebenarnya dimuat ke dalam memori adalah peta itu sendiri - dan peta itu bukan wilayah. "Wilayah" akan menjadi executable pada disk (atau dalam cache disk) dan, pada kenyataannya, sebagian besar dari itu mungkin tidak dimuat ke dalam memori ketika Anda menjalankan executable.
Juga, sebagian besar "wilayah" adalah referensi ke wilayah lain (perpustakaan bersama), dan sekali lagi, hanya karena mereka telah dirujuk tidak berarti mereka benar-benar dimuat juga. Mereka tidak dimuat sebelum mereka benar-benar digunakan, dan kemudian hanya potongan-potongan dari mereka yang benar-benar perlu dimuat agar "penggunaan" apa pun berhasil.
Sebagai contoh, berikut adalah potongan top
output di linux yang merujuk pada sebuah bash
instance:
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
VIRT 113 MB adalah ruang alamat virtual, yang dipetakan dalam RAM. Tetapi RES adalah jumlah aktual RAM yang dikonsumsi oleh proses - hanya 3,7 kB. Dan dari itu, beberapa adalah bagian dari wilayah bersama yang disebutkan di atas - 1,8 kB SHR. Tapi /bin/bash
disk saya di 930 kB, dan libc dasar itu terhubung ke (lib bersama) dua kali lebih besar lagi.
Shell itu tidak melakukan apa-apa sekarang. Katakanlah saya menjalankan perintah bawaan, yang kami katakan sebelumnya sudah "dimuat ke dalam memori" bersama dengan sisa dari shell. Kernel mengeksekusi kode apa pun yang terlibat mulai dari suatu titik di peta, dan ketika mencapai referensi ke kode yang belum benar-benar dimuat, kernel memuatnya - dari gambar yang dapat dieksekusi pada disk - meskipun secara lebih kasual akal, bahwa executable (baik itu shell, alat yang berdiri sendiri, atau perpustakaan bersama) sudah "dimuat ke dalam memori".
Ini disebut paging permintaan .