สมมติว่าฉันกำลังใช้งานซอฟต์แวร์และจากนั้นฉันเรียกใช้ตัวจัดการแพคเกจเพื่ออัปเกรดซอฟต์แวร์ฉันสังเกตเห็นว่า Linux ไม่ลดขั้นตอนการทำงานสำหรับการอัปเกรดแพ็คเกจ - มันยังทำงานได้ดี Linux ทำสิ่งนี้ได้อย่างไร
สมมติว่าฉันกำลังใช้งานซอฟต์แวร์และจากนั้นฉันเรียกใช้ตัวจัดการแพคเกจเพื่ออัปเกรดซอฟต์แวร์ฉันสังเกตเห็นว่า Linux ไม่ลดขั้นตอนการทำงานสำหรับการอัปเกรดแพ็คเกจ - มันยังทำงานได้ดี Linux ทำสิ่งนี้ได้อย่างไร
คำตอบ:
เหตุผลก็คือ Unix ไม่ได้ล็อคไฟล์ที่เรียกใช้งานได้ในขณะที่ถูกเรียกใช้งานหรือแม้ว่ามันจะเหมือนกับ Linux การล็อคนี้จะใช้กับ inode ไม่ใช่ชื่อไฟล์ นั่นหมายความว่ากระบวนการที่เปิดอยู่นั้นเป็นการเข้าถึงข้อมูล (เก่า) เดียวกันแม้ว่าไฟล์นั้นจะถูกลบ (ไม่ได้เชื่อมโยงจริง) และถูกแทนที่ด้วยอันใหม่ที่มีชื่อเดียวกันซึ่งเป็นสิ่งสำคัญที่การอัพเดตแพ็คเกจทำได้
นั่นคือหนึ่งในความแตกต่างที่สำคัญระหว่าง Unix และ Windows หลังไม่สามารถอัปเดตไฟล์ที่ถูกล็อคเนื่องจากไม่มีเลเยอร์ระหว่างชื่อไฟล์และ inodes ทำให้เกิดความยุ่งยากในการอัปเดตหรือแม้กระทั่งการติดตั้งแพคเกจบางอย่างเนื่องจากมันมักจะต้องรีบูตเต็ม
โดยทั่วไปไฟล์เรียกทำงานจะเปิดขึ้นหนึ่งครั้งแนบมากับ file descriptor และไม่มี file descriptor ไปที่ไบนารีที่ถูกเปิดใหม่ในช่วงระยะเวลาหนึ่งของการเรียกใช้งาน ตัวอย่างเช่นถ้าคุณรันbash
, exec()
ทั่วไปเพียง แต่จะสร้างบ่งแฟ้มสำหรับ inode ชี้ไป/bin/bash
ครั้งเดียว - ในการภาวนา
บ่อยครั้งหมายความว่าสำหรับไบนารีแบบง่ายที่ไม่ได้พยายามอ่านตัวเองอีกครั้งในระหว่างการดำเนินการ (โดยใช้พา ธ ที่ถูกเรียกใช้) เนื้อหาที่ถูกแคชจะยังคงใช้งานได้เมื่ออินไลน์ห้อย ซึ่งหมายความว่าจะมีแบบจำลองของเวอร์ชันที่เรียกใช้งานได้ก่อนหน้านี้
ในกรณีที่ซับซ้อนกว่านี้อาจทำให้เกิดปัญหาได้ ตัวอย่างเช่นไฟล์กำหนดค่าอาจได้รับการอัปเกรดและอ่านใหม่ในภายหลังหรือโปรแกรมอาจทำการประมวลผลตัวเองอีกครั้งผ่านเส้นทางที่ถูกเรียกใช้งาน นอกจากนี้ยังอาจมีปัญหาหากโปรแกรมเชื่อมต่อระหว่างกันและอีกหนึ่งโปรแกรมจะถูกดำเนินการก่อนการอัปเกรดและอีกครั้งหนึ่งหลังจากนั้น นี่ก็เป็นจริงเช่นกันสำหรับห้องสมุดบางแห่ง
สำหรับกรณีที่ใช้งานง่าย แต่ก็ปลอดภัยที่จะอัปเกรดโดยไม่ต้องเริ่มกระบวนการใหม่
bash
ไบนารีมีประมาณ 200 4K หน้าไม่แน่ใจว่ามันถูกใช้ในเซสชันโดยเฉลี่ย
ialloc()
ing ไปยัง kernel kernel เมื่ออ่านไม่ใช่การแมปหน่วยความจำของหน้าเว็บ ฉันไม่ถูกต้องหรือไม่ที่คิดว่าในปัจจุบันระบบไฟล์ ext * inode ในที่สุดก็สอดคล้องกันในเคอร์เนล (และภายในระบบย่อย VM)?