บทที่ 4 · Secondary Storage บางส่วน

ชีท secondary_storage_mng3_3 หน้า 95–104 (10 หน้า) — อาจารย์เปิดในคลิปแค่ช่วงสั้นๆ นาที 23:05–23:50

🗣 อาจารย์พูดSecondary storage เรื่อง hard disk เรื่องการหมุนแม่เหล็ก จะไม่ออกสอบนะครับ
ระหว่างนั้นอาจารย์เปิดหน้า free-space management (bit vector) ผ่านๆ ส่วน allocation methods กับ disk scheduling ไม่ได้พูดถึงในคลิป
🎯 เป้าหมาย (เผื่อออก)เขียน bit vector ตามรูปแบบชีทได้ รู้วิธีจัดการพื้นที่ว่าง 4 แบบกับ allocation 3 แบบ และคำนวณ disk scheduling เป็น

4.1 ทำไมต้องมีหน่วยความจำสำรอง

🤔 Secondary storage คืออะไร

= ที่เก็บข้อมูลถาวร เช่น hard disk, SSD, เทป ใช้เก็บไฟล์และโปรแกรมเมื่อปิดเครื่อง ซึ่ง RAM ทำไม่ได้

🤔 Block คืออะไร

OS ไม่ได้จัดการดิสก์ทีละ byte แต่แบ่งดิสก์เป็นช่องขนาดเท่าๆ กันเรียกว่า block แล้วตั้งเลขกำกับ 0, 1, 2, … (คล้ายกับ frame ของ RAM) ไฟล์หนึ่งไฟล์ใช้ 1 block หรือหลาย block ก็ได้ ที่ต้องอ่านในบทนี้มี 2 เรื่อง คือ OS จำว่าบล็อกไหนว่าง (4.2) และวางไฟล์ลงบล็อกยังไง (4.3) ส่วน 4.4 disk scheduling พับเก็บไว้ ข้ามได้

เกทไหม? ลองตอบ
ทำไมต้องมี secondary storage
ข้อจำกัด 2 ข้อของหน่วยความจำหลักตามชีท: พื้นที่น้อย และ volatile

4.2 Free-space management

❓ ปัญหาคืออะไร

เวลาสร้างไฟล์ใหม่ OS ต้องรู้ว่าบล็อกไหนยังว่าง และเมื่อลบไฟล์ก็ต้องจดว่าบล็อกนั้นกลับมาว่าง วิธีจดรายการบล็อกว่างเรียกว่า free-space list ซึ่งมี 4 วิธี

⚙️ ตัวอย่างเดียวกันทั้ง 4 วิธี: ดิสก์ 12 บล็อก (0–11) ว่างอยู่ 2, 3, 4, 6, 8, 9, 10

  1. Bit vector: เขียนบิตเรียง 12 ตัว บล็อกว่าง = 0 และใช้แล้ว = 1 (ตามชีท) → 110001010001
    ข้อดีคือดูง่าย หาบล็อกว่างได้เร็ว ข้อเสียคือต้องเก็บบิตให้ทุกบล็อก (ดิสก์ใหญ่ก็ใช้ที่เยอะ)
  2. Linked list: จำแค่บล็อกว่างบล็อกแรก (2) ไว้เป็น head แล้วในบล็อก 2 เขียนว่าบล็อกว่างถัดไปคือ 3 → 4 → 6 → 8 → 9 → 10 → null
    ข้อดีคือไม่เปลืองที่ ข้อเสียคือถ้าจะหาบล็อกว่างหลายบล็อก ต้องไล่อ่านทีละบล็อก (ช้า)
  3. Grouping: บล็อกว่างแรกเก็บรายการเลขบล็อกว่าง N บล็อก ไว้ในตัวเลย (เช่น N = 3: บล็อก 2 เก็บ [3, 4, 6] และบล็อก 6 เก็บ [8, 9, 10]) จึงหาบล็อกว่างทีละหลายบล็อกได้เร็วกว่า linked list
  4. Counting: บล็อกว่างที่ติดกันนับเป็นกลุ่มเดียว เก็บแค่ (บล็อกเริ่ม, จำนวน) → (2, 3), (6, 1), (8, 3) ข้อดีคือสั้นมากเมื่อที่ว่างติดกันเป็นช่วงยาว
