Katakanlah jika saya mengetikkan cd
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 itu hanya dimuat ketika saya benar-benar menjalankan perintah (tekan enter pada shell). Bisakah Anda memberi tahu saya jika ada referensi yang menjelaskan hal ini?
shell-builtin
Forethinker
sumber
sumber
Jawaban:
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 sebuahbash
instance: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 .
sumber
Sambil menunggu salah satu kelas berat datang dan memberikan perspektif sejarah penuh, saya akan memberi Anda pemahaman saya yang lebih terbatas.
Built-in perintah seperti
alias
,cd
,echo
dll adalah bagian dari shell Anda (bash
,zsh
,ksh
atau apa pun). Mereka dimuat pada saat yang sama shell dan hanya fungsi internal shell itu.sumber
Saya melakukan percobaan berikut untuk menunjukkan bahwa perintah builtin sebenarnya dimuat sebagai bagian dari exectuable
bash
. Karena itulah mengapa mereka disebut builtin, tetapi demo selalu merupakan cara terbaik untuk membuktikan sesuatu.Contoh
Mulai
bash
shell baru , dan catat ID prosesnya (PID):Di terminal kedua jalankan
ps
perintah sehingga kita dapat menonton dan melihat apakahbash
mulai mengambil memori tambahan:Outputnya terlihat seperti ini:
CATATAN: Penggunaan memori ditunjukkan dengan kolom SZ & RSS di sini.
Mulai menjalankan perintah di shell (pid 6402):
Ketika Anda di
cd
sekitar Anda akan melihat memori sebenarnya naik, tetapi ini bukan karena dieksekusicd
dimuat ke dalam memori, melainkan ini karena struktur direktori pada disk semakin dimuat ke dalam memori. Jika Anda teruscd
ke direktori lain Anda akan melihatnya secara bertahap terus naik.Anda dapat melakukan lebih banyak tes rumit seperti ini:
Perintah ini akan naik satu tingkat dan kemudian kembali ke direktori 90609 1000 kali. Saat menjalankan ini jika Anda memantau penggunaan memori di
ps
jendela Anda akan melihat bahwa itu tidak berubah. Saat menjalankan sesuatu seperti ini, tidak ada penggunaan memori tambahan yang harus diperhatikan.strace
Berikut ini adalah contoh lain bahwa kita sedang berurusan dengan fungsi builtin
bash
daripada eksekusi yang sebenarnya. Ketika Anda mencoba dan menjalankanstrace cd ..
Anda akan mendapatkan pesan berikut:sumber
"perintah bawaan" mengacu pada perintah yang ada di dalam shell, bukan sebagai program yang terpisah.
ls
, misalnya, sebenarnya bukan perintah bawaan tetapi program terpisah. Ini akan dimuat ke dalam RAM ketika dipanggil, kecuali sudah ada di cache disk.Contoh dari perintah bawaan adalah
printf
ataucd
. Ini adalah bagian dari shell, dan dimuat bersama dengan sisa shell.Tidak ada perintah yang dimuat sebelumnya secara default, meskipun sistem telah dibuat untuk melakukan ini.
sumber