مشکل سال 2038 در لینوکس چیست و آیا قرار است یونیکس در 19 ژانویه 2038 از کار بیفتد؟

مشکل سال 2038 در لینوکس چیست و آیا قرار است یونیکس در 19 ژانویه 2038 از کار بیفتد؟

اگر مراحل توسعهٔ لینوکس را از نزدیک دنبال کرده باشید، احتمالاً اطلاعاتی راجع به باگ سال 2038 شنیده‌اید. این باگ یا مسأله مربوط به این قضیه است که آخرین زمانی که می‌توان توسط فرمت زمانی 32بیتی اعداد صحیح به‌ اصطلاح Signed در یونیکس نشان داد، دقیقاً تا ساعت 03:14:07 UTC در تاریخ 19 ژانویه 2038 تمام می‌شود و از آن پس برنامه‌هایی که به زبان C نوشته شده‌اند و از لایبرری استاندارد تایم این زبان استفاده می‌کنند در نمایش تاریخ به مشکل خواهند خورد!

درآمدی بر Millennium Bug
مشکل سال 2000 که به باگ هزاره (Millennium Bug) یا مشکل Y2K نیز معروف است، باگی بود که به فرمت و ذخیره‌سازی تاریخ و تقویم مربوط می‌شد و این مسأله به این خاطر به‌ وجود آمد که ذخیره‌سازی دیتا در کامپیوترهای اولیه بسیار هزینه‌بَر بود و از همین روی برای کاهش فضای ذخیره‌سازی، دولوپرها از فرمت 6 رقمی MMDDYY استفاده کردند (MM برای ماه، DD برای روز و YY برای سال.)

در آن سال‌ها که 19 سال تا رسیدن به پایان قرن بیستم زمان باقی مانده بود، با کاهش سایز فایل‌ها‌ و دیتابیس‌ها، پول بیشتری صرفه‌جویی می‌شد ولی بعدها مشخص شد که در این فرمت، میان سال 2000 و 1900 یا حتی 19100 تفاوتی دیده نمی‌شد که برای حل این مشکل، دولت‌ها اقدام به تشکیل کمیته‌هایی مخصوص کردند تا مطمئن شوند در زیرساخت‌های حساس آن‌ها این مشکل رفع شده باشد.

درآمدی بر Unix Millenium Bug
در حال حاضر نیز به مانند قبل مسالهٔ سال 2038 مشکل دیگری را در دنیای محاسبات به وجود آورده است به طوری که مشکل سال 2038 که به Unix Millenium Bug (باگ هزارهٔ یونیکس) یا Y2K38 نیز معروف است، می‌تواند مشکلاتی در ذخیره‌سازی دیتا به‌ بار آورد چرا که در برنامه‌های قدیمی، به‌ خاطر استفاده از اعداد صحیح 32بیتی به اصطلاح Signed، بعد از آن تاریخ مقدار نادرستی نشان داده خواهد شد.

آخرین زمانی که به‌ عنوان یک عدد 32بیتی از جنس Integer می‌تواند در یونیکس به‌ کار رود، 03:14:07 UTC در تاریخ 19 ژانویه 2038 است (به‌ عبارت دیگر، یعنی 2147483647 ثانیه بعد از تاریخ 1 ژانویه 1970.) به زبان عامیانه، پس از این تاریخ به‌ دلیل سرریز شدن دیتاتایپ Integer، مقدار ذخیره شده به یک عدد منفی تبدیل خواهد شد و سیستم‌هایی که به‌روز نشده باشند، تاریخ را به جای 19 ژانویه 2038، به‌ صورت 13 دسامبر 1901 نشان خواهند داد (سفری به گذشته!) به عبارت دیگر، سیستم‌های یونیکسی به دلیل تمام شدن بیت‌ها برای شمارش ثانیه، به یک‌باره ریست می‌شوند و از همین روی در آن زمان برنامه‌هایی که به زبان C نوشته شده‌اند و از لایبرری استاندارد تایم این زبان استفاده می‌کنند، شروع به ایجاد مشکل در نمایش تاریخ خواهند کرد (می‌توانید اطلاعات بیشتری را در صفحهٔ ویکیپدیای مشکل سال 2038 مطالعه کنید.)

راه‌کارهای رفع باگ هزارهٔ یونیکس
در حال حاضر، راه‌حل جامعی برای باگ سال 2038 وجود ندارد؛ اگر قرار باشد تغییری در تعریف دیتا‌تایپ time_t صورت بگیرد، که برای ذخیرهٔ مقادیر زمانی استفاده می‌شود، مشکلاتی مربوط به سازگاری در برنامه‌هایی که به نوع اعداد صحیح 32بیتی وابسته هستند رخ خواهد داد. اگر فرض کنیم تایپ time_t به اعداد صحیح به‌ اصطلاح Unsigned که 32بیتی هستند تغییر داده شود، این مسئله باعث می‌شود محدودیت آخرین زمان قابل‌نمایش افزایش داده شود که در این صورت مشکلات جدیدی مربوط به زمان‌های پیش از سال 1970 ایجاد خواهد شد که در حال حاضر با اعداد صحیح منفی نشان داده می‌شوند.

سیستم‌عامل‌ها و برنامه‌های 64بیتی از اعداد صحیح 64بیتی در time_t استفاده می‌کنند که با استفاده از مقادیر Signed از نوع 64بیتی می‌توان 292 میلیارد سال از حال حاضر به بعد را نشان داد. علاوه بر این، چندین طرح پیشنهادی نیز ارائه شده که شامل ذخیره‌سازی میلی‌ثانیه یا میکروثانیه از یک مبدأ تاریخ (مثلاً 1 ژانویه 1970 یا 1 ژانویه 2000) در اعداد صحیح Signed از نوع 64بیتی می‌شود که حداقل بازهٔ 300000 ساله‌ای را پوشش می‌دهد.

پیشنهاد دیگر هم شامل ریکامپایل برنامه‌های قدیمی با استفاده از لایبرری‌های جدید تایم است. به هر ترتیب، کار همچنان ادامه دارد و طبق نظر متخصصین، برطرف کردن باگ سال 2038 نباید آن‌چنان هم سخت باشد. نظر شما چیست؟

منبع