‹

05 · ระบบปฏิบัติการ

05 · ​ระบบปฏิบัติการ

​บท​นี้​คือ​ชั้น​ที่​วาง​อยู่​เหนือ​ตัว​เครื่อง​ขึ้น​มา​โดยตรง — ​ที่​ซึ่ง​โปรเซสเซอร์​ตัว​เดียว​ถูก​ทำให้​ทำตัว​เหมือน​มี​อยู่​เต็ม​ห้อง ​และ​ที่​ซึ่ง​เครื่อง​เลิก​เป็น​สมบัติ​ของ​โปรแกรม​ใด​โปรแกรม​หนึ่ง

​เครื่อง​เดียว​แสร้ง​ทำเป็น​หลาย​เครื่อง​อย่าง​ปลอดภัย​ได้​อย่างไร

​ระหว่าง​เดือน​มิถุนายน 1985 ​ถึง​มกราคม 1987 ​ผู้ป่วย​หก​คน​ที่รักษา​ด้วย​เครื่อง​ฉายรังสี​ชื่อ Therac-25 ​ได้รับ​รังสี​เกินขนาด​อย่าง​รุนแรง ​อย่าง​น้อย​สาม​คน​เสียชีวิต ​ตัว​เครื่อง​ไม่​ได้เสีย​ใน​แบบ​ที่​วิศวกร​มองเห็น​ได้ ​เครื่อง​รุ่น​ก่อนหน้า​มี​กลไก​ล็อก​ฮาร์ดแวร์ (hardware interlock) — ​อุปกรณ์​ทางกายภาพ​ที่​ทำให้​การตั้งค่า​อันตราย​เกิดขึ้น​ไม่​ได้ — ​และ​ใน Therac-25 ​อุปกรณ์​เหล่านั้น​ถูก​ถอด​ออก ​เพราะ​จะ​ให้​ซอฟต์แวร์​ตรวจสอบ​แทน Nancy Leveson ​และ Clark Turner ​พบ​ว่า​ซอฟต์แวร์​ตรวจสอบ​จริง ​แต่​งาน (task) ​ที่ทำงาน​พร้อมกัน​สอง​งาน​ใช้​ตัวแปร​ร่วมกัน​โดย​ไม่​มี​การซิง​โคร​ไน​ซ์ ​ผู้ปฏิบัติงาน​ที่​พิมพ์​เร็ว​จึง​เปลี่ยน​โหมด​การรักษา​ได้ ​หลัง​การตรวจสอบ​อ่าน​ค่า​ไป​แล้ว ​แต่ก่อน​ฮาร์ดแวร์​เคลื่อนที่​เสร็จ (Leveson & Turner, IEEE Computer, July 1993) ​ทั้งสอง​ยัง​บันทึก​ไว้​ด้วยว่า​เครื่อง​รัน​อยู่​บน​อะไร — "​ระบบ​นี้​ไม่​ได้​สร้าง​ขึ้น​ด้วย​ระบบปฏิบัติการ​หรือ executive ​มาตรฐาน ​แต่ real-time executive ​ถูก​เขียน​ขึ้น​มา​เฉพาะ​สำหรับ Therac-25" — ​โดย​โปรแกรมเมอร์​คนเดียว ​เขียน​ด้วย​ภาษา​แอสเซมบลี ​ตลอดเวลา​หลาย​ปี

​ประโยค​สุดท้าย​นั้น​คือ​เหตุผล​ที่​บท​นี้​มี​อยู่ ​ระบบปฏิบัติการ (operating system) ​ไม่​ใช่​ชั้น​อำนวยความสะดวก ​มัน​คือ​คำตอบ​สะสม​ของ​ปัญหา​สาม​ข้อ​ที่​อันตราย​ถึงตาย​หาก​ต้อง​แก้​ใหม่​จาก​ศูนย์ — ​เครื่อง​เดียว​ถูก​แบ่ง​กัน​ใช้​อย่างไร ​สิ่ง​ที่ทำงาน​พร้อมกัน​คง​ความสอดคล้อง​ไว้​อย่างไร ​และ​อะไร​รอด​จาก​การถูก​ปิด​เครื่อง Remzi ​และ Andrea Arpaci-Dusseau ​เรียก​สาม​ข้อ​นี้​ว่า ​การทำ​เสมือน (virtualization) ​การทำงาน​พร้อมกัน (concurrency) ​และ​ความคงอยู่​ของ​ข้อมูล (persistence) (Operating Systems: Three Easy Pieces) ​ไอเดีย​ที่​ร้อย​ทั้งหมด​เข้าด้วยกัน​คือ ​ระบบปฏิบัติการ​เป็น​เครื่อง​ที่​โกหก​อย่าง​ระมัดระวัง ​บริการ​ทุกอย่าง​ที่​มัน​เสนอ​คือ​ความเท็จ​เกี่ยวกับ​ชั้น​ข้างล่าง ​รักษา​ไว้​ดี​พอ​จะ​พึ่งพา​ได้

