ปัญหาปี ค.ศ. 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 บิต จะทำให้เกิดความเสี่ยง โดยความเสียหายจะขึ้นอยู่กับความล้มเหลวว่าเกิดผลกระทบมากน้อยเพียงใด
ดูเพิ่ม
[แก้]อ้างอิง
[แก้]- ↑ "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.
- ↑ 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.
- ↑ "The Future Lies Ahead". 28 June 2006. สืบค้นเมื่อ 19 November 2006.
- ↑ Weird "memory leak" problem in AOLserver 3.4.2/3.x 12 May 2006
- ↑ "It isn't cheating it's time travel".
- ↑ "CARB - Vehicles and Engines (Mobile Source) Test Procedures". คลังข้อมูลเก่าเก็บจากแหล่งเดิมเมื่อ 2016-11-18. สืบค้นเมื่อ 2016-11-20.
- ↑ Issue 16899 - android - Year 2038 problem
- ↑ Trends in embedded software design
- ↑ "aj_blk: Year 2038 Bug". Ajoeblk.blogspot.in. สืบค้นเมื่อ 2013-03-12.