ปัญหาปี ค.ศ. 2038

จากวิกิพีเดีย สารานุกรมเสรี
แอนิเมชันแสดงถึงวันที่ซึ่งจะถูกย้อนกลับไปยังจุดเริ่มต้น เมื่อใช้การเก็บข้อมูลแบบจำนวนเต็ม 32 บิต (ที่เวลา 03:14:08 น. ตามเวลาสากล ในวันที่ 19 มกราคม ค.ศ. 2038)

ปัญหาปี ค.ศ. 2038 (อังกฤษ: Year 2038 problem) เป็นปัญหาในการเก็บข้อมูลของคอมพิวเตอร์ที่เก็บเวลาในรูปแบบของจำนวนเต็มบิต 32 บิต โดยคอมพิวเตอร์รูปแบบนี้เก็บวันที่ตั้งแต่ 00:00:00 นาฬิกา ของวันที่ 1 มกราคม ค.ศ. 1970 ตามเวลาสากลเชิงพิกัด (เรียกเวลานี้ว่า ต้นยุคอ้างอิง)[1] ทำให้คอมพิวเตอร์รูปแบบนี้ไม่สามารถถอดรหัสเวลาได้หลังจาก 03:14:07 นาฬิกา ของวันที่ 19 มกราคม ค.ศ. 2038 ซึ่งปัญหานี้คล้ายกับ ปัญหาปี ค.ศ. 2000 แต่ไม่ได้คล้ายกันในแง่ของการเก็บข้อมูล ซึ่งในกรณีนั้นเป็นการเก็บจำนวนเต็มของปี ค.ศ. ซึ่งเก็บด้วยจำนวนเต็ม 2 หลัก ทำให้เกิดความสับสนขึ้นเมื่อได้ผ่านปี ค.ศ. 2000 ไป โดยระบบปฏิบัติการแบบยูนิกซ์ แบบ 32 บิต จะเก็บวันที่ในรูปแบบของเวลายูนิกซ์ ซึ่งทำให้เมื่อถึงปี ค.ศ. 2038 จะเกิด"ข้อผิดพลาดสหัสวรรษของยูนิกซ์"

สาเหตุ[แก้]

เวลาที่สามารถแสดงได้บนระบบเวลาของยูนิกซ์แบบจำนวนเต็ม 32 บิต คือ 03:14:07 ตามเวลาสากลเชิงพิกัด ในวันอังคารที่ 19 มกราคม ค.ศ. 2038 (พ.ศ. 2581) คิดเป็น 2,147,483,647 วินาที หลังจากเริ่มวันที่ 1 มกราคม ค.ศ. 1970[2] การจัดเก็บเวลาจะถูกย้อนกลับไปอีกครั้งและเก็บเป้นจำนวนเต็มลบ ซึ่งจะทำให้ระบบแสดงวันที่เป็นวันที่ 13 ธันวาคม ค.ศ. 1901 แทนที่จะเป็น 19 มกราคม ค.ศ. 2038 เนื่องจากเกิดบิตจำนวนเต็มล้น (overflow) ทำให้การนับเกิดผิดพลาด และจะกลับบิตเครื่องหมาย โดยจะเป็นจำนวนเต็มลบที่มากที่สุด (เกิดจากการนับขึ้นไปจนถึง 0) โดยปัญหาเช่นนี้เป็นปัญหาใหญ่ในระบบการคำนวณ

โดยจะมีโปรแกรมที่สามารถทำงานกับเวลาในอนาคตได้เพื่อแก้ปัญหานี้ต่อไป (เช่น โปรแกรมสามารถทำงานได้กับวันที่ในอีก 20 ปีข้างหน้า) โดยคาดว่าจะได้รับการพัฒนาภายในปี ค.ศ. 2018

ปัญหา[แก้]