​คำ​โกหก​แรก​คือ​เรื่อง​เลขคณิต ​แล็ปท็อป​ของ​คุณ​มี​โปรเซสเซอร์​ไม่​กี่​ตัว ​แต่​รัน​โปรแกรม​อยู่​นับ​ร้อย ​แต่ละ​ตัวเขียน​ขึ้น​ราวกับ​มี​เครื่อง​ทั้ง​เครื่อง​เป็น​ของ​ตัวเอง ​ระบบปฏิบัติการ​ทำ multiplex — ​รัน​โปรแกรม​หนึ่ง​ไป​สอง​สาม​มิล​ลิ​วินาที ​บันทึก​ค่า​ใน​ทุก​รี​จิ​สเตอร์ ​โหลด​ค่า​ของ​อีก​โปรแกรม​เข้ามา ​และ​ปล่อย​ให้​ตัว​จับเวลา​ฮาร์ดแวร์​ขัดจังหวะ​มัน ​เพื่อ​ไม่​ให้​โปรแกรม​ไหน​ปฏิเสธ​ที่จะ​คืน​เครื่อง​ได้ ​คำ​โกหก​ที่​ใหญ่​กว่า​คือ​เรื่อง​หน่วยความจำ ​เครื่อง Atlas ​ที่ Manchester ​ซึ่ง​รัน​ใน​ปี 1962 ​เปิดตัว "​ระบบ​เก็บ​ข้อมูล​ชั้นเดียว" (one-level storage system) — ​โปรแกรม​อ้าง​ที่อยู่​ใน​พื้นที่​เก็บ​ข้อมูล​ที่​ใหญ่​กว่า​หน่วยความจำ​จริง​มาก ​และ​ฮาร์ดแวร์​ย้าย page ​ระหว่าง core ​กับ drum ​อย่าง​เงียบๆ (Kilburn, Edwards, Lanigan & Sumner, 1962) ​ทุก​โพรเซส (process) ​นับแต่​นั้น​ได้รับ​เรื่อง​แต่ง​เดียวกัน — ​หน่วยความจำ​เสมือน (virtual memory) ​อย่าง​ที่​ลูกหลาน​ทุก​ตัว​เรียก​กัน ​คือ​พื้นที่​ที่อยู่​ส่วนตัว ​เริ่ม​จาก​ศูนย์ ​ดูเหมือน​เป็น​ของ​มัน​เอง​ทั้งหมด ​โปรแกรม​สอง​ตัว​ถือ "address 4096" ​เดียวกัน​ได้​โดย​ไม่​มี​วัน​เจอกัน

​คำ​โกหก​ปลอดภัย​ก็ต่อเมื่อ​มัน​ถูก​ตรวจสอบ​จาก​ข้างใน​ไม่​ได้ ​ตรงนี้​เอง​ระบบปฏิบัติการ​ต้อง​พึ่ง​ชั้น​ข้างล่าง ​เคอร์เนล (kernel) ​ไม่​ได้​มี​สิทธิพิเศษ​เพราะ​ฉลาด​กว่า​โปรแกรม​ของ​คุณ ​มัน​มี​สิทธิพิเศษ​เพราะ​โปรเซสเซอร์​ปฏิเสธ​คำสั่ง​เครื่อง​บาง​ตัว ​เว้นแต่​มี​การตั้ง mode bit ​ไว้ Multics ​นิยาม​วงแหวน​การป้องกัน (ring) ​แบบนี้​ไว้​แปด​ชั้น x86 ​รับ​ไอเดีย​นี้​มา​ด้วย​สี่​ชั้น ​และ​ระบบ​กระแส​หลัก​ใช้​จริง​สองชั้น — ​เคอร์เนล​กับ​ผู้ใช้ (Multics protection) instruction set ​ของ​บท​ที่ 04 ​ไม่​รู้​ว่า​โพรเซส (process) ​คือ​อะไร ​มัน​รู้​แค่​ว่า​คำสั่ง​เครื่อง​บาง​ตัว​ถูก​ห้าม​ใน​โหมด​นอก ​และ​การพยายาม​รัน​มัน​ทำให้เกิด trap ​ทุก​เรื่อง​เกี่ยวกับ isolation ​ความปลอดภัย ​และ multi-tenancy ​สร้าง​ขึ้น​จาก​ท่าที​เดียว​ของ​ฮาร์ดแวร์​ท่า​นี้

