สมมุติว่าฉันพิมพ์ cd ลงใน shell ซีดีถูกโหลดจากหน่วยความจำในขณะนั้นหรือไม่? สัญชาตญาณของฉันคือคำสั่งในตัวเหล่านี้ถูกโหลดล่วงหน้าไปยังหน่วยความจำระบบหลังจากเคอร์เนลถูกโหลด แต่มีคนยืนยันว่าพวกเขาจะถูกโหลดเมื่อฉันเรียกใช้คำสั่งจริงเท่านั้น ...
ในแง่กว้างคำตอบอื่น ๆ ที่ถูกต้อง - ในตัวจะเต็มไปด้วยเปลือกหอยแบบสแตนด์อโลนจะถูกโหลดเมื่อเรียก อย่างไรก็ตามการพังพอนอย่างเหนียวแน่น "คน" สามารถยืนยันได้ว่ามันไม่ง่ายเลย
การสนทนานี้ค่อนข้างเกี่ยวกับการทำงานของระบบปฏิบัติการและวิธีการทำงานของ OS ที่แตกต่างกัน แต่ฉันคิดว่าโดยทั่วไปแล้วสิ่งต่อไปนี้น่าจะเป็นจริงสำหรับ nixes ร่วมสมัยทุกคน
ก่อนอื่น "โหลดเข้าสู่หน่วยความจำ" เป็นวลีที่ไม่ชัดเจน จริงๆสิ่งที่เราหมายถึงคือมีพื้นที่ที่อยู่เสมือนแมปลงในหน่วยความจำ สิ่งนี้มีความสำคัญเนื่องจาก "พื้นที่ที่อยู่เสมือน" หมายถึงสิ่งที่อาจต้องใส่ในหน่วยความจำ แต่ในความเป็นจริงไม่ได้เริ่มต้น: ส่วนใหญ่สิ่งที่โหลดลงในหน่วยความจำจริงคือแผนที่ตัวเอง - และแผนที่ไม่ใช่อาณาเขต "อาณาเขต" จะเป็นไฟล์เรียกทำงานบนดิสก์ (หรือในแคชดิสก์) และอันที่จริงส่วนใหญ่นั้นอาจไม่ได้โหลดลงในหน่วยความจำเมื่อคุณเรียกใช้ไฟล์ปฏิบัติการ
นอกจากนี้ "อาณาเขต" ส่วนใหญ่อ้างถึงอาณาเขตอื่น ๆ (ไลบรารีที่ใช้ร่วมกัน) และอีกครั้งเพียงเพราะพวกเขาถูกอ้างถึงไม่ได้หมายความว่าพวกเขากำลังโหลดอย่างแท้จริง พวกเขาจะไม่ถูกโหลดจนกว่าจะมีการใช้งานจริงและจากนั้นจะมีเฉพาะชิ้นส่วนของพวกเขาที่จำเป็นต้องโหลดเพื่อที่จะ "ประสบความสำเร็จ"
ตัวอย่างเช่นต่อไปนี้เป็นตัวอย่างของtop
เอาต์พุตบน linux ที่อ้างถึงbash
อินสแตนซ์:
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
VIRT 113 MB เป็นพื้นที่ที่อยู่เสมือนซึ่งถูกแมปใน RAM แต่ RES คือจำนวน RAM จริงที่ใช้โดยกระบวนการ - เพียง 3.7 kB และจากนั้นบางส่วนเป็นส่วนหนึ่งของอาณาเขตที่ใช้ร่วมกันที่กล่าวถึงข้างต้น - 1.8 kB SHR แต่/bin/bash
บนดิสก์ของฉันคือ 930 kB และ libc พื้นฐานมันเชื่อมโยงไปยัง (แชร์ lib) สองครั้งใหญ่อีกครั้ง
เปลือกนั่นไม่ได้ทำอะไรเลยในตอนนี้ สมมติว่าฉันเรียกใช้คำสั่งในตัวซึ่งเราบอกว่าก่อนหน้านี้ "โหลดเข้าสู่หน่วยความจำ" แล้วพร้อมกับเชลล์ที่เหลือ เคอร์เนลจะประมวลผลรหัสใด ๆ ที่เกี่ยวข้องโดยเริ่มจากจุดในแผนที่และเมื่อถึงการอ้างอิงถึงรหัสที่ยังไม่ได้โหลดจริงๆมันจะโหลดมัน - จากอิมเมจที่เรียกใช้งานได้บนดิสก์ - แม้ว่าจะไม่เป็นทางการ ความรู้สึกที่สามารถเรียกใช้งานได้ (ไม่ว่าจะเป็นเชลล์เครื่องมือแบบสแตนด์อะโลนหรือไลบรารีแบบแบ่งใช้) ได้ถูก "โหลดเข้าสู่หน่วยความจำ" แล้ว
นี้เรียกว่าความต้องการของเพจ