Libro

Operating Systems: Three Easy Pieces: ตำรา OS ที่อ่านฟรีได้ทีละบท เหมาะกับใคร

ตำราระบบปฏิบัติการของ Remzi และ Andrea Arpaci-Dusseau แบ่งเป็นสามแกน virtualization, concurrency และ persistence บทความนี้อ่านบางบทจากฉบับออนไลน์ที่ผู้เขียนเผยแพร่ฟรี ได้แก่ คำนำ บทที่ 2, 26 และ 28

ภาพประกอบบทความ: ปกหนังสือ Operating Systems: Three Easy Pieces โดย Remzi H. Arpaci-Dusseau & Andrea C. Arpaci-Dusseau

ขอบเขตของบทความ: อ่านบางบทจากฉบับออนไลน์ที่ผู้เขียนเผยแพร่ฟรี ได้แก่ คำนำ บทที่ 2 Introduction บทที่ 26 Concurrency: An Introduction และบทที่ 28 Locks รวมกับสารบัญจากหน้าเว็บของหนังสือ บทอื่นสรุปจากชื่อบทเท่านั้น

นักพัฒนาที่เขียนระบบเทรดหรือระบบประมวลผลข้อมูลตลาดมักเจอปัญหาที่ต้นเหตุอยู่ใต้โค้ดของตัวเอง เช่น thread หลายตัวแก้ตัวแปรเดียวกันแล้วผลไม่ตรง lock ที่ทำให้ระบบช้าลง หรือข้อมูลที่เขียนลงดิสก์แล้วหายเมื่อเครื่องดับ ความเข้าใจระบบปฏิบัติการช่วยให้เห็นที่มาของปัญหาเหล่านี้ บทความนี้ช่วยดูว่าเล่มนี้สอนอะไร เขียนแบบไหน และควรมีพื้นฐานอะไรก่อน

หนังสือเล่มนี้ว่าด้วยอะไร

Operating Systems: Three Easy Pieces หรือที่เรียกกันว่า OSTEP เขียนโดย Remzi H. Arpaci-Dusseau และ Andrea C. Arpaci-Dusseau อาจารย์ด้านวิทยาการคอมพิวเตอร์ที่ University of Wisconsin-Madison บทด้านความปลอดภัยชุดใหม่เขียนโดย Peter Reiher จาก UCLA (หน้าเว็บของหนังสือ)

หน้าเว็บระบุว่าฉบับ PDF รายบทเผยแพร่ฟรีและจะฟรีต่อไป ส่วนฉบับพิมพ์มีทั้งปกแข็งผ่าน Lulu และปกอ่อนผ่าน Amazon หน้าเว็บระบุฉบับปัจจุบันเป็น version 1.10 คำนำอธิบายว่าคำว่าฟรีในที่นี้ไม่ได้แปลว่าเป็น open source หนังสือยังมีลิขสิทธิ์ตามปกติ แต่ผู้อ่านนำบทต่าง ๆ ไปใช้เรียนได้ (คำนำ)

ชื่อหนังสือตั้งตาม Six Easy Pieces ของ Richard Feynman และสามชิ้นในชื่อคือสามแกนของเล่ม ได้แก่ virtualization, concurrency และ persistence

เนื้อหาครอบคลุมหัวข้ออะไร

สารบัญบนหน้าเว็บแบ่งเป็นส่วนต่าง ๆ ดังนี้ (หน้าเว็บของหนังสือ):

ส่วน

บท

หัวข้อตัวอย่างตามสารบัญ

Intro

1–2

Dialogue, Introduction

Virtualization

3–24

Processes, Process API, CPU Scheduling, Multi-level Feedback, Address Translation, Paging, TLB, Swapping

Concurrency

25–34

Threads, Locks, Condition Variables, Semaphores, Concurrency Bugs, Event-based Concurrency

Persistence

35–51

Hard Disk Drives, RAID, File System Implementation, FSCK and Journaling, Flash-based SSDs, NFS, AFS

Security

52–57

Authentication, Access Control, Cryptography, Distributed Security

Appendices

–

Virtual Machines, Monitors, Lab Tutorial, xv6 Labs

คำนำอธิบายเหตุผลที่วาง concurrency ไว้หลัง virtualization ซึ่งต่างจากตำรา OS หลายเล่ม ผู้เขียนพบจากการสอนมาเกือบ 20 ปีว่านักศึกษาเข้าใจปัญหา concurrency ได้ยาก ถ้ายังไม่รู้ว่า address space และ process คืออะไร หรือทำไม context switch จึงเกิดได้ทุกเมื่อ

วิธีเขียนของเล่มนี้

