บทที่ 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 ไม่ได้พูดถึงในคลิป
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 พับเก็บไว้ ข้ามได้
- หน่วยความจำหลักมีข้อจำกัด 2 ข้อ: (1) พื้นที่น้อย เก็บถาวรไม่ได้ (2) เป็น volatile ไฟดับแล้วข้อมูลหาย
- หน่วยความจำสำรอง เช่น magnetic tape, disk
- ไม่ออก หัวข้อ 3.3.1 โครงสร้างดิสก์ (track, cylinder, sector, หัวอ่าน, การหมุน) ในหน้า 95 ของชีท ข้ามได้เลย
4.2 Free-space management
❓ ปัญหาคืออะไร
เวลาสร้างไฟล์ใหม่ OS ต้องรู้ว่าบล็อกไหนยังว่าง และเมื่อลบไฟล์ก็ต้องจดว่าบล็อกนั้นกลับมาว่าง วิธีจดรายการบล็อกว่างเรียกว่า free-space list ซึ่งมี 4 วิธี
⚙️ ตัวอย่างเดียวกันทั้ง 4 วิธี: ดิสก์ 12 บล็อก (0–11) ว่างอยู่ 2, 3, 4, 6, 8, 9, 10
- Bit vector: เขียนบิตเรียง 12 ตัว บล็อกว่าง = 0 และใช้แล้ว = 1 (ตามชีท) →
110001010001
ข้อดีคือดูง่าย หาบล็อกว่างได้เร็ว ข้อเสียคือต้องเก็บบิตให้ทุกบล็อก (ดิสก์ใหญ่ก็ใช้ที่เยอะ) - Linked list: จำแค่บล็อกว่างบล็อกแรก (2) ไว้เป็น head แล้วในบล็อก 2 เขียนว่าบล็อกว่างถัดไปคือ 3 → 4 → 6 → 8 → 9 → 10 → null
ข้อดีคือไม่เปลืองที่ ข้อเสียคือถ้าจะหาบล็อกว่างหลายบล็อก ต้องไล่อ่านทีละบล็อก (ช้า) - Grouping: บล็อกว่างแรกเก็บรายการเลขบล็อกว่าง N บล็อก ไว้ในตัวเลย (เช่น N = 3: บล็อก 2 เก็บ [3, 4, 6] และบล็อก 6 เก็บ [8, 9, 10]) จึงหาบล็อกว่างทีละหลายบล็อกได้เร็วกว่า linked list
- 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 | นับเป็นกลุ่มบล็อกว่างที่ติดกัน (บล็อกเริ่ม + จำนวนบล็อก) |
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 เก็บ | ตัวอย่างในชีท | ข้อดี / ข้อเสีย |
|---|---|---|---|
| Contiguous | start + length | data1: start 0, length 3 → บล็อก 0, 1, 2 | อ่านเร็ว เข้าตรงได้ / เกิด external fragmentation และต้องเลือก hole (first/best/worst fit) |
| Linked | start + end | Data2: 11 → 14 → 16 → 5 → 4 (−1 = จบ) | ไม่มี external fragmentation / เข้าตรงไม่ได้ ต้องไล่ทีละบล็อก และเสียที่เก็บ pointer |
| Indexed | index block | Data3: index block 15 = [17, 13, 2, 10] | เข้าตรงได้ / เสียบล็อกทำ index |
| FAT | start block | 200 → 515 → 300 → end-of-file | แบบ linked แต่เก็บ pointer ไว้ในตาราง |
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 |