​ปัญหา​ที่สอง ​การทำงาน​พร้อมกัน (concurrency) ​คือ​สิ่ง​ที่​ฆ่า​ผู้ป่วย Therac ​พอ​สอง​สิ่ง​ทำงาน​พร้อมกัน​และ​แตะ​ข้อมูล​ก้อน​เดียวกัน ​ความถูกต้อง​เลิก​เป็นคุณ​สมบัติ​ของ​ฝ่ายใดฝ่ายหนึ่ง​ลำพัง Edsger Dijkstra ​มอบ​เครื่องมือ​พื้นฐาน​ให้​วงการ​นี้​ใน​ปี 1965 ​คือ semaphore ​ใน​บันทึก​ชื่อ "Cooperating Sequential Processes" ​และ​ใช้​มัน​สร้าง​ระบบ THE ​ที่​แบ่ง​เป็น​ชั้น (CACM, May 1968) ​แต่ mutual exclusion ​แลก​ความล้มเหลว​แบบ​หนึ่ง​ไป​กับ​อีก​แบบ​หนึ่ง ​โพรเซส​ที่​ถือ​ล็อก (lock) ​ตัว​หนึ่ง​ไว้​ระหว่าง​รอ​ล็อก​ตัว​ที่สอง ​อาจ​รอ​ไป​ตลอดกาล Coffman, Elphick ​และ Shoshani ​ตั้งชื่อ​เงื่อนไข​สี่​ข้อ​ที่​ต้อง​เป็นจริง​พร้อมกัน​ทั้งหมด​จึง​จะ​เกิด deadlock — mutual exclusion, hold-and-wait, no preemption ​และ circular wait — ​ใน ACM Computing Surveys ​ปี 1971 (System Deadlocks) ​ตัด​ข้อ​ใด​ข้อ​หนึ่ง​ออก deadlock ​ก็​เป็นไปไม่ได้ ​นั่น​ยัง​คือ​วิธี​จัดการ​กับ​มัน​จนถึง​ทุกวันนี้ ​สังเกตว่า​ระบบปฏิบัติการ​เสนอ​อะไร​ให้ ​ไม่​ใช่​การกำ​จัด​ความยาก ​แต่​เป็น primitive ​ที่​ถูกต้อง​พอ​จะ​ต่อยอด​ได้ ​การอ่าน Therac-25 ​อย่าง​ตรงไปตรงมา​คือ ​วิศวกร​ที่​ปฏิเสธ​เครื่องมือ​เหล่านี้ ​กำลัง​นั่ง​คิดค้น​ปี 1965 ​ขึ้น​มา​ใหม่​คนเดียว ​ภายใต้ deadline

​คำ​โกหก​ที่สาม​คือ ​ที่เก็บ​ข้อมูล​จดจำ​ได้ ​มัน​จำได้​จริง — ​แต่​ไฟ​ถูก​ตัด​ได้​ระหว่าง​คำสั่ง​เครื่อง​สอง​ตัว​ใดๆ ​รวมถึง​สอง​ตัว​ที่จะ​ทิ้ง​ดิสก์​ไว้​ใน​สถานะ (state) ​ที่​สมเหตุสมผล ​คำตอบ​ของ​ระบบปฏิบัติการ​คือ fsync ​ซึ่ง​จะ return ​ก็ต่อเมื่อ​ข้อมูล​ไป​ถึง​อุปกรณ์​แล้ว ​และ​ระบบ​ไฟล์ (file system) ​ที่​จด journal ​ความตั้งใจ​ของ​ตัวเอง​ไว้ ​เพื่อให้ operation ​ที่​ค้าง​อยู่​ครึ่ง​เดียว​ถูก​เล่น​ซ้ำ​หรือ​ย้อนกลับ​ได้ ​นามธรรม (abstraction) ​ตัว​นี้​รั่ว​อย่าง​หนัก — fsync ​บน​ไฟล์​ใหม่​ไม่​ได้​ทำให้ directory entry ​ของ​ไฟล์​นั้น​คงทนถาวร​ไป​ด้วย ​คุณ​ต้อง sync ​ไดเรกทอรี​แม่​ด้วย ​เมื่อ Pillai ​และ​เพื่อนร่วมงาน​ตรวจสอบ​ว่า​แอปพลิเคชัน​ที่​ใช้​กัน​แพร่หลาย 11 ​ตัว​มี​พฤติกรรม​อย่างไร​เมื่อ​เครื่อง crash ​พวกเขา​พบ​ช่องโหว่​ตอน crash ​ที่​ต่างกัน 60 ​จุด (All File Systems Are Not Created Equal, OSDI 2014) ​โปรแกรม​พวก​นี้​ไม่​ใช่​ของ​มือสมัครเล่น ​ผิว (surface) ​บอก​ว่า "​บันทึก​แล้ว" ​มี​แต่​ชั้น​ข้างล่าง​เท่านั้น​ที่​รู้​ว่า​จริง​หรือเปล่า