ในเดือนพฤษภาคม พ.ศ. 2549 ได้มีรายงานเกี่ยวกับการปรากฎของปัญหาปี ค.ศ. 2038 บนซอฟต์แวร์ของเอโอแอลเซิร์ฟเวอร์ ซึ่งซอฟต์แวร์ถูกแบบมาพร้อมกับความยากต่อการจัดการฐานข้อมูล โดยคำร้องขอจะไม่ผิดพลาด ซึ่งคำนวณเหตุการณ์พิเศษเช่นนี้ด้วยการระบุวันที่ที่จะเกิดการผิดพลาดในอนาคต เซิร์ฟเวอร์ได้ระบุถึงเวลาที่เกิดผิดพลาดหลังจากผ่านไป 1 พันล้านวินาที (ประมาณ 32 ปี) หลังจาก 21:27:25 นาฬิกา ในวันที่ 12 พฤษภาคม ค.ศ. 2006 หลังจากถึงเวลานั้นการคำนวณจะล้นและย้อนกลับไปยังเวลาในอดีต เหตุมาจากซอฟต์แวร์ผิดพลาด เมื่อปัญหาได้รับการแก้ไข เอโอแอลเซิร์ฟเวอร์ได้จัดการแก้ไขไฟล์และตั้งเวลาผิดพลาดไปยังค่าที่ต่ำกว่า[3][4]

ผู้เล่นเกมหรือแอปพลิเคชันจะเกิดปัญหาเมื่อโปรแกรมทำงานผิดพลาด[5] โดยสามารถแก้ไขเบื้องต้นด้วยการปรับเวลาไปยังวันที่ก่อน 19 มกราคม ค.ศ. 2038

ช่อวโหว่ของระบบ[แก้]

ระบบฝังตัว เป็นระบบที่ได้รับผลกระทบกับปัญหานี้มากที่สุดระบบหนึ่ง

ในการขนส่งเช่นเครื่องบินหรือรถยนต์ส่วนใหญ่จะใช้ระบบฝังตัว ซึ่งในระบบฝังตัวของยานยนต์นี้ รวมไปถึงระบบเบรกอัตโนมัติ (ABS), ระบบควบคุมอิเล็กทรอนิกส์ (ESC/ESP), ระบบควบคุมแรง (TCS) และการขับเคลื่อนอัตโนมัติแบบ 4 ล้อ ส่วนเครื่องบินจะได้รับผลกระทบในด้านของระบบระบุพิกัด รวมถึงระบบนำทางด้วย อย่างไรก็ดี ไม่ได้หมายความว่าทุกระบบจะต้องเกิดข้อผิดพลาดโดยที่จะไร้ทางแก้ไข ในหลาย ๆ ระบบไม่ต้องการใช้วันที่ หรืออาจต้องการเพียงความแตกต่างของวันเวลา ซึ่งจะทำให้ไม่เกิดปัญหามากเท่าที่ควร ทำให้กรณีนี้เป็นการออกมาตรฐานตามกฎหมายขึ้น เช่น ซีเออาร์บี (CARB)[6]

ระบบฝังตัวถูกใช้ในการสื่อสารเช่นกัน รวมไปถึงโทรศัพท์มือถือและอุปกรณ์ที่ใช้ระบบอินเทอร์เน็ต (เช่น เราเตอร์, แอคเซสพอยต์ไวเลส) ซึ่งระบบเหล่านี้ต้องการใช้วันเวลาที่ถูกต้องอย่างสม่ำเสมอบนระบบปฏิบัติการแบบยูนิกซ์ ยกตัวอย่างเช่น ปัญหานี้จะทำให้อุปกรณ์ที่ใช้แอนดรอยด์ เกิดข้อผิดพลาดและไม่สามารถเปิดขึ้นมาใหม่ได้เมื่อเวลาเปลี่ยนไปในวันที่นั้น[7]

ในปี ค.ศ. 2012 ระบบฝังตัวส่วนใหญ่จะใช้ไมโครโพรเซสเซอร์ 8 บิต หรือ 16 บิต[8] ยกเว้นคอมพิวเตอร์ที่เริ่มใช้ 64 บิตกันแล้ว