จากคำนำและบทที่อ่าน เล่มนี้ใช้เครื่องมือการเล่าซ้ำ ๆ หลายอย่าง:

  • The crux of the problem กล่องที่ระบุปัญหาหลักของแต่ละเรื่องก่อนเสนอวิธีแก้ เช่น บทที่ 2 ตั้งคำถามว่า OS virtualize ทรัพยากรอย่างไร

  • บทสนทนา (dialogue) ใช้เปิดแต่ละส่วนใหญ่และทบทวนเนื้อหาด้วยน้ำเสียงที่เป็นกันเอง

  • โค้ดจริงแทน pseudocode ตัวอย่างเกือบทั้งหมดเป็นภาษา C ที่พิมพ์ตามแล้วรันได้ โค้ดอยู่ใน repository ของผู้เขียน

  • Homework แบบ simulator เปลี่ยน random seed เพื่อสร้างโจทย์ใหม่ได้เรื่อย ๆ และสั่งให้เฉลยได้

  • Projects มีสองแบบ คือ systems programming สำหรับคนที่เพิ่งเริ่ม C และ UNIX กับโปรเจกต์บน xv6 ซึ่งเป็น kernel สำหรับสอนที่พัฒนาที่ MIT

แนวคิดที่น่าสนใจจากบทที่อ่าน

บทที่ 2 Introduction (PDF) อธิบายว่า OS ทำสามอย่างหลัก คือแปลงทรัพยากรจริงอย่าง CPU หน่วยความจำ และดิสก์ให้เป็นรูปแบบเสมือนที่ใช้ง่ายขึ้น จัดการปัญหา concurrency และเก็บข้อมูลให้คงอยู่ จากนั้นวางเป้าหมายการออกแบบไว้หลายข้อ ได้แก่ การสร้าง abstraction ที่ใช้ง่าย ประสิทธิภาพสูงหรือ overhead ต่ำ การป้องกันโปรแกรมไม่ให้กระทบกันเอง ความน่าเชื่อถือ และเป้าหมายอื่นอย่างการประหยัดพลังงานและความปลอดภัย บทนี้ยังบอกด้วยว่าเล่มจะไม่ลงลึกเรื่องโค้ดเครือข่ายและอุปกรณ์กราฟิก

บทที่ 26 Concurrency: An Introduction (PDF) ใช้ตัวอย่างสอง thread ที่บวกตัวแปร counter คนละ 10 ล้านครั้ง ผลที่ควรได้คือ 20,000,000 แต่ผลที่รันจริงในบทได้ค่าต่ำกว่านั้นและไม่เท่ากันในแต่ละรอบ ผู้เขียนแตกคำสั่ง counter = counter + 1 ออกเป็นสามคำสั่ง assembly แล้วแสดงว่า timer interrupt ที่เกิดระหว่างกลางทำให้การบวกหายไปได้ บทนี้นิยามคำสำคัญสี่คำ ได้แก่ critical section, race condition, indeterminate และ mutual exclusion

บทที่ 28 Locks (PDF) วางเกณฑ์ประเมิน lock ไว้สามข้อ คือ ให้ mutual exclusion ได้จริงหรือไม่ ยุติธรรมกับ thread ที่รออยู่หรือไม่ และเพิ่ม overhead แค่ไหนทั้งกรณีไม่มีการแย่งและกรณีหลาย CPU จากนั้นไล่สร้าง lock ด้วย hardware primitive ได้แก่ test-and-set, compare-and-swap, load-linked/store-conditional และ fetch-and-add ก่อนชี้ว่า spin lock แบบง่ายไม่รับประกันความยุติธรรม และเปลืองรอบ CPU มากบนเครื่อง CPU เดียว ช่วงท้ายของบทจึงไปที่การ yield การใช้คิวให้ thread หลับแทนการ spin และ two-phase lock

สำหรับคนที่เขียนระบบซึ่งหลาย thread ใช้ข้อมูลร่วมกัน เช่น ตัวรับข้อมูลราคาที่ส่งต่อให้ตัวคำนวณสัญญาณ บทที่ 26 และ 28 ให้ภาพที่ชัดว่าข้อผิดพลาดแบบนี้เกิดจากอะไร ข้อเชื่อมโยงกับงานเทรดนี้เป็นความเห็นของบทความ ไม่ได้มาจากหนังสือ

พื้นฐานที่ควรมีก่อนอ่าน

บทที่ 2 บอกไว้ตรง ๆ ว่าผู้อ่านควรรู้อยู่แล้วว่าโปรแกรมทำงานอย่างไรเมื่อรัน ถ้ายังไม่รู้ ผู้เขียนแนะนำให้อ่านพื้นฐานก่อน โดยยกตัวอย่างหนังสือของ Patt & Patel และ Bryant & O'Hallaron

