ทำไม FAT16 ไม่สามารถจัดเก็บมากกว่า 2 GB ได้?


25

ไซต์ทั้งหมดที่ฉันไปเพื่อค้นหาข้อมูลเกี่ยวกับ FAT16 เพียงแค่แจ้งอย่างชัดเจนว่ามันไม่สามารถจัดสรรได้มากกว่า 2 GB ตกลง. ยิ่งใหญ่ ฉันเชื่อคุณ. แต่คุณจะสรุปได้อย่างไร (นอกเหนือจากการทดสอบ)

มีสูตรหนึ่งที่สามารถใช้ในการกำหนดว่าระบบ FAT16 สามารถเก็บได้เท่าไหร่?


21
มีเหตุผลว่าทำไม FAT16 มีชื่อ "16" :-)
Eric Lippert

28
@EricLippert อย่างยุติธรรมการเชื่อมต่อระหว่าง 16 และ 2 GiB นั้นไม่ชัดเจนในทันทีโดยไม่ทราบว่า FS ทำงานอย่างไร
Joey

18
ฉันไม่มั่นใจ 100% ว่าคำถามนี้เป็นจริงในหัวข้อสำหรับเว็บไซต์นี้ บางทีมันควรจะถูกย้ายไป retrocomputing.stackexchange.com?
จูลส์

3
เป็นที่น่าสังเกตว่าขีด จำกัด 2GB นั้นเป็นข้อ จำกัด ในทางปฏิบัติของวิธีที่ MS-DOS และ Windows รุ่นก่อนจัดการกับ FAT16 เป็นไปได้ในเชิงแนวคิดเกิน 2GB แต่ไม่ใช่ในลักษณะที่เข้ากันได้กับ Microsoft
phyrfox

3
@ LưuVĩnhPhúcความคิดเห็นถูกต้อง ฉันพูดว่า "MS-DOS และ Windows ยุคต้น" ระบบที่ทันสมัยสามารถใช้งานได้มากกว่า 2GB ใน FAT16 พาร์ติชัน 4GB FAT16 จะไม่ทำงานในระบบ MS-DOS / Win3.1 แบบเก่า และแหล่งข้อมูลหลายแห่งที่ระบุว่า 2GB นั้นเป็นขีด จำกัด เพราะทั้งสองอย่างนั้นถูกเขียนขึ้นเมื่อขีด จำกัด นั้นเป็นความจริงหรือไม่นานหลังจากนั้นไม่นานคุณไม่ควรทำเพราะระบบเก่า ๆ ไม่สามารถจัดการได้ ระบบในภายหลังสามารถจัดการได้ดี แต่ขีด จำกัด 2GB เป็นกฎของหัวแม่มือก่อนประมาณ 2,000 หรือประมาณนั้นและอีกไม่กี่ปีถัดไปหลังจากนั้นก็อ้างถึงข้อ จำกัด เก่าและล้าสมัย
phyrfox

คำตอบ:


66

FAT16 ใช้ 16 บิตเพื่อระบุกลุ่ม ดังนั้นจึงมีคลัสเตอร์ได้สูงสุด 65536 คลัสเตอร์ก่อนที่คุณจะหมดตัวระบุและตัวระบุบางอย่างจะถูกสงวนไว้สำหรับการใช้งานที่ไม่ใช่ไฟล์ แต่ละไฟล์มีอย่างน้อยหนึ่งคลัสเตอร์ กลุ่มที่ใหญ่กว่าจะเพิ่มการจัดสรรขั้นต่ำต่อไฟล์เพิ่มค่าใช้จ่ายของไฟล์ขนาดเล็ก

ขนาดคลัสเตอร์จะบอกคุณถึงปริมาณสูงสุดที่สามารถระบุได้ สำหรับกลุ่ม 32KiB นั่นคือ 32 * 1024 * 65536 B = 2GiB

คุณสามารถเพิ่มขนาดคลัสเตอร์ได้ไม่ จำกัด โดยเพิ่มขนาดของเซ็กเตอร์ในดิสก์ของคุณ แต่คุณยังคง จำกัด จำนวนไฟล์สูงสุดไว้ คุณจะพบปัญหากับซอฟต์แวร์ที่ถือว่าขนาดเซกเตอร์เริ่มต้น (512B)