​กฎ​การออกแบบ​ข้อ​เดียว​ยึด​ทุกอย่าง​ไว้​ด้วยกัน ​คือ​แยก ​กลไก (mechanism) ​ออกจาก ​นโยบาย (policy) ​เคอร์เนล​จัดหา​กลไก​ให้​ทำ​สิ่ง​หนึ่ง ​และ​ปล่อย​การตัดสินใจ​ว่า​จะ​ทำ​อะไร​ให้​เป็นเรื่อง​ของ​สิ่ง​ที่อยู่​เหนือ​มัน​ขึ้นไป Hydra ​ระบุ​เรื่อง​นี้​เป็นหลัก​การออกแบบ​ตั้งแต่​ปี 1974 (Wulf et al., CACM 17, no. 6) ​และ "Hints for Computer System Design" ​ของ Butler Lampson ​ทำให้​มัน​เป็น​สามัญสำนึก​ภายใน​ปี 1983 ​เหตุผล​นั้น​ง่าย — ​นโยบาย​เปลี่ยน​เร็ว​กว่า​กลไก​มาก ​และ​เคอร์เนล​ที่​ฝัง​ความชอบ​เรื่อง scheduling ​หรือ​แบบจำลอง​ความปลอดภัย​ไว้​ตายตัว ​ต้อง​ถูก​เขียน​ใหม่​ทุกครั้งที่​ความเห็น​ขยับ ​อินเทอร์เฟซ​ที่​ได้​ออกมา​แคบ​เมื่อ​เทียบ​กับ​สิ่ง​ที่​มัน​แบก​ไว้ — ​ตาราง system call ​ของ x86-64 ​ใน Linux source ​ปัจจุบัน​มี 385 ​รายการ (kernel source, checked 1 August 2026) ​ทุกอย่าง​ที่​คุณ​เคย​รัน​ผ่าน​ประตู​บาน​นั้น​มา​แล้ว

​คนใน​เรื่อง​นี้​สืบทอด​กัน​มา​โดยตรง Fernando Corbató ​สาธิต Compatible Time-Sharing System ​ที่ MIT ​ใน​ปี 1961 ​และ​นำ​ทีม Multics ​ต่อ ​ความทะเยอทะยาน​ของ​มัน​คือ​ขาย​การคำนวณ​อย่าง​ที่​ขาย​ไฟฟ้า — ​สาธารณูปโภค​ที่​เปิด​ตลอดเวลา ​แบ่ง​กัน​ใช้​ระหว่าง​คนแปลกหน้า Bell Labs ​ถอนตัว​ใน​ปี 1969 ​และ​เรื่องเล่า​ของ Dennis Ritchie ​ว่า​อะไร​เกิดขึ้น​ต่อมา​นั้น​ไม่​หรูหรา ​ทาง Labs ​ปฏิเสธ​จะ​ซื้อ​เครื่อง​ทดแทน ​ดังนั้น "​จึง​ไม่ต้อง​ใช้เวลานาน​นัก​ที่ Thompson ​จะ​หา PDP-7 ​เครื่อง​หนึ่ง​ที่​แทบ​ไม่​มี​ใคร​ใช้​เจอ" ("it did not take long, therefore, for Thompson to find a little-used PDP-7") (Ritchie, The Evolution of the Unix Time-sharing System) Ken Thompson ​เขียน Unix ​ตัว​แรก​ลง​เครื่อง​นั้น​ใน​เวลา​ประมาณ​หนึ่ง​เดือน ​ใน​ฤดูร้อน​ปี 1969 ​ขณะ​ภรรยา​ไม่​อยู่​บ้าน — "​โดย​พื้นฐาน​แล้ว​คือ​คน​คนเดียว​ทำเป็น​เวลา​หนึ่ง​เดือน ​มี​แค่​ผม​คนเดียว​เท่านั้น" ("essentially one person for a month, it was just myself") ​เขา​เล่า​ไว้​ใน​ภายหลัง (oral history, 1989) Multics ​พยายาม​ระบุ​ทุกอย่าง​ไว้​ล่วงหน้า ​ส่วน Unix ​เล็ก​เพราะ​ไม่​มี​งบ​ให้​ใหญ่ ​และ​ตัว​ที่​เล็ก​กว่า​นั่นเอง​ที่​แพร่​ออก​ไป Thompson ​กับ Ritchie ​ได้รับ​รางวัล Turing Award ​ใน​ปี 1983 ​ส่วน Corbató ​ได้รับ​ใน​ปี 1990