คำนำระบุว่าโค้ดและโปรเจกต์ทั้งหมดเป็นภาษา C ผู้ที่ไม่เคยเขียน C อ่านเนื้อหาหลักได้ แต่จะได้ประโยชน์จาก homework และ projects น้อยลง ส่วนในบทที่ 26 มีการอ่าน assembly x86 สั้น ๆ ด้วย

เหมาะกับใคร และใครควรเริ่มจากเล่มอื่นก่อน

  • เหมาะ กับนักศึกษาที่เรียนวิชา OS ระดับปริญญาตรี ซึ่งเป็นกลุ่มผู้อ่านหลักที่คำนำพูดถึง และนักพัฒนาที่อยากเข้าใจ process, memory, thread และ file system อย่างเป็นระบบ

  • เหมาะ กับคนที่อยากลองอ่านก่อนตัดสินใจ เพราะทุกบทเปิดอ่านได้ฟรีบนหน้าเว็บของผู้เขียน

  • ควรเริ่มจากเล่มอื่นก่อน ถ้ายังไม่เข้าใจว่า CPU ทำงานกับคำสั่งและหน่วยความจำอย่างไร ตามที่บทที่ 2 แนะนำ

  • อาจไม่ตรงความต้องการ ถ้าต้องการลงลึกเรื่องเครือข่าย เพราะบทที่ 2 ระบุว่าเล่มไม่ครอบคลุมโค้ดเครือข่ายใน OS

ข้อจำกัดของข้อมูลที่ใช้ในบทความนี้

  • อ่านคำนำ บทที่ 2, 26 และ 28 จากฉบับออนไลน์ บทอื่นสรุปจากชื่อบทในสารบัญเท่านั้น

  • บทที่อ่านพิมพ์หัวกระดาษเป็น version 1.10 ส่วนคำนำที่เปิดอ่านพิมพ์เป็น version 1.20 ฉบับออนไลน์จึงมีการปรับปรุงต่อเนื่อง ฉบับในแคตตาล็อกของ Libro อ้างปี 2014 และ ISBN 9781105979125 ซึ่งยังยืนยันจากแหล่งที่เปิดได้ไม่ได้ และภาพปกในโฟลเดอร์ไม่ใช่ปกรูปดาวหาง Halley ที่คำนำกล่าวถึง จึงน่าจะเป็นฉบับพิมพ์รุ่นเก่ากว่า ควรยืนยันฉบับอีกครั้งตอนสอบถาม

  • บทความนี้ไม่ได้รันโค้ดหรือ homework ใด ๆ

แหล่งอ้างอิง

  • ปกหนังสือ Operating Systems: Three Easy Pieces

    Operating Systems: Three Easy Pieces

    Remzi H. Arpaci-Dusseau & Andrea C. Arpaci-Dusseau

    ผู้เขียนเผยแพร่ทุกบทเป็น PDF ฟรี เนื้อหาแบ่งเป็น virtualization, concurrency และ persistence พร้อมโค้ด C และ homework แบบ simulator

    ดูรายละเอียด

บทความนี้อ่านจบได้ในตัวเอง หนังสือด้านบนคือจุดต่อยอดสำหรับผู้ที่ต้องการศึกษาลึกขึ้น

  • 25 ตุลาคม 2569

    The Art of R Programming: เขียน R ให้เป็นโปรแกรม ไม่ใช่แค่สั่งคำนวณ statistics

    หนังสือของ Norman Matloff ที่สอน R ในมุมการพัฒนาซอฟต์แวร์ ตั้งแต่ vector และ data frame ไปจนถึง debugging การเพิ่มสมรรถนะ และ parallel R บทความนี้สรุปจากสารบัญและบทที่ 3 ที่ No Starch Press เปิดให้อ่านตัวอย่าง

  • 25 ตุลาคม 2569

    Learning Python ฉบับที่ 6: ตำรา Python แกนภาษาสำหรับ Python 3.12

    Learning Python ฉบับที่ 6 ของ Mark Lutz ปรับเนื้อหาใหม่ให้ตรงกับ Python 3.12 ขึ้นไปและตัด Python 2 ออก บทความนี้สรุปจากหน้าหนังสือบนเว็บไซต์ผู้เขียน และอ่านตัวอย่างบทที่ 39 Decorators ที่ผู้เขียนเผยแพร่บนเว็บไซต์

  • 25 ตุลาคม 2569

    A Tour of C++ (ฉบับแรก): ภาพรวม C++11 ฉบับย่อจาก Bjarne Stroustrup

    หนังสือขนาดราว 180 หน้าของผู้ออกแบบภาษา C++ ที่สรุปทั้งตัวภาษาและ standard library ของ C++11 สำหรับโปรแกรมเมอร์ที่มีประสบการณ์ บทความนี้แนะนำขอบเขตเนื้อหาจากสารบัญบนหน้าสำนักพิมพ์และเว็บไซต์ผู้เขียน