วิธีหลักการ
1. Bit vector (bit map)1 บิตต่อ 1 บล็อก — ชีทกำหนด ว่าง = 0, ถูกใช้ = 1
2. Linked listบล็อกว่างแรกเป็น free-space list head แต่ละบล็อกชี้ไปบล็อกว่างถัดไป บล็อกสุดท้ายชี้ null
3. Groupingบล็อกว่างแรกเก็บ address ของบล็อกว่าง N บล็อก และบล็อกสุดท้ายในกลุ่มเก็บ address ของ N บล็อกถัดไป
4. Countingนับเป็นกลุ่มบล็อกว่างที่ติดกัน (บล็อกเริ่ม + จำนวนบล็อก)
⚠️ ระวังตำราฝรั่ง (Silberschatz) ใช้ ว่าง = 1 แต่ชีทอาจารย์ใช้ ว่าง = 0 ให้ตอบตามชีท ตัวอย่างในชีท: 12 บล็อก ว่าง 2, 3, 4, 6, 8, 9, 10 → 110001010001
Q116 บล็อก (0–15) บล็อกว่างคือ 1, 2, 5, 6, 7, 10, 14 จงเขียน bit vector ตามชีท
1001100011011101 (ว่าง = 0)

4.3 Allocation methods

❓ ปัญหาคืออะไร

ไฟล์หนึ่งใช้หลายบล็อก OS ต้องเลือกว่าจะวางไฟล์ลงบล็อกไหน และจดไว้ที่ไหนว่าไฟล์นี้อยู่บล็อกอะไรบ้าง ข้อมูลนี้เก็บไว้ใน directory (สมุดรายชื่อไฟล์) ซึ่งมี 3 วิธีหลัก

⚙️ อ่านไฟล์แต่ละแบบยังไง

  • Contiguous (ติดกัน): ไฟล์ใช้บล็อกเรียงติดกัน directory จดแค่ (start, length) เช่น data1 = (0, 3) → อ่านบล็อก 0, 1, 2 ได้เลย และกระโดดไปบล็อกที่ k ได้ทันที (start + k) ข้อเสียคือต้องหาที่ว่างติดกันพอ จึงเกิด external fragmentation (เหมือนบทที่ 2)
  • Linked (ต่อกันเป็นโซ่): แต่ละบล็อกเก็บเลขบล็อกถัดไป directory จด (start, end) เช่น Data2: 11 → 14 → 16 → 5 → 4 (−1 = จบ) วางบล็อกไหนก็ได้ แต่ถ้าอยากอ่านบล็อกที่ 4 ต้องไล่จากบล็อกแรก
  • Indexed (มีสารบัญ): มี index block หนึ่งบล็อกที่เก็บเลขบล็อกทั้งหมดของไฟล์ เช่น Data3 มี index block = 15 ข้างในเขียน [17, 13, 2, 10] → อ่านสารบัญแล้วกระโดดไปบล็อกไหนก็ได้ทันที แต่เสียหนึ่งบล็อกทำ index
  • FAT (File Allocation Table): เป็นแบบ linked แต่ย้ายตัวชี้ "บล็อกถัดไป" ออกมาเก็บรวมในตารางเดียว เช่น directory บอก start = 200 → FAT[200] = 515 → FAT[515] = 300 → FAT[300] = end-of-file → ไฟล์อยู่บล็อก 200, 515, 300
แบบdirectory เก็บตัวอย่างในชีทข้อดี / ข้อเสีย
Contiguousstart + lengthdata1: start 0, length 3 → บล็อก 0, 1, 2อ่านเร็ว เข้าตรงได้ / เกิด external fragmentation และต้องเลือก hole (first/best/worst fit)
Linkedstart + endData2: 11 → 14 → 16 → 5 → 4 (−1 = จบ)ไม่มี external fragmentation / เข้าตรงไม่ได้ ต้องไล่ทีละบล็อก และเสียที่เก็บ pointer
Indexedindex blockData3: index block 15 = [17, 13, 2, 10]เข้าตรงได้ / เสียบล็อกทำ index
FATstart block200 → 515 → 300 → end-of-fileแบบ linked แต่เก็บ pointer ไว้ในตาราง
เกทไหม? ลองตอบ
วิธีวางไฟล์แบบใดที่กระโดดไปอ่านบล็อกที่ k ของไฟล์ได้ทันทีโดยไม่ต้องไล่จากบล็อกแรก
contiguous คำนวณได้จาก start + k ส่วน indexed ดูจาก index block ได้เลย แต่ linked ต้องไล่ตามตัวชี้ทีละบล็อก
FAT: directory บอก start = 7, FAT[7] = 3, FAT[3] = 9, FAT[9] = end-of-file ไฟล์ใช้บล็อกใดบ้างตามลำดับ (ตอบเช่น 1,2,3)
7 → 3 → 9