​เชื่อมโยง

​ชั้นล่าง​คือ​บท​ที่ 04 ​ซึ่ง​จัดหา​ทุกอย่าง​ที่​ทำให้​ภาพลวงตา​นี้​บังคับใช้​ได้​จริง — ​โหมด​สิทธิพิเศษ ​การขัดจังหวะ​ของ​ตัว​จับเวลา ​และ​ฮาร์ดแวร์​แปล​ที่อยู่ ​เหนือ​ขึ้นไป ​บท​ที่ 06 ​คอมไพล์​โปรแกรม​โดย​อิง​กับ abstraction ​ของ​โพรเซส​ที่​อธิบาย​ไว้​ใน​บท​นี้ ​บท​ที่ 07 ​พา​สัญชาตญาณ​เดียวกัน​ขึ้นไป​อีก​ชั้น — ​ซ่อน​การตัดสินใจ​ที่จะ​เปลี่ยนแปลง ​เผยแพร่​แค่​อินเทอร์เฟซ — ​และ​บท​ที่ 08 ​ส่วนใหญ่​คือ​เรื่อง​ของ​แอปพลิเคชัน​หนึ่ง​ตัว​ที่​ปฏิเสธ​จะ​เชื่อ​การรับประกัน​ความคงอยู่​ของ​ข้อมูล (persistence) ​ของ​ชั้นนี้ ​และ​สร้าง​มัน​ขึ้น​มา​ใหม่​เอง ​บท​ที่ 10 ​ถาม​ว่า​จะ​เกิด​อะไร​ขึ้นกับ​ทั้งหมด​นี้ ​เมื่อ "​เครื่อง​เดียว" ​กลายเป็น​เครื่อง​นับ​พัน ​และ​บท​ที่ 11 ​มอง​พรมแดน​ของ​เคอร์เนล​เป็น​เส้น​ที่​ผู้​โจมตี​พยายาม​ข้าม

​คำถาม​ที่​ยัง​เปิด​อยู่

​เคอร์เนล​ยัง​เป็นที่​ที่​ถูกต้อง​สำหรับ​วาง​พรมแดน​นี้​อยู่​หรือไม่ microkernel, unikernel ​และ virtual machine ​ที่อยู่​ใน​เคอร์เนล ​ต่าง​ขยับ​เส้น​นี้​กัน​ไป​คนละ​ทาง ​และ​ยัง​ไม่​มี​ตัว​ไหน​ยุติ​ข้อ​ถกเถียง​ได้ abstraction ​ของ​โพรเซส​ถูก​ออกแบบ​มา​สำหรับ​เครื่อง​ที่​ฮาร์ดแวร์​สำคัญ​คือ CPU ​แต่​ทุกวันนี้​งาน​ส่วนใหญ่​เกิดขึ้น​บน​ตัวเร่ง (accelerator) ​ที่​เคอร์เนล​แทบ​ไม่​ได้​จัด​คิว​ให้ ​และ​ทำไม​หลัง​ผ่าน​มา​หกสิบ​ปี ​การทำงาน​พร้อมกัน (concurrency) ​ยัง​เป็น​จุด​ที่​วิศวกร​ที่​รอบคอบ​มีโอกาส​ผิดพลาด​มาก​ที่สุด

​อ่าน​ต่อ

บทถัดไป · 7 / 1606 · ภาษาและคอมไพเลอร์
Size
Page
Font

The Tower of Abstractions — An Encyclopedia of the Computing Disciplines

❦
100 · แผนที่201 · ทฤษฎีการคำนวณ302 · อัลกอริทึมและโครงสร้างข้อมูล403 · สารสนเทศและการเข้ารหัส504 · สถาปัตยกรรมคอมพิวเตอร์605 · ระบบปฏิบัติการ706 · ภาษาและคอมไพเลอร์807 · วิศวกรรมซอฟต์แวร์908 · ฐานข้อมูล1009 · เครือข่าย1110 · ระบบกระจาย1211 · ความปลอดภัยและวิทยาการรหัสลับ1312 · ปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง1413 · ปฏิสัมพันธ์มนุษย์–คอมพิวเตอร์ และกราฟิกส์1514 · พรมแดน1699 · ปิดเล่ม — หอคอยเมื่อมองทั้งหลัง