Lecture05 ระบบแฟ้ม - inode, data block และ directory block ----------------------------------------------- ก่อนที่จะกล่าวถึงรายละเอียดของระบบแฟ้ม (filesystem) ต้องทำความเข้าใจคำว่า "แฟ้ม" ให้ชัดเจนเสียก่อน เพราะแฟ้มเป็นสิ่งสำคัญมากจนมีคำกล่าวว่าในระบบปฏิบัติการ Unix :- • "ทุกสิ่งทุกอย่างคือแฟ้ม" (Everything is a file!), และ • "การเข้าใช้งานทุกสิ่งทุกอย่างต้องทำผ่านแฟ้ม (Each and everything is accessed by a file.) แฟ้มกระดาษที่ใช้งานกันโดยทั่วไป มีองค์ประกอบสองส่วนคือ ➀ ปกแฟ้มแสดงข้อมูลเกี่ยวกับแฟ้มนั้น เช่น ชื่อแฟ้ม, ชื่อผู้จัดทำ, วันเวลาที่จัดทำ ฯลฯ ➁ เนื้อหาของแฟ้ม เพื่อให้ชัดเจนจะเรียกข้อมูลเกี่ยวแฟ้มตามข้อ ➀ ว่า ลักษณะประจำ (attribute) และเรียกเนื้อหาของแฟ้มตามข้อ ➁ ว่าข้อมูล (data) แฟ้มในระบบคอมพิวเตอร์ หรือแฟ้มอิเล็กทรอนิกส์ ก็มีองค์ประกอบเช่นเดียวกับแฟ้มกระดาษ คือ "ลักษณะประจำ" ของแฟ้ม และ "ข้อมูล" ในแฟ้ม ➀ ข้อมูลในแฟ้ม เช่น โปรแกรมต้นฉบับ, เอกสารต่างๆ, ตารางคำนวณ, และรูปภาพ เป็นต้น ข้อมูลในแฟ้มเป็นองค์ประกอบ ที่มีความหมายต่อผู้สร้าง และ/หรือ ผู้ใช้งาน แฟ้มนั้น ➁ ลักษณะประจำของแฟ้ม เช่น เจ้าของ, กลุ่ม, สิทธิในการใช้งาน, วันและเวลาที่สร้าง-ใช้งาน-เปลี่ยนแปลงแก้ไข ลักษณะประจำ ของแฟ้มเป็นองค์ประกอบที่มีความหมายต่อการทำงาน, การควบคุม, และการจัดการของระบบปฏิบัติการ ในทางปฏิบัตินิยมเก็บองค์ประกอบสองส่วนนี้แยกจากกัน ข้อมูลในแฟ้มเก็บในบล็อกข้อมูล (data block) ส่วนลักษณะประจำเก็บในโครงสร้างข้อมูล มีชื่อเรียกเฉพาะว่า inode โดยแต่ละแฟ้มจะมี inode ของตนเอง หรือความสัมพันธ์ระหว่างแฟ้มและ inode เป็น 1:1 ดังนั้นในระบบแฟ้มหนึ่งจึงมี inode เป็นจำนวนมาก มีพื้นที่จัดเก็บโดยเฉพาะและเก็บเป็น array of inodes เรียกว่า i-list, inode แตละตัวมีหมายเลขอ้างอิงเฉพาะตัวเรียกว่า หมายเลข inode สำหรับใช้เป็นดัชนีไปยัง inode ที่ต้องการ ภายใน inode มี "ตัวชี้" หรือ "ดัชนี" สำหรับเข้าถึงบล็อกที่ใช้เก็บข้อมูลของแฟ้มนั้น ด้วยเหตุนี้ inode จึงเป็นชื่อย่อของ index node เพราะภายในมีดัชนีชี้ไปยังข้อมูล จานแม่เหล็กจริงหนึ่งตัว แบ่งออกได้เป็นหลาย partition, แต่ละ partition ทำหน้าเป็นเสมือนจานแม่เหล็กหนึ่งตัว (logical drive) สำหรับสร้างระบบแฟ้ม ดังนั้นคำว่า partition และระบบแฟ้มจึงหมายถึงสิ่งเดียวกัน ขึ้นอยู่มุมมองและเนื้อหาในขณะอ้างอิง ระบบแฟ้มของ Unix (Unix Filesystem - UFS) แต่ละระบบประกอบด้วย • Boot block # เก็บชุดคำสั่งสำหรับเริ่มทำงานของระบบปฏิบัติการ (bootstraps) • Superblock • i-list หรือ array of inode • directory/data block Superblock ---------- เก็บiรายละเอียดของระบบแฟ้ม เช่น ชนิดและรุ่นของระบบแฟ้ม, ขนาดของ block, จำนวน block, จำนวน i-node ที่ยังไม่ได้ใช้งาน, และหมายเลข i-node ของ root directory ("/") ซึ่งเป็นจุดเริ่มต้นของระบบแฟ้ม i-list ------ พื้นที่เก็บ array of inodes ซึ่งเป็นโครงสร้างข้อมูลสำหรับ "คุณลักษณะ" ของแฟ้ม รายละเอียดจะได้กล่าวถึงต่อไป Directory block และ data block ------------------------------ เป็นพื้นที่ที่มีขนาดใหญ่ที่สุดและใช้เนื้อที่เกือบทั้งหทดในระบบแฟ้ม ใช้สำหรับเก็บข้อมูลของไดเรกทอรี และข้อมูลของแฟ้ม ในความเป็นจริงบล็อกที่ใช้เก็บข้อมูลของไดเรกทอรีและบล็อกที่ใช้เก็บข้อมูลของแฟ้ม เป็นบล็อกชนิดเดียวกัน มีคุณลักษณะเหมือนกัน ต่างกันเฉพาะข้อมูลที่จัดเก็บเท่านั้น โครงสร้างของ inode ---------------- inode เป็นโครงสร้างข้อมูลที่มีรายละเอียดดังนี้ • mode สิทธการใช้งาน และชนิดของแฟ้ม • owner info ชื่อเจ้าของแฟ้ม, กลุ่ม, ... • size ขนาดของแฟ้มเป็นไบต์ • time stamps วันเวลาของการสร้าง, การใช้งาน และการแก้ไขข้อมูลครั้งล่าสุด • links จำนวน links ของแฟ้ม • data block pointer ตัวชี้ (pointer) ไปยังบล็อกข้อมูล มีทั้งหมด 15 ตัว แยกเป็น ➤ direct block pointers ชี้ไปยังบล็อกข้อมูล มีทั้งหมด 12 ตัว ➤ indirect block pointers ชี้ไปยังบล็อกที่เก็บตัวชี้ไปยังบล็อกข้อมูล แบ่งเป็น ➤ single indirect block pointer ➤ double indirect block pointer ➤ triple indirect block pointer หมายเหตุ: ขอให้สังเกตว่า "ไม่มี" การเก็บ "ชื่อแฟ้ม" ไว่ใน inode ระบบปฏิบัติการใช้ข้อมูลใน inode ในการควบคุมการใช้งานแฟ้ม และใช้ตัวชี้ใน inode ในการเข้าถึงบล็อกที่ใช้เก็บข้อมูลของแฟ้ม การอ้างอิงบล็อกข้อมูลผ่านคัวชี้ใน inode จะทำความเข้าใจได้ง่ายกว่าเมื่อใช้แผนภาพ ขอให้ศึกษาจากแฟ้ม Fig01.png และจากข้อมูลต่อไปนี้ เมื่อกำหนดให้ D: direct block pointer = เก็บหมายเลขของบล็อกข้อมูล หรือ เรียกว่าเป็น pointer ไปยังบล็อกข้อมูลโดยตรง P1: single indirect block pointer = เก็บหมายเลขของบล็อก ที่ชี้ไปยัง D P2: double indirect block pointer = เก็บหมายเลขของบล็อก ที่ชี้ไปยัง P1 P3: triple indirect block pointer = เก็บหมายเลขของบล็อก ที่ชี้ไปยัง P2 ความสัมพันธ์ระหว่างตัวชี้แต่ละแบบเป็นดังนี้ D → บล็อกข้อมูล # เข้าถึงโดยตรง P1 → D → บล็อกข้อมูล # เข้าถึงผ่าน pointer, *p P2 → P1 → D → บล็อกข้อมูล # เข้าถึงผ่าน double pointer, **p P1 → P2 → P1 → D → บล็อกข้อมูล # เข้าถึงผ่าน triple pointer, ***p หากกำหนดให้บล็อกมีขนาด 4KB และ pointer แต่ละตัวมีขนาด 32 บิต นั่นคือแต่ละบล็อกเก็บ pointer ได้ 1024 ตัว pointer แต่ละแบบใน inode จะชี้ไปหาข้อมูลได้สูงสุดดังนี้ direct 12 x 4KB = 48KB indirect 1024 x 4KB = 4MB double indirect 1024 x 1024 x 4KB = 4GB triple indirect 1024 x 1024 x 1024 x 4KB = 4TB ดังนั้นขนาดแฟ้มที่ใหญ่ที่สุดที่เป็นไปได้ในกรณีนี้คือ 48K + 4MB + 4GB + 4TB ❓คำถาม หากต้องการเก็บแฟ้มที่มีขนาด 6TB ในระบบแฟ้ม จะทำได้หรือไม่? อย่างไร? ไดเรกทอรี -------- การที่ระบบปฏิบัติการใช้หมายเลข inode ซึ่งเป็นจำนวนเต็มในการอ้างอิงแฟ้ม เป็นวิธีการที่เหมาะสมต่อการทำงานของคอมพิวเตอร์ แต่ไม่เหมาะสมสำหรับผู้ใช้งาน เพราะมนูษย์เราตัวเลขได้ไม่ดีนัก แต่จำชือที่มีความหมายได้ดีกว่า จึงกำหนดให้มี "ชื่อแฟ้ม" เพื่อให้สอดคล้องกับการทำงานของผู้ใช้ แต่เนื่องจากไม่ได้จัดเก็บ "ชื่อแฟ้ม" ไว้ใน inode จึงต้องเพิ่มตารางแสดงความสัมพันธ์ระหว่าง "ชื่อแฟ้ม" และ "หมายเลข inode" ตารางนี้ เรียกว่า ไดเรกทอรี หรือ folder โดยสมาชิกแต่ละตัวของตารางเป็นคู่ลำดับ (ชื่อแฟ้ม, หมายเลข inode) เมื่อผู้ใช้ระบุชื่อแฟ้มที่ต้องการใช้งาน ระบบจะเปิดไดเรกทอรีเพื่อค้นหาหมายเลข inode ของแฟ้มที่ระบุ อ่านข้อมูลใน inode และคิดตามตัวชี้ไปยังบล็อกข้อมูล ตามแผนภาพต่อไปนี้ ชื่อแฟ้ม → หมายเลข inode → inode ของแฟ้ม • ลักษณะประจำ • ตัวชี้ไปยังบล็อกข้อมูล → ข้อมูลในบล็อก ตารางความสัมพันธ์ระหว่างชื่อแฟ้มและหมายเลข inode เก็บในบล็อกข้อมูลเช่นเดียวกับข้อมูลในแฟ้มอื่นๆ ไดเรกทอรีจึงเป็นแฟ้ม เพียงแต่ข้อมูลในบล็อกเป็นข้อมูลของระบบแฟ้ม การตรวจสอบความสัมพันธ์ระหว่าง ชื่อแฟ้ม และ หมายเลข inode ทำได้โดยใช้ option -i ของคำสั่ง ls เช่น $ ls -ai 182585793 . 182585932 H 182586885 xx.txt 182586887 xz.txt 179830801 .. 182585933 K 182586886 xy.txt 182586888 yy.txt จานแม่เหล็กเต็ม (Disk full) ----------------------- จำนวนของ inode จะได้รับการกำหนดขณะสร้้างระบบแฟ้ม ซึ่งจะไม่สามารถเปลี่ยนแปลงได้อีก ดังนั้นเมื่อระบบแจ้งว่าจานแม่เหล็กเต็ม หรือ disk full สาเหตุอาจเกิดจากการใช้บล็อกข้อมูลหมดแล้ว หรือใช้ inode ที่มีจนหมดก็ได้ ชนิดของแฟ้ม --------- ข้อมูลที่เก็บใน i-node อย่างหนึ่งคือ ชนิดของแฟ้ม (File type) ซึ่งในระบบปฏิบัติการ Unix แบ่งแฟ้มออกเป็น 8 ชนิดคือ ชนิดของแฟ้ม สัญลักษณ์ หมายเหตุ --------------------- ----------- ------------------------------------ - แฟ้มธรรมดา (Regular file) - - ไดเรกทอรี (Directory) d - Device special file # แฟ้มแทนอุปกรณ์ -- /dev - Character device file c # รับ-ส่งข้อมูลทีละไบต์ เช่น แป้นพิมพ์ - Block device file b # รับ-ส่งข้อมูลเป็นกลุ่ม (block) เช่น HDD - Socket s # สำหรับการสื่อสารข้อมูลระหว่างอุปกรณ์ในเครือข่าย - Named pipe p # สำหรับสื่อสารข้อมูลระหว่างโพรเซสในเครื่องเดียวกัน - Link - Symbolic link l - Hard link - # แสดงผลเหมือนแฟ้มธรรมดา ความสัมพันธ์ระหว่าง inode, directory block, และ data block ----------------------------------------------------- การอธิบายความสัมพันธ์ระหว่างองค์ประกอบทั้งภาพ จะชัดเจนที่สุดเมื่อใช้ภาพประกอบ ภาพ Fig02.png คำอธิบายภาพ: ไดเรกทอรี มีสถานะเป็น "แฟ้ม" จึงมี inode เช่นเดียวกับแฟ้มทั่วไป ข้อมูลที่เก็บในบล็อกไดเรกทอรีเป็นคู่ลำดับ (หมายเลข inode, ชื่อแฟ้ม) เมื่อมีการอ่านแฟ้ม ระบบปฏิบัติการจะเปิดไดเรกทอรี เพื่อหาหมายเลข inode ของชื่อแฟ้มที่ผู้ใช้กำหนด เมื่อได้หมายเลข inode แล้ว จึงนำไปอ่านข้อมูลใน inode ที่ต้องการ เพื่อตรวจสอบสิทธิการใช้งาน หากผู้ใช้มีสิทธิระบบจะทำการอ่าน pointer ไปยังบล็อกข้อมูล อ่านข้อมูลในบล็อกเก็บในหน่วยความจำพักข้อมูล (buffer) เมื่อได้รับคำร้องให้อ่านแฟ้มอีก ระบบจะอ่าน pointer ตัวถัดไป เพื่ออ่านข้อมูลจากบล็อกนั้นเข้ามา เป็นเช่นนี้เรื่อยไปจนกว่าผู้ใช้จะปิดแฟ้ม ภาพ Fig03.png คำอธิบายภาพ: ภาพนี้แสดงความสัมพันธ์ระหว่าง inode และไดเรกทอรี ข้อมูลในคู่ลำดับสองตัวแรกของไดเรกทอรีคือ หมายเลข inode ของไดเรกทอรีปัจจุบัน (.) และหมายเลข inode ของไดเรกทอรีแม่ (parent directory หรือ ..) เช่น ข้อมูลในไดเรกทอรี testdir เป็นดังนี้ 2549 . # ไดเรกทอรีปัจจุบันมีหมายเลข inode เป็น 2549 1267 .. # ไดเรกทอรีแม่มีหมายเลข inode เป็น 1267 pointer ของ inode หมายเลข 2549 ชี้ไปยังบล็อกไดเรกทอรี ของไดเรกทอรีปัจจุบัน pointer ของ inode หมายเลข 1267 ชี้ไปยังบล็อกไดเรกทอรี ที่มีข้อมูลเช่น 1267 . # ไดเรกทอรีปัจจุบันมีหมายเลข inode เป็น 1267 ⋯ ⋯ 2549 testdir # ไดเรกทอรี testdir มีหมายเลข inode เป็น 2549 แผนภาพที่ใช้นำมาจากหนังสือ Stevens, W. R. & Rago, S. A. (2005) Advanced Programming in the UNIX Environment, 2nd Edition, Addison-Wesley. หน้า 137 - 139 หนังสือเล่มนี้เป็นหนังสือที่ดีที่สุดเล่มหนึ่งสำหรับการเขียนโปรแกรมเชื่อมต่อกับระบบปฏิบัติการ Unix นิยมเรียกย่อว่า APUE Hard Links และ Symbolic Links ----------------------------- การใช้งานคอมพิวเตอร์ บ่อยครั้งที่มีความจำเป็นต้องใช้แฟ้มเดียวกันในหลายไดเรกทอรีในเวลาเดียวกัน วิธีการที่ง่ายที่สุดคือการ "คัดลอก" แฟ้มนั้นไปไว้ในไดเรกทอรีที่ต้องการใช้งาน แต่หากมีการเปลี่ยนแปลงข้อมูลในแฟ้มสำเนาใดสำเนาหนึ่ง จำเป็นต้องคัดลอกแฟ้มนั้นไปยัง ทุกแฟ้ม หากหลงลืมแฟ้มใดแฟ้มหนึ่งไป จะทำให้ข้อมูลในระบบลักลั่นกัน วิธีการที่ดีกว่าการคัดลอกแฟ้มคือการกำหนดให้แฟ้มหนึ่ง มีชื่อได้หลายชื่อ ผู้ใช้จะเลิอกปรับปรุงแก้ไขแฟ้มนั้นจากชื่อใดก็ได้ การดำเนินการเช่นนี้เรียกว่าการสร้าง Link ซึ่งมีสองแบบได้แก่ Hard link และ Symbolic link (Soft link หรือ Symlink) Hard Link -------- เนื่องจากระบบปฏิบัติการ Unix เก็บคู่ลำดับ (ชื่อแฟ้ม, หมายเลข inode) ไว้ในไดเรกทอรี ดังนั้นแต่ละ inode จึงสามารถมีชื่อได้หลายชื่อ เพียงแต่ไม่อนุญาตให้ใช้ชื่อซ้ำกันในไดเรกทอรีเดียวกัน ชื่อแฟ้มตั้งแต่สองชื่อขึ้นไปที่มีหมายเลข inode เดียวกัน เรียกว่า hard link เมื่อสร้าง Hard link เสร็จแล้ว ชื่อแฟ้มเดิม และชื่อแฟ้มที่เป็น hard link มีฐานะเท่ากันคือเป็น link ไปยังข้อมูลในแฟ้ม ไม่มีชื่อใดสำคัญกว่า อีกชื่อหนึ่ง ด้วยเหตุนี้การลบแฟ้มโดยใช้คำสั่ง rm จึงเป็นเพียงการกำจัด link ที่ระบุเท่านั้น ตราบเท่าที่ยังมี link อันใดอันหนึ่งเหลืออยู่ ผู้ใช้ยังสามารถเข้าถึงแฟ้มนั้นได้ผ่าน "ชื่อ" ที่เหลืออยู่ได้ การลบแฟ้มโดยสมบูรณ์จะเกิดขึ้นเฉพาะเมื่อมีการลบ link ที่มีอยู่ออกจนหมดเท่านั้น ขอให้ลองเปรียบเทียบกับ semaphore ที่เคยเรียนมาในวิชาระบบปฏิบัติการ กล่าวคือเมื่อผู้ใช้สร้าง hard link ไปยังแฟ้มใดเป็นการเพื่มค่า link count ของแฟ้มนั้น เมื่อทำการลบ เป็นการลดค่า link count การลบแฟ้มจริงจะเกิดขึ้นเมื่อ link count มีค่าเป็น 1 เท่านั้น การสร้าง Hard link สามารถทำได้เฉพาะในขอบเขตของระบบแฟ้มเดียวกัน ไม่สามารถดำเนินการข้ามระบบแฟ้มได้ นอกจากนี้ผู้ใช้ทั่วไปสามารถสร้างได้เฉพาะ Hard link ไปยังแฟ้ม การสร้าง Hard link ไปยังไดเรกทอรีเป็นสิทธิเฉพาะของ superuser เท่านั้น Symbolic link หรือ Soft Link -------------------------- เนื่องจาก hard link มีข้อจำกัด ระบบปฏิบัติการจึงกำหนดให้มี symbolic link เพิ่มอีกชนิดหนึ่ง โดยมีการทำงานใกล้เคึยงกับ hard link แต่สามารถเชื่อมโยงข้ามระบบแฟ้มได้ นอกจากนี้แล้วยังสามารถสร้าง symbolic link ไว้ล่วงหน้าโดยยังไม่ต้องมีแฟ้มจริงซึ่งจะอำนวยความสะดวกในการเขียนโปรแกรม symbolic link เป็นเพียงชื่อเส้นทาง (pathname) ไปยังแฟ้ม ไม่ได้เก็บหมายเลข inode ของแฟ้ม ดังนั้นหากมีการลบแฟ้มเดิมไปจะทำให้ไม่สามารถเข้าถึงแฟ้มนั้นได้อีก ลักษณะเช่นนี้ดูเหมือนจะเป็นจุดอ่อน แต่ก็เป็นจุดแข็งด้วย เนื่องจาก symbolic link หาแฟ้มโดยอาศัยชื่อเส้นทาง หากทำการแทนแฟ้มนั้นด้วยแฟ้มอื่น โดยแฟ้มนั้นมีชื่อเดิมและอยู่ในไดเรกทอรีเดิม การใช้งานแฟ้มผ่าน symbolic link ก็จะทำงานกับแฟ้มใหม่ได้เช่นเดียวกับแฟ้มเก่า คุณลักษณะเช่นนี้ทำให้ ทำให้ soft link เหมาะสำหรับการทำ version control ตัวอย่างการใช้งาน symbolic link: $ which vi /usr/bin/vi $ ls -l /usr/bin/vi lrwxrwxrwx 1 root root 20 Dec 12 2014 /usr/bin/vi -> /etc/alternatives/vi แสดงว่า vi เป็น symbolic link ไปยังแฟ้ม /etc/alternatives/vi ซึ่งเป็น symbolic link ไปยังโปรแกรม vi รุ่นปัจจุบันที่ใช้งานอยู่ หากผู้ดูแลระบบติดตั้งโปรแกรม vi รุ่นใหม่ และต้องการให้ผู้ใช้งานก็เพียงแต่เปลี่ยน symbolic link ให้ชี้มายังโปรแกรมรุ่นใหม่ หากพบว่ามีปัญหาและต้องการให้กลับไปใช้รุ่นเดิม ก็เพียงแต่เปลี่ยน symbolic link ให้ชี้ไปยังโปรแกรมเดิม หมายเหตุ: การสร้าง Shortcut ในระบบปฏิบัติการ Windows ของบริษัท Microsoft คือการสร้าง Symbolic link ในแบบ GUI นั่นเอง ---------------------------------------- ภาคผนวก ------- 1. คำว่า list หรือ sequence หมายถึงโครงสร้างทางคณิตศาสตร์ซึ่งมีคุณสมบัติตรงข้ามกับเซต คือ เป็นโครงสร้่างที่ลำดับ สมาชิกมีความสำคัญ และสมาชิกที่อยู่ในลำดับต่างกันมีค่าซ้ำกันได้ - การประยุกต์ทำได้ทั้ง array และ linked-list 2. direct blocks, indirect blocks, double indirect, และ triple indirect เก็บข้อมูลที่เป็น "ตัวชี้" หรือ pointer ไปยัง data block ที่ใช้เก็บข้อมูลในแฟ้มนั้น ซึ่งขนาดของ data block ได้รับการกำหนดเมื่อมีการสร้างระบบแฟ้มใน partition การเก็บข้อมูลในแฟ้มต้องใช้เนื้อที่อย่างน้อย 1 block เสมอ หากข้อมูลมีขนาดเล็กกว่า block size พื้นที่ส่วนที่เหลือจะไม่ได้ใช้ประโยช์ใด เช่น หากขนาด block เป็น 4K แฟ้มที่มีข้อมูล 15K ต้องใช้เนื้อที่ในการเก็บ 4 blocks หรือ 16K เหลือที่ว่าง 1K ส่วนแฟ้มที่มีขนาด 13K ต้องใช้เนื้อที่ในการเก็บ 4 blocksเช่นกัน กรณีนี้จะเหลือที่ว่าง 3K 3. คำว่า ตัวชี้ หรือ pointer หมายถึง "ข้อมูล" ที่ช่วยในการหาตำแหน่งของข้อมูลจริง ซึ่งอาจเป็นดัชนีของ array เช่น หมายเลขของ data block หรืออาจเป็นตำแหน่งเริ่มต้นในหน่วยความจำ (starting address) ก็ได้ พื้นที่ในจานแม่เหล็กสำหรับเก็บข้อมูลแบ่งออกเป็น data block ที่มีขนาดเท่ากัน หรือเป็น array ของ data block ด้วยเหตุนั้้หมายเลข ของ data block จึงเป็น "ดัชนี" ของ array ❓คำถาม โปรแกรมต้นฉบับภาษา C หรือ C++ ที่นิสิตเขียนในการเรียนรายวิชาด้าน Programming มีขนาดโดยเฉลี่ยเท่าใด? หากระบบแฟ้มที่นิสิตใช้งานอยู่มีขนาด blocks เป็น 4K การกำหนดดังกล่าวนี้เหมาะสมหรือไม่? อย่างไร?