ณ จุดที่มีปริมาณทางกายภาพของ ~ 2GiB พร้อมโปรเซสเซอร์และระบบปฏิบัติการ 32 บิตดังนั้นการย้ายไปที่ FAT32 จึงเป็นตัวเลือกที่เหมาะสมช่วยให้มีไฟล์จำนวนมากในกลุ่มเล็ก ๆ


4
"แต่เพิ่มโอเวอร์เฮดสำหรับไฟล์ขนาดเล็ก" ไม่แน่ใจว่าจะชัดเจนสำหรับทุกคนเพราะฉันไม่แน่ใจว่าทุกคนจะเข้าใจ "โอเวอร์เฮด" ในบริบทนี้ ฉันคิดว่าตัวอย่างจะช่วยได้: "ตัวอย่างเช่นไฟล์ที่มีหนึ่งอักขระในนั้นใช้เวลา 1 คลัสเตอร์บนดิสก์ซึ่งส่วนใหญ่จะถูกสิ้นเปลืองโดยสิ้นเชิงขนาดของคลัสเตอร์ที่ใหญ่กว่าหมายถึงสิ้นเปลืองมากกว่า"
Reginald Blue

3
หมายเหตุที่ชัดเจนสองสามข้อ: 32KiB เป็นขนาดคลัสเตอร์สูงสุดสำหรับ DOS และ Windows รุ่นต่าง ๆ แต่ตระกูล Windows NT ได้รองรับขนาดคลัสเตอร์ที่ใหญ่ขึ้นตั้งแต่ NT 4.0 (ดังนั้น Windows รุ่นผู้บริโภคตั้งแต่ XP จึงรองรับเช่นเดียวกัน ขึ้นอยู่กับเคอร์เนล NT) ซึ่งอนุญาตให้มีขนาดสูงสุด 16GiB ถึงแม้ว่าเนื่องจากความไร้ประสิทธิภาพตามที่ระบุไว้ในคำตอบนี้ไม่น่าจะมีประโยชน์ คุณสามารถใช้ระบบดังกล่าวได้อย่างน่าเชื่อถือหากคุณต้องการเก็บไฟล์ขนาดใหญ่โดยเฉพาะอย่างยิ่งหากพวกเขามาในหลาย ๆ ขนาดของคลัสเตอร์ 256KiB คุณจะต้องใช้ ...
Jules

5
... แต่คุณน่าจะถึงขีด จำกัด ต่อไปซึ่งเป็นปัญหาสำหรับทั้ง FAT16 และ FAT32: ขนาดไฟล์สูงสุดถูก จำกัด ไว้ที่ 1 ไบต์สั้นของ 4GiB เนื่องจากข้อเท็จจริงที่ว่ามีเพียง 4 ไบต์ที่จัดสรรให้เก็บไว้ใน รายการไดเรกทอรี OTOH ถ้าคุณต้องการเก็บไฟล์ขนาดใหญ่ในขนาด 256KiB มากถึง 2GiB ด้วยขนาด power-of-two และขนาดทั้งหมด <16GiB, FAT16 อาจเป็นรูปแบบที่มีประสิทธิภาพที่สุดสำหรับพวกเขา
จูลส์

@Jules: อาจเกิดขึ้นเท่านั้น โปรดจำไว้ว่ามีค่าใช้จ่ายสำหรับแต่ละคลัสเตอร์ ระบบไฟล์ที่ช่วยให้การรันการจัดเก็บมีประสิทธิภาพมากขึ้นถ้ามีการแตกแฟรกเมนต์น้อย
Deduplicator

12

จริงๆแล้วมีหลายรุ่นของ "FAT16" ในช่วงหลายปีที่มีข้อ จำกัด ที่แตกต่างกัน แต่ลองพิจารณารุ่นที่ยังคงอยู่จาก "compaq DOS 3.31" ไปจนถึง windows 95

ปริมาณ FAT แบ่งออกเป็นกลุ่ม แต่ละกลุ่มประกอบด้วยพลังของสองภาค จำนวนของเซ็กเตอร์ต่อคลัสเตอร์ใน FAT16 ถูกเก็บไว้เป็นหมายเลขที่เซ็นชื่อ 8 บิต ดังนั้นเซกเตอร์ที่เป็นไปได้สูงสุดต่อคลัสเตอร์คือ 64

