/ 365วันแห่งโปรแกรม

[365 วันแห่งโปรแกรม #day36] เมื่อ kB != KB

วันที่สามสิบหกของ ‪#‎365วันแห่งโปรแกรม เรื่องที่จะคุยวันนี้นั้นอาจจะไม่เกี่ยวข้อกับโปรแกรมเมอร์สักเท่าไหร่ ไม่ว่าอย่างไรก็ตามผมเชื่อว่าโปรแกรมเมอร์ควรจะรู้ทุกอย่าง ตั้งแต่ดัชนีนิเคอิ ไปจนวิธีสร้างยานอวกาศ เอ้ย!! ไม่ใช่ละ รู้ทุกอย่างในฟิลด์ของ IT ก็ได้ครับ เรื่องอื่นๆ ก็ควรรู้แต่ไม่จำเป็นต้องรู้ทั้งหมด เรื่องของเราในวันนี้คือ เมื่อ kB != KB


ในศาสตร์ของไอทีนั้นเต็มไปด้วยความขัดแย้ง ไม่ว่าจะเป็นวิธีการ การเรียก ธรรมเนียม และอื่นๆ มีเรื่องนึงที่ถกเถียงกันมาเนิ่นนานก็คือทำไมเวลาซื้อฮาร์ดดิสก์ เราถึงได้ความจุน้อยกว่าที่โฆษณาไว้ล่ะ? เราโดนโกงหรือเปล่า? แล้วใครผิด?

เราน่าจะรู้กันดีอยู่แล้วว่าหน่วยที่เล็กที่สุดของข้อมูลเราเรียกกันว่าบิต แต่ในการทำงานจริงเราไม่สามารถจองพื้นที่ในขนาดที่เป็นบิตได้เลย ขนาดต่ำสุดที่จองได้น่าจะอยู่ที่ 1 ไบต์ เพราะอะไร? อย่างที่บอกไปในบทความที่แล้วว่าผู้ผลิตฮาร์ดแวร์อาจจะกำหนดว่า 1 ไบต์ของเขามีมากกว่า 8 บิตก็ได้ ซึ่งส่วนเกินนั้นเขาอาจจะเอาไปทำอะไรสักอย่างที่มันพิเศษ และทำให้ฮาร์ดแวร์ของเขาดู unique มากขึ้น ดังนนั้นการจองพื้นที่ขนาดต่ำกว่า 1 ไบต์จึงอาจจะเกิดปัญหานั่นเอง ที่กล่าวมานี้ไม่ได้เกี่ยวกับหัวข้อในวันนี้แต่อย่างใด

ความไม่เท่ากันเกิดจากอะไร?

ผู้ผลิตชิพหน่วยความจำไม่ว่าจะเป็นแรมหรือ SSD หรืออะไรก็แล้วแต่ จะมีการระบุขนาดไว้ในหน่วยของบิตเสมอ เมื่อผู้ผลิตฮาร์ดแวร์เอาไปใช้ก็จะกำหนดเองว่าฮาร์ดแวร์ของเขาเนี่ยทำงานยังไง เปิดให้ใช้งานหน่วยความจำจริงๆแค่ไหน

และแล้วสิ่งที่ไม่คาดคิดก็เกิดขึ้น เมื่อผู้ผลิต RAM และ OS เลือกใช้หน่วยวัดตามมาตรฐานของ JEDEC แต่ผู้ผลิตฮาร์ดไดรฟ์เลือกใช้มาตรฐาน SI

มาตรฐาน SI เราน่าจะพอทราบกันอบู่แล้วว่ามี prefix (คำอุปสรรค) อยู่มากมาย เข้าใจง่าย และตรงไปตรงมา หลักการสร้าง prefix ก็อิงมาจากการเอาเลข 10 ไปยกกำลังต่างๆ (Metric prefix/Decimal prefix)

SI perfixes

ส่วนทางด้าน JEDEC ระบุว่ามี prefix 3 แบบที่ใช้แทนขนาดของหน่วยความจำ โดยวิธีการคิดจะใช้หลัก power of two (Binary prefix) ดังนี้

kilo (K): คือการคูณด้วย 1024 (2 ยกกำลัง 10)
mega (M): คือการคูณด้วย 1048576 (2 ยกกำลัง 20 หรือ K ยกกำลัง  2)
giga (G): คือการคูณด้วย 1073741824 (2 ยกกำลัง 30 or K ยกกำลัง 3)

ปัญหาเกิดเมื่อมาตรฐานทั้งสองใช้ prefix หน้าตาเหมือนกัน (เว้นแต่ kilo ที่ SI ใช้ k เล็ก ส่วน JEDEC ใช้ K ใหญ่) แต่ตัวคูณจริงๆ กลับไม่เหมือนกัน ถ้าเทียบที่ 1kB กับ 1KB จะพบว่าต่างกันถึง 24 ไบต์ พอเป็น prefix ที่ใหญ่ขึ้นไปอีก ก็ต่างกันมากขึ้นไปอีก

IEC ผู้ที่มาไกล่เกลี่ยปัญหา (หรือเปล่า?)

IEC บอกว่ามาตรฐานทั้ง 2 แบบ ทำให้ผู้บริโภคสับสนได้นะ End-user ไม่รู้หรอกว่ามันต่างกันยังไง เอาเป็นว่าเดี๋ยวเราสร้างมาตรฐานใหม่เองละกัน สุดท้ายก็ประกาศออกมาว่า มาตรฐาน IEC อิงตาม JEDEC เดิมนั้นแหละกล่าวคือใช้ฐานเป็น 1024 แล้วยกกำลังไปเรื่อยๆ เปลี่ยนชื่อคำอุปสรรคใหม่ แต่ใช้ตัวย่อเดิมเป็นตัวอักษรใหญ่ตามด้วย i เล็ก เมื่อนำทั้ง 3 มาตรฐานมาเทียบกันจะได้ดังตารางนี้

comparision of prefixes

จะพบว่า IEC มองว่าถ้าเราแยกตัวย่อให้ต่างกันแล้วปัญหาน่าจะไม่เกิดขึ้นนะ ก็ฟังดูโอเคครับ

ปัญหาไม่จบ เมื่อ OS หลัก 3 ตัวไม่คุยกัน

ไมโครซอฟท์ผู้พัฒนาระบบปฏิบัติการวินโดวส์ที่มีส่วนแบ่งกว่า 90% ของตลาด consumer นั้นเมินเฉยต่อมาตรฐานของ IEC โดยยังคงใช้ prefix ตามมาตรฐาน JEDEC เดิม

ส่วน *NIX นั้นแตกคอออกเป็นสองฝั่ง คือ Apple และ อื่นๆ Apple บอกว่าเพื่อไม่ให้ผู้ใช้สับสนก็ใช้หน่วยเดียวกับผู้ผลิตฮาร์ดแวร์ไปเลยสิ ก็เลยเลือก SI เมื่อแสดงผลขนาดของฮาร์ดไดรฟ์ และใช้ JEDEC สำหรับแสดงขนาดของ RAM

ส่วนระบบที่เหลือนั้น (Linux, BSD, etc.) ส่วนใหญ่เลือก IEC คือการเพิ่มตัว i หลัง prefix เมื่อต้องการสื่อว่าค่าที่แสดงนั้นเป็นไปตามมาตรฐาน IEC นะ

References

JEDEC memory standards

Kibibyte

Binary prefix

Metric prefix

‎day36 #365วันแห่งโปรแกรม ‪#‎โครงการ365วันแห่ง‬...