4.4 Disk scheduling ข้ามได้

อาจารย์บอกว่าเรื่อง hard disk ไม่ออกสอบ และไม่ได้พูดถึง disk scheduling เลย (เป็นเรื่องการเลื่อนหัวอ่านของ hard disk) จึงพับเก็บไว้ อ่านเฉพาะถ้ามีเวลาเหลือ

⏭ ข้ามได้ — เรื่องหัวอ่าน hard disk ที่อาจารย์บอกว่าไม่ออก (กดเพื่อเปิดดู)

🤔 คืออะไร

hard disk มีหัวอ่านที่ต้องเลื่อนไปยัง track (วงบนแผ่นดิสก์ ระบุด้วยเลข 0–199) ที่ต้องการก่อนจึงอ่านได้ การเลื่อนนี้ช้า (เรียกว่า seek time) เมื่อมีหลายคำขอรอในคิว OS จึงต้องเรียงลำดับว่าจะไปอ่าน track ไหนก่อน ให้หัวอ่านเลื่อนน้อยที่สุด เรียกว่า disk scheduling

⚙️ นับคะแนนยังไง

Total head movement = ผลรวมระยะที่หัวอ่านเลื่อนในแต่ละช่วง = Σ |ตำแหน่งถัดไป − ตำแหน่งปัจจุบัน| เช่น หัวอยู่ 53 แล้วไป 98 ระยะ = 45 tracks

⚙️ แต่ละวิธีเลือก track ถัดไปยังไง

  • FCFS: ตามลำดับที่มาในคิว (ยุติธรรม แต่หัวอ่านวิ่งไปมามาก)
  • SSTF: เลือก track ที่ใกล้หัวอ่านที่สุดทุกครั้ง (เลื่อนน้อย แต่ track ที่อยู่ไกลอาจรอนาน)
  • SCAN (แบบลิฟต์): วิ่งไปทางเดียวจนสุดปลายดิสก์ แวะอ่านระหว่างทาง แล้วกลับอีกทาง
  • C-SCAN: อ่านทางเดียว ถึงปลายแล้วกระโดดกลับอีกปลายโดยไม่อ่าน แล้ววิ่งทางเดิมอีกครั้ง (เวลารอสม่ำเสมอกว่า)
  • LOOK / C-LOOK: เหมือน SCAN / C-SCAN แต่ไม่ต้องไปถึงปลายดิสก์ กลับเมื่อถึง request สุดท้ายในทิศนั้น

นับ total head movement = ระยะที่หัวอ่านเคลื่อนที่รวมกัน ตัวอย่างในชีท: 200 tracks (0–199), หัวอ่านอยู่ที่ 53, คิว 98, 183, 37, 122, 14, 124, 65, 67 และกำลังไปทาง 0

วิธีหลักการชีท
FCFSตามลำดับคิว640
SSTFไปที่ track ใกล้ที่สุดก่อนเสมอ236
SCANวิ่งไปจนสุดปลาย (0) แล้วกลับมาบริการอีกทาง236
C-SCANบริการทางเดียว ถึงปลายแล้วกระโดดไปอีกปลาย (ชีทนับระยะกระโดด 0 → 199 ด้วย)386
LOOKแบบ SCAN แต่ไม่ต้องไปถึงปลาย กลับที่ request สุดท้าย208
C-LOOKแบบ C-SCAN แต่กระโดดจาก request สุดท้ายไป request ไกลสุดอีกฝั่ง326
เกทไหม? ลองตอบ
หัวอ่านอยู่ที่ 50 และคิวมี 30, 55 ใช้ SSTF total head movement เท่าไร
55 ใกล้กว่า (ห่าง 5) จึงไป 55 ก่อน แล้วไป 30 (ห่าง 25) → 5 + 25 = 30