ما هي حقبة يونكس ، وكيف يعمل وقت يونكس؟
يخزن Unix الوقت على أنه عدد الثواني منذ 1 يناير 1970. وهذا يعني أن Linux يفعل ذلك أيضًا. نفسر هذا النظام الذي يبدو غريبًا ، ولماذا تم تحديد يوم القيامة في عام 2038.
عصر يونكس الأول
أعلن جوته (1749-1832) أن “كل ثانية لها قيمة غير محدودة”. هذا صحيح ، كل منا لديه الكثير من الثواني هنا على كوكب الأرض ، ولا نعرف متى ستكون الثانية الأخيرة. لكننا نعرف عيد ميلادنا ومتى بدأ العد التنازلي المميت.
يونكس – مثل الملكة البريطانية – لها عيدا ميلاد. أو ، بشكل أكثر دقة ، كانت هناك مناسبتان منفصلتان بدأت فيهما عد ثوان وجودها. كانت المرة الأولى التي بدأ فيها يونكس العد منذ منتصف ليل الأول من يناير عام 1971.
يمكننا أن نرى هذا بوضوح من خلال مراجعة قسم من الإصدار الأول من دليل مبرمج يونكس ، بتاريخ 3 نوفمبر 1971. قم بالتمرير لأسفل إلى الصفحة 13 من هذا القسم ، وسترى وصفًا لأمر الوقت (الذي لم يعد موجودًا الآن) . قيل لنا أن “الوقت يُرجع الوقت منذ 00:00:00 ، 1 كانون الثاني (يناير) 1971 ، مُقاسًا بستين من الثانية”.
تقيس التقاويم وأنظمة الوقت الوقت الذي يبدأ عند نقطة مهمة في الماضي ، مثل حدث كوني أو تأسيس إمبراطورية أو نجاح ثورة. في أنظمة التشغيل ، يتم اختيار الوقت والتاريخ التعسفيين كنقطة بدء العد. هذه هي حقبة نظام التشغيل هذا.
استخدم Unix عددًا صحيحًا بدون إشارة يبلغ 32 بت ليحمل 60 جزءًا من الثانية منذ الحقبة. هذا متغير رقمي قادر على الاحتفاظ بالقيم في النطاق من 0 إلى 4،294،967،295 (232-1). هذا يبدو مثل الكثير. لكن العداد يتزايد بمعدل 60 مرة في الثانية ، وكما يشير دليل المبرمج ، “سيلاحظ المستخدم صاحب التفكير الزمني أن 2 ** 32 ستين من الثانية تبلغ حوالي 2.5 سنة فقط”.
مع معدل استهلاك يبلغ 60 رقمًا في الثانية ، كان من الممكن أن يصل العداد إلى قيمته القصوى في 8 أبريل 1973 ، أي أقل بقليل من 829 يومًا بعد ذلك.
حقبة يونكس الثانية
وغني عن القول ، تم اتخاذ هذا الإجراء بسرعة. تم استبدال العدد الصحيح الموقع بعدد صحيح بدون إشارة 32 بت. قد يبدو اختيارًا مفاجئًا لأن عددًا صحيحًا بعلامة قادر على الاحتفاظ بعدد أقل من القيم الموجبة – 2،147،483،647 (231) – من عدد صحيح بدون إشارة. ومع ذلك ، تم أيضًا تقليل سرعة الاستهلاك من 60 جزء من الثانية إلى ثواني كاملة.
يستغرق العد من 0 إلى 2،147،483،647 وقتًا أطول من العد من 0 إلى 4،294،967،295 بمعدل 60 في الثانية. وبهامش كبير. لن يصل المخطط الجديد إلى قيمته القصوى لما يزيد قليلاً عن 68 عامًا. بدا هذا حتى الآن في المستقبل حتى أن الحقبة أعيدت إلى نقطة زمنية سابقة. تم تعيين العصر الجديد في منتصف ليل 1 يناير 1970 ، بالتوقيت العالمي المنسق.
هذه النقطة 68 عامًا في المستقبل أصبحت الآن قريبة بشكل مثير للقلق. على وجه الدقة ، سنصل إليه الساعة 03:14:07 بالتوقيت العالمي المنسق في 19 كانون الثاني (يناير) 2038.
مخطط بسيط ولكنه فعال
يعد استخدام عدد صحيح واحد لحساب عدد الخطوات الزمنية من نقطة زمنية معينة طريقة فعالة لتخزين الوقت. لا تحتاج إلى تخزين هياكل معقدة لسنوات وشهور وأيام وأوقات. وهي مستقلة عن البلد والإعدادات المحلية والمنطقة الزمنية.
إن ضرب الرقم في العدد الصحيح بحجم الخطوة الزمنية – في هذه الحالة ، ثانية واحدة – يمنحك الوقت منذ الحقبة ، والتحويل من ذلك إلى تنسيقات خاصة بالإعدادات المحلية مع عمليات ضبط المنطقة الزمنية أمر تافه نسبيًا.
إنه يمنحك حدًا أعلى مدمجًا على الرغم من ذلك. عاجلاً أم آجلاً ، ستصل إلى الحد الأقصى للقيمة التي يمكنك الاحتفاظ بها في نوع المتغير الذي اخترته. في وقت كتابة هذا المقال ، كان عام 2038 على بعد 17 عامًا فقط.
إنه مشابه ولكنه يختلف قليلاً عن مشكلة أنظمة الكمبيوتر المبكرة من القرن الماضي باستخدام رقمين لتخزين سنوات. عندما يتحول التقويم إلى العام الجديد والقرن الجديد لعام 2000 ، هل سيتم تفسير قيمة السنة المخزنة على أنها “00” على أنها 2000 أو 1900؟
تشير التقديرات إلى أن تصحيح ما يسمى بـ “أخطاء الألفية” كلف الولايات المتحدة وحدها أكثر من 100 مليار دولار ، واستغرق الأمر آلاف السنين لمعالجته عالميًا. كانت هناك بعض المشكلات في الأيام القليلة الأولى من شهر كانون الثاني (يناير) 2000 ، ولكن لا يوجد شيء مثل الكوارث التي كانت ستحدث إذا تم تجاهل الخطأ.
نظرًا لأن Linux وجميع أنظمة التشغيل الشبيهة بـ Unix تشترك في نفس المشكلة ، فقد تم التعامل مع مشكلة عام 2038 على محمل الجد لبعض الوقت ، مع إضافة إصلاحات إلى kernel منذ عام 2014. وهذا مستمر مع الإصلاحات التي تمت إضافتها إلى kernel مؤخرًا مثل Jan .2020 لمعالجة مشكلة العدد الصحيح 32 بت.
بالطبع ، يحتوي كمبيوتر Linux العامل على أكثر بكثير من مجرد نواة. يجب تعديل جميع أدوات التشغيل وتطبيقات userland التي تستفيد من وقت النظام من خلال واجهات برمجة التطبيقات والواجهات المختلفة لتوقع قيم 64 بت. يجب أيضًا تحديث أنظمة الملفات لقبول طوابع زمنية 64 بت للملفات والأدلة.
لينكس في كل مكان. قد يعني الفشل الكارثي في Linux حدوث فشل في جميع أنواع الأنظمة المعتمدة على الكمبيوتر. يدير Linux معظم الويب ومعظم السحابة العامة وحتى المركبات الفضائية. تدير منازل ذكية وسيارات ذاتية القيادة. تحتوي الهواتف الذكية على نواة مشتقة من نظام Unix في قلبها. عمليًا ، أي شيء – مثل جدران حماية الشبكة ، وأجهزة التوجيه ، ومودم النطاق العريض – الذي يحتوي على أنظمة تشغيل مضمنة يعمل على Linux.
إنه لأمر رائع أن Linux في طريقه إلى الإصلاح. سنقوم بتثبيت الترقيات وستكون كذلك. ولكن ما هي احتمالات أن يتم تصحيح وتحديث كل هذه الأجهزة؟ لن يكون الكثير منهم في الخدمة بحلول ذلك الوقت ، لذا ستكون نقطة خلافية ، لكن البعض سيظل بعيدًا. مختبئًا بعيدًا في فترات استراحة مظلمة ومغبرة في غرف الخوادم وخزائن الرفوف ، ربما ، لكنهم سيكونون هناك ، يعملون بهدوء ، بينما تتأرجح الثواني حتى الساعة الثالثة والربع تقريبًا في صباح 19 يناير 2038.
لكن الأجهزة من هذا القبيل يجب أن تكون أقلية ضئيلة. ستشهد الغالبية العظمى من الأنظمة وقت الأزمة يأتي ويذهب دون وقوع حوادث. مرة أخرى ، سنتمكن من الاسترخاء. على الأقل ، حتى اقتراب عام 2486 ، جلبت معه نفس المشكلة بالضبط للأنظمة التي تستخدم الأعداد الصحيحة المستندة إلى 64 بت لحساب الوقت منذ الحقبة.
أمر التاريخ
يمكننا استخدام الأمر date للتحقق من Linux ومشتقات Unix الأخرى التي لا تزال تستخدم المخطط الأصلي البسيط لتخزين قيمة الوقت على أنها عدد الثواني منذ الحقبة.
يؤدي استخدام أمر التاريخ بدون أي معلمات إلى طباعة التاريخ والوقت الحاليين في نافذة المحطة الطرفية. تظهر لك أيضًا المنطقة الزمنية التي تم ضبط الوقت من أجلها. بتوقيت شرق الولايات المتحدة هو التوقيت الصيفي الشرقي ، مما يعني أن الكمبيوتر التجريبي الخاص بنا موجود في المنطقة الزمنية الشرقية ، والتوقيت الصيفي ساري المفعول. عندما لا يكون التوقيت الصيفي ساري المفعول ، تستخدم المنطقة الزمنية الشرقية التوقيت القياسي الشرقي.
لمعرفة قيمة العدد الصحيح الأساسي ، يمكننا استخدام سلسلة تنسيق العرض. تحتوي سلاسل التنسيق على علامة الجمع “+” كحرف أول. الرمز المميز للتنسيق “٪ s” يعني “إظهار الثواني منذ الحقبة.”
إذا أخذنا قيمة الثواني التي تم إرجاعها حسب التاريخ وأدخلناها مرة أخرى في أمر التاريخ باستخدام الخيار -d (وقت العرض الموضح بسلسلة) ، فسنحولها مرة أخرى إلى تاريخ ووقت عادي.
date
date +%s
date -d @1633183955
يمكننا أن نبين أن قيمة العدد الصحيح تمثل الوقت حقًا من خلال عرض عدد الثواني ، والنوم لمدة 10 ثوانٍ ، وإظهار عدد الثواني الجديد. ستختلف قيمتا العدد الصحيح بمقدار 10 بالضبط.
date +%s && sleep 10 && date +%s
لقد رأينا أنه يمكننا تمرير عدد من الثواني لأمر التاريخ ويتحول إلى وقت وتاريخ بالنسبة لنا. إذا فعلنا ذلك باستخدام صفر ثانية كإدخال قيمنا ، فيجب أن يطبع التاريخ تاريخ ووقت حقبة Unix.
TZ='UTC' date -d @0 +'%x %R'
ينهار الأمر على النحو التالي:
- TZ = “UTC”: تم تعيين العصر باستخدام التوقيت العالمي المنسق (UTC ، لذلك نحتاج إلى إخبار التاريخ لاستخدام UTC. يحدد تكوين “TZ =” المنطقة الزمنية الفعالة للأمر الحالي فقط.
- التاريخ: أمر التاريخ.
- -d @ 0: نخبر التاريخ باستخدام سلسلة كمدخلات ، وليس الوقت “الآن”. السلسلة التي نمررها لا تحتوي على ثانية.
- + ‘٪ x٪ R’: سلسلة تنسيق الإخراج. يخبر الرمز المميز للتنسيق “٪ x” التاريخ لعرض السنة والشهر واليوم. يرشد الرمز المميز للتنسيق “٪ R” التاريخ إلى استخدام تنسيق 24 ساعة للساعات والدقائق. نظرًا لوجود مسافات في سلسلة التنسيق ، فإننا نلف السلسلة بأكملها في علامتي اقتباس مفردة “” بحيث يتم التعامل مع السلسلة كعنصر واحد.
كما هو متوقع ، يكون الإنتاج منتصف ليل 1 يناير 1970.
حتى المرة القادمة
غالبًا ما يكون البساطة هو الأفضل. يعد عد الثواني من مسند ثابت هو أبسط طريقة لتمييز مرور الوقت. لكن مرور الوقت يجلب معه تحديات جديدة. مع الإصلاحات التي تم وضعها ، يبدو أننا أصبحنا واضحين حتى عام 2486.
أعتقد أنه من الآمن أن نقول إننا سنقلق بشأن ذلك قريبًا من الوقت.