หมายเลขคลัสเตอร์ถูกเก็บเป็นค่าที่ไม่ได้ลงชื่อ 16 บิต จำกัด จำนวนรวมของกลุ่มไว้ที่ 65536 คูณด้วยจำนวนสูงสุดของแต่ละกลุ่มและคุณจะได้รับวงเงิน 4194304

ขนาดเซกเตอร์ (ตรรกะ) ของฮาร์ดไดรฟ์คือ 512 ไบต์ คูณด้วยจำนวนที่ จำกัด ของภาคที่กล่าวถึงข้างต้นและคุณจะได้รับวงเงิน 2GiB ของคุณ โดยพื้นฐานแล้วสื่อที่มีขนาดเซกเตอร์ขนาดใหญ่สามารถรองรับปริมาณ FAT16 ที่ใหญ่กว่าได้ แต่ฉันไม่คิดว่ามันจะเกิดขึ้นในทางปฏิบัติ

Windows NT เปลี่ยนการแปลความหมายของฟิลด์ "เซกเตอร์ต่อกลุ่ม" เป็น 8 บิตที่ไม่ได้ลงชื่อ สิ่งนี้อนุญาตให้พาร์ติชัน 4GiB FAT16 ที่มี 512 เซ็กเตอร์ (และในทางทฤษฎีมีขนาดใหญ่กว่าบนไดรฟ์ที่มีเซกเตอร์ขนาดใหญ่) AIUI windows 98 เพิ่มการสนับสนุนสำหรับการอ่านและการเขียนพาร์ติชั่นดังกล่าว แต่มันไม่สามารถสร้างพาร์ติชั่นได้และยูทิลิตี้ของดิสก์ไม่สามารถซ่อมแซมได้


แน่นอนว่ามันจะเป็นไปได้ที่จะทำการปรับแต่งเล็กน้อยในรูปแบบระบบไฟล์เพื่อสนับสนุนกลุ่มที่ใหญ่ขึ้นและด้วยเหตุนี้จึงมีปริมาณมากขึ้น อย่างไรก็ตาม MS ตัดสินใจที่จะเลือกตัวเลือกที่รุนแรงกว่านี้เพื่อย้ายไปยังดัชนีคลัสเตอร์แบบ 32 บิตโดยใช้ windows 95 OSR2 ที่ผลิต FAT32

ฉันเชื่อว่าเหตุผลที่เลือกตัวเลือกที่รุนแรงกว่านี้คือประสิทธิภาพของพื้นที่ ไฟล์ขนาดปกติที่ได้รับในขณะนั้นกลุ่ม 32kiB นั้นค่อนข้างสิ้นเปลืองแล้ว


4
ฉันต้องคิดอย่างหนักที่ "ภาคที่เป็นไปได้สูงสุดต่อกลุ่มคือ 64" จนกว่าฉันจะได้รับ: 64 เป็นพลังที่ยิ่งใหญ่ที่สุดของ 2 ที่คุณสามารถเป็นตัวแทนในไบต์ที่ลงนามแล้ว: 128 เป็นไปไม่ได้เนื่องจากจำนวนบวกสูงสุด ค่าไบต์คือ 127
Ralf Kleberhoff

3
@RalfKleberhoff ที่จะนำไปสู่คำถามติดตามแม้ว่า: ถ้าคุณเก็บพลังงานของสองทำไมเก็บตัวเลขตัวเองมากกว่าเลขชี้กำลังทั้งสอง?
Daniel Wagner

@DanielWagner ฉันเห็นด้วยอย่างยิ่ง โดยเฉพาะอย่างยิ่งเมื่อก่อนเมื่อ FAT16 ถูกสร้างขึ้นการเปลี่ยนเป็นการทำงานที่ถูกกว่าการคูณ แต่อาจจะเป็นพวกเขาเพียงแค่มีความสุขที่จะได้รับมันทำงานและไม่วิศวกรรมซอฟต์แวร์มันมานานหลายทศวรรษในอนาคต ...
ราล์ฟ Kleberhoff
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.