Закрити
Проблема 38
05 Липня 2013, 12:39 , Переглядів: 2254
FacebookTwitterLivejournal
Проблема 38 Фото: http://enclavedemac.blogspot.com Проблема 38

Швидше за все, день 19 січня 2038 року пройде ще менш болісно, ​​ніж 1 січня 2000, але шум, викликаний помилкою Y2K, привернув увагу і до цієї міни, що закладена в ОС Unix. Вона називається Year 2038 problem.

Проблема, з якою людство зіткнеться через 25 років, може проявити себе у програмах, які написані на Сі і використовують стандартну бібліотеку часу standard time library (time.h). У бібліотеці time.h для внутрішнього представлення значень поточної дати і часу використовується змінна time_t, де у форматі цілого числа зберігається число секунд, що накопичується з 0 годин 00 хвилин 00 секунд 1 січня 1970 за Гринвічем. З тих пір ось вже більше 40 років кожну секунду значення time_t збільшується на одиницю.

Вибрана розробниками Unix форма подання часу в секундах без хвилин, годин, діб, місяців і років приваблива тим, що для обчислення тривалості інтервалу між двома моментами достатньо однієї арифметичної дії. Але, прийнявши це цілком розумне рішення, розробники все ж виявилися не надто далекоглядні і допустили прорахунок, який повинен проявитися через 74 роки після запуску лічильника.

Суть "Проблеми 2038" полягає в тому, що для зберігання значення часу використовуються 32 двійкових розряди, отже, максимальне значення змінної time_t дорівнює 2 в 31-й ступеня мінус 1, тобто 2147483647. Момент, коли настане переповнення time_t, випадає на 19 січня 2038.

Точніше кажучи, "Проблема 2038" закладена в POSIX. Так називається набір стандартів, відомий у США як IEEE 1003, його міжнародна назва - ISO / IEC 9945. POSIX (Portable Operating System Interface) служить стандартом для прикладних користувацьких інтерфейсів з 1985 року для різних варіантів ОС Unix. Ім'я власне POSIX було запропоновано Річардом Столманом, що є однією з центральних фігур в русі за вільне ПЗ, засновником проектів GNU і Free Software Foundation. Ім'я було придумано на прохання IEEE, яким хотілося мати щось що запам'ятовується. Неважко здогадатися, що X в POSIX "успадковує" X від Unix.

Отже, 19 січня 2038 в 3:00 14 хвилин 8 секунд трапиться "катастрофа". Ціле зі знаком time_t по досягненні значення 2147483647 і будучи збільшеним на одиницю перетвориться на -2147483648, що відповідає 13 грудня 1901, 8:45:52. Якщо не вжити профілактичних заходів, то на всіх Unix-системах по всьому світу після 19 січня 2038 настане 13 січня 1901 і більшість функцій, що використовують time_t, видадуть код помилки.

Для інтервалу часу з 1 січня 1970 року по 19 січня 2038 придумано спеціальну назву - "епоха Unix" (Unix Epoch). Для того щоб Unix-системи змогли безболісно працювати і після закінчення "епохи", їх слід пристосувати для роботи в 64-розрядному режимі, що вимагає перекомпіляції файлів заголовків і визначення time_t як 64-розрядного цілого. При цьому можуть, чого не можна виключити, виникнути проблеми не менш серйозні, ніж у випадку "Помилки Y2K", оскільки в якихось програмах містяться неочевидні методи використання змінної time_t або ж можуть бути відсутні вихідні коди, необхідні для перекомпіляції.

Якщо ж всі необхідні процедури виконати правильно, то 64 розрядів вистачить на наступні 300 млрд. років, що приблизно в 20 разів більше оцінюваного часу існування Всесвіту, і "епоха Unix" продовжиться.

Видалити Відміна
Забанити Відміна