عند دخول عام 2000 تحدث العالم عن خلل حاسوبي اسمه "Y2K". والآن جاء دور تاريخ آخر: 19 يناير 2038. في ذلك اليوم، وبعد أن تتجاوز الساعة 03:14:07 (UTC) بثانية واحدة، قد تحوّل بعض الحواسيب القديمة التقويم فجأة إلى عام 1901. وهذا ليس سيناريو خيال علمي، بل مشكلة رياضية بسيطة.
كيف تعدّ الحواسيب الزمن؟
يحتفظ Unix والكثير من الأنظمة المشتقة منه بالزمن لا بوصفه ساعة أو تقويمًا، بل رقمًا واحدًا. وهذا الرقم هو عدد الثواني التي مرت منذ منتصف ليل 1 يناير 1970 (UTC). ويسمى "وقت Unix".
المشكلة أن هذا الرقم يُخزَّن في كثير من الأنظمة القديمة عددًا صحيحًا ذا إشارة بطول 32 بت. وأكبر قيمة يمكن أن يبلغها عدد ذو إشارة بطول 32 بت هي 2,147,483,647، أي 2 أس 31 ناقص 1. وهذا العدد من الثواني يعادل نحو 68 سنة. ومعنى "ذو إشارة" أن بتًا واحدًا مخصص لبيان كون الرقم موجبًا أم سالبًا. لذلك لا تُستخدم الـ 32 بتًا كلها، بل 31 فقط للمقدار.
وإذا أضفنا 68 سنة إلى 1970 وصلنا إلى 2038. والحساب يشير بالضبط إلى 19 يناير 2038، الساعة 03:14:07 UTC.
ماذا سيحدث بعد ثانية؟
يفيض العداد بعد ثانية من بلوغه أكبر قيمة. تخيّل عدادات المسافات الميكانيكية القديمة في السيارات: بعد 999,999 تعود إلى 000,000. وهنا يحدث شيء مشابه، لكن بما أن الرقم ذو إشارة، تتحول القيمة إلى رقم سالب كبير جدًا.
يفسر النظام المتأثر هذا الرقم السالب على أنه ثوانٍ تُعدّ إلى الوراء من 1970. والنتيجة: يظهر التاريخ 13 ديسمبر 1901، الساعة 20:45:52 (UTC). حاسوب رجع فجأة 136 سنة إلى الوراء؛ وقد تبدأ الشهادات والمؤقتات والسجلات ومقارنات التواريخ في العمل بشكل خاطئ.
من المعرّض للخطر؟
الغالبية العظمى من الهواتف والحواسيب الحديثة التي تستخدمها يوميًا صارت تستخدم قيم زمن بطول 64 بت. والخطر الحقيقي في الأنظمة التي تعمل سنوات طويلة دون تحديث. وتبرز ويكيبيديا خصوصًا الأنظمة القديمة (legacy) والأنظمة المدمجة: أجهزة التحكم الصناعية وبعض أجهزة الشبكات والأنظمة داخل المركبات، أي الآلات التي تُركَّب مرة ثم تُنسى.
ولأن مثل هذه الأجهزة لا تُحدَّث كثيرًا، فقد يبقى في داخلها عند حلول 2038 جزء ما زال يعدّ الزمن بـ 32 بت.
| زمن 32 بت ذو إشارة | زمن 64 بت ذو إشارة |
|---|---|
| أكبر قيمة 2,147,483,647 | مدى أكبر بكثير |
| الحد: 19 يناير 2038 | الحد: بعد نحو 292 مليار سنة |
| الأنظمة القديمة والمدمجة | أنظمة التشغيل الحديثة |
الحل: عداد أكبر
الصعوبة هنا عملية أكثر منها تقنية. فتغيير حجم الرقم الذي يحفظ الزمن قد يؤثر في كل برنامج يستخدم ذلك الرقم وكل صيغة ملف وكل حقل في قاعدة بيانات. من السهل تصحيح سطر واحد، أما العثور على كل البرمجيات داخل جهاز وتحديثها فقد يستغرق سنوات.
الحل بسيط من حيث الفكرة: حفظ الزمن بعدد ذي إشارة بطول 64 بت. وبحسب ويكيبيديا، يدفع هذا لحظة الفيض إلى نحو 292 مليار سنة في المستقبل. أي إلى ما يتجاوز بكثير عمر الكون الحالي.
وهذا الانتقال جارٍ منذ سنوات. فبحسب خبر Phoronix في يناير 2020، كان Linux 5.6 يُعدّ ليكون أول إصدار رئيسي للنواة يمكن أن يضع أساسًا لعمل الأنظمة ذات الـ 32 بت بعد 2038. وتذكر ويكيبيديا أن Linux 5.6 الذي صدر في 2020 أضاف دعم الزمن بـ 64 بت في المعماريات ذات الـ 32 بت. ولكي ينجح ذلك يجب أيضًا إعادة ترجمة التطبيقات بزمن 64 بت.
ومن الحلول المقترحة الأخرى جعل الرقم بلا إشارة (unsigned). لكن هذا لا يؤجل الحد إلا إلى 2106، ويفسد استخدام التواريخ السابقة لعام 1970. لذلك يُنظر إلى الانتقال إلى 64 بت بوصفه الطريق الحقيقي.
لم يتحول Y2K إلى كارثة كبرى لأن الناس عملوا مسبقًا؛ فهل تظن أن هذه البطولة الصامتة ستتكرر في السنوات المتبقية حتى 2038؟