بازی های جالب آندروید

مشکل سال ۲۰۳۸ در لینوکس چیست و آیا قرار است یونیکس در ۱۹ ژانویه ۲۰۳۸ از کار بیفتد؟

۲۹ خرداد ۱۳۹۷

اگر مراحل توسعهٔ لینوکس را از نزدیک دنبال کرده باشید، احتمالاً اطلاعاتی راجع به باگ سال ۲۰۳۸ شنیده‌اید. این باگ یا مسأله مربوط به این قضیه است که آخرین زمانی که می‌توان توسط فرمت زمانی ۳۲بیتی اعداد صحیح به‌ اصطلاح Signed در یونیکس نشان داد، دقیقاً تا ساعت ۰۳:۱۴:۰۷ UTC در تاریخ ۱۹ ژانویه ۲۰۳۸ تمام می‌شود و از آن پس برنامه‌هایی که به زبان C نوشته شده‌اند و از لایبرری استاندارد تایم این زبان استفاده می‌کنند در نمایش تاریخ به مشکل خواهند خورد!

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


در آن سال‌ها که ۱۹ سال تا رسیدن به پایان قرن بیستم زمان باقی مانده بود، با کاهش سایز فایل‌ها‌ و دیتابیس‌ها، پول بیشتری صرفه‌جویی می‌شد ولی بعدها مشخص شد که در این فرمت، میان سال ۲۰۰۰ و ۱۹۰۰ یا حتی ۱۹۱۰۰ تفاوتی دیده نمی‌شد که برای حل این مشکل، دولت‌ها اقدام به تشکیل کمیته‌هایی مخصوص کردند تا مطمئن شوند در زیرساخت‌های حساس آن‌ها این مشکل رفع شده باشد.


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


آخرین زمانی که به‌ عنوان یک عدد ۳۲بیتی از جنس Integer می‌تواند در یونیکس به‌ کار رود، ۰۳:۱۴:۰۷ UTC در تاریخ ۱۹ ژانویه ۲۰۳۸ است (به‌ عبارت دیگر، یعنی ۲۱۴۷۴۸۳۶۴۷ ثانیه بعد از تاریخ ۱ ژانویه ۱۹۷۰٫) به زبان عامیانه، پس از این تاریخ به‌ دلیل سرریز شدن دیتاتایپ Integer، مقدار ذخیره شده به یک عدد منفی تبدیل خواهد شد و سیستم‌هایی که به‌روز نشده باشند، تاریخ را به جای ۱۹ ژانویه ۲۰۳۸، به‌ صورت ۱۳ دسامبر ۱۹۰۱ نشان خواهند داد (سفری به گذشته!) به عبارت دیگر، سیستم‌های یونیکسی به دلیل تمام شدن بیت‌ها برای شمارش ثانیه، به یک‌باره ریست می‌شوند و از همین روی در آن زمان برنامه‌هایی که به زبان C نوشته شده‌اند و از لایبرری استاندارد تایم این زبان استفاده می‌کنند، شروع به ایجاد مشکل در نمایش تاریخ خواهند کرد (می‌توانید اطلاعات بیشتری را در صفحهٔ ویکیپدیای مشکل سال ۲۰۳۸ مطالعه کنید.)


راه‌کارهای رفع باگ هزارهٔ یونیکس
در حال حاضر، راه‌حل جامعی برای باگ سال ۲۰۳۸ وجود ندارد؛ اگر قرار باشد تغییری در تعریف دیتا‌تایپ time_t صورت بگیرد، که برای ذخیرهٔ مقادیر زمانی استفاده می‌شود، مشکلاتی مربوط به سازگاری در برنامه‌هایی که به نوع اعداد صحیح ۳۲بیتی وابسته هستند رخ خواهد داد. اگر فرض کنیم تایپ time_t به اعداد صحیح به‌ اصطلاح Unsigned که ۳۲بیتی هستند تغییر داده شود، این مسئله باعث می‌شود محدودیت آخرین زمان قابل‌نمایش افزایش داده شود که در این صورت مشکلات جدیدی مربوط به زمان‌های پیش از سال ۱۹۷۰ ایجاد خواهد شد که در حال حاضر با اعداد صحیح منفی نشان داده می‌شوند.


سیستم‌عامل‌ها و برنامه‌های ۶۴بیتی از اعداد صحیح ۶۴بیتی در time_t استفاده می‌کنند که با استفاده از مقادیر Signed از نوع ۶۴بیتی می‌توان ۲۹۲ میلیارد سال از حال حاضر به بعد را نشان داد. علاوه بر این، چندین طرح پیشنهادی نیز ارائه شده که شامل ذخیره‌سازی میلی‌ثانیه یا میکروثانیه از یک مبدأ تاریخ (مثلاً ۱ ژانویه ۱۹۷۰ یا ۱ ژانویه ۲۰۰۰) در اعداد صحیح Signed از نوع ۶۴بیتی می‌شود که حداقل بازهٔ ۳۰۰۰۰۰ ساله‌ای را پوشش می‌دهد.


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

منبع