แม้ว่าจะใช้เวลา 18 ถึง 24 เดือน ที่ระบบเทคโนโลยีคอมพิวเตอร์จะได้รับการปรับปรุงใหม่ แต่ระบบฝังตัวนั้นถูกออกแบบให้ใช้ได้อย่างทนทานนานหลายปี ซึ่งจะทำให้เกิดความเป็นไปได้ว่าจะมีระบบฝังตัวคงเหลือใช้อยู่จนถึงปี ค.ศ. 2038 ด้วย อีกทั้งมีความเป็นไปได้สูงที่จะไม่สามารถปรับปรุงซอฟต์แวร์ใหม่ในระบบฝังตัวเหล่านั้น

ฐานข้อมูลมายเอสคิวเอล ที่มีฟังก์ชัน UNIX_TIMESTAMP() จะคืนค่า 0 หลังจาก 03:14:07 น. ของวันที่ 19 มกราคม ค.ศ. 2038[9]

โครงสร้างข้อมูลที่ได้รับผลกระทบ[แก้]

ระบบโครงสร้างข้อมูลในปัจจุบันมีการจัดเก็บข้อมูลแบบ 32 บิตค่อนข้างมาก ด้านล่างนี้คือรายการของรูปแบบโครงสร้างข้อมูลที่ได้รับผลกระทบ ซึ่งเป็นโครงสร้างที่ใช้ระบบเวลายูนิกซ์

  • ระบบจัดเก็บข้อมูล (ระบบจัดเก็บข้อมูลส่วนใหญ่ใช้ได้เพียง 32 บิต ในการแสดงเวลาในไอโนด)
  • ไฟล์ไบนารี (ใช้การระบุเวลา 32 บิต)
  • ฐานข้อมูล (ใช้การระบุเวลา 32 บิต)
  • ภาษาที่ใช้เรียกฐานข้อมูล เช่น เอสคิวแอล (การใช้คำสั่ง UNIX_TIMESTAMP())

ตัวอย่างระบบที่ได้รับผลกระทบในส่วนของโครงสร้างข้อมูลที่มีการจัดเก็บแบบ 32 บิต

  • ระบบที่ใช้ภาษาโคบอล ในยุค ค.ศ. 1970–1990 ซึ่งไม่สามารถเข้าได้กับระบบที่รองรับปัญหา ค.ศ. 2038
  • โรงงานที่ถูกตั้งโปรแกรมไว้แล้ว
  • อุปกรณ์ทางการแพทย์
  • อุปกรณ์ทางการทหาร

ในส่วนของระบบที่ใช้โครงสร้างข้อมูลแบบ 32 บิต จะทำให้เกิดความเสี่ยง โดยความเสียหายจะขึ้นอยู่กับความล้มเหลวว่าเกิดผลกระทบมากน้อยเพียงใด

ดูเพิ่ม[แก้]

อ้างอิง[แก้]

  1. "The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition (definition of epoch)". IEEE and The Open Group. The Open Group. 2004. สืบค้นเมื่อ 7 March 2008. 
  2. Diomidis Spinellis (2006). Code quality: the open source perspective.. Effective software development serie in Safari Books Online (illustrated ed.). Adobe Press. p. 49. ISBN 0-321-16607-8. 
  3. "The Future Lies Ahead". 28 June 2006. สืบค้นเมื่อ 19 November 2006. 
  4. Weird "memory leak" problem in AOLserver 3.4.2/3.x 12 May 2006
  5. "It isn't cheating it's time travel". 
  6. CARB - Vehicles and Engines (Mobile Source) Test Procedures
  7. Issue 16899 - android - Year 2038 problem
  8. Trends in embedded software design
  9. "aj_blk: Year 2038 Bug". Ajoeblk.blogspot.in. สืบค้นเมื่อ 2013-03-12.