Проблема 2038 года. Когда закончится время. Linux статьи
Написать статью
Войдите, чтобы писать статьи

Проблема 2038 года. Когда закончится время

2

Проблема 2038 года

Проблема 2038 года, ее еще называют Unix Millennium bug или Y2K38. Что это такое и почему она возникнет?

Смотрите видео, посвященное проблеме 2038 года

19 января 2038 года или на кануне этой даты могут произойти сбои в различном программном обеспечении.

Почему

Время и дату в компьютерных программах можно хранить по разному. Один из способов хранения даты — это использование стандарта POSIX (UNIX timestamp, Unix epoch).

В стандарте POSIX время записывается как количество секунд, прошедших с 0 часов 0 минут 0 секунд 1 января 1970 года по Всемирному времени (UTC). Для Unix-подобных операционных систем — это стандарт представления времени.

Дата в таком формате записывается как обычное целое число — число секунд. Очевидно, что чем позднее дата от даты 1 января 1970, тем больше секунд прошло с этой даты. Значит тем большее значение нужно сохранять в программах, использующие даты.

Например:
Для 01.01.1970 00:00:05 это число +5 (сек).
Для 31.08.1970 12:10:33 это число +20952633 (сек).
Для 19.01.2038 00:00:00 это число +2147472000 (сек).
Для 19.01.2038 03:14:07 это число +2147483647 (сек).

В старых программах (а иногда даже в новых) дата часто хранится в целочисленном 32-х битном знаковом формате — signed int. Это означает, что под число выделяется 32 бита:
00000000 00000000 00000000 00000000 

  • Первый бит (выделен красным), служит для определения знака числа. Значение 0 соответствует +, а значение 1 соответствует -).
  • 31 бит (выделены синим) для хранения значения самого числа.

Максимальное число, которое можно сохранить, используя 31 бит, это число 2147483647. В 32-х битном знаковом целочисленном формате записывается оно следующим образом:
01111111 11111111 11111111 11111111 
В POSIX это число соответствует дате 19.01.2038 03:14:07. Как видим, это и есть «роковое» 19 января 2038 года.

Представление числа в знаковом 32 битном формате

Что произойдет 19 января 2038

Могут произойти сбои программного обеспечения различной степени серьезности, могут произойти потери данных, программы могут начать работать не так, как ожидается.

Что будет внутри программ

Рассмотрим, что именно произойдет внутри программ. Числа больше 2147483647 не влезают в 31-бит.

Например, для числа 2147483647+1= 2147483648 нужно уже 32 бита. Это число записывается в двоичной системе, как единица в старшем разряде и 31 ноль:
10000000 00000000 00000000 00000000 
Для 32-х битного типа signed integer — это число соответствует числу: −2147483648. Как было сказано выше, 1 в первом разряде обозначает отрицательное число.

Получается, что числа больше 2147483647 уже нельзя записать в 31 бит, но так как у нас есть еще один бит для хранения знака, программа запишет эти числа в память, но в программе они будут трактоваться как отрицательные числа.

Происходит как бы зацикливание числа. Если говорить о количестве секунд, увеличивающихся на 1, то они достигают значения 2147483647, а потом переходят в отрицательную область: −2147483648, −2147483647, −2147483646 и т.д. В программах такие числа будут трактоваться как 1970-й или 1901-й год (зависит от реализации).

Как это повлияет на работу программ

Все зависит от того, насколько дата и время важны в конкретной программе. Если работа программы зависит от времени, то скорее всего могут произойти сбои в работе программы или потери данных.

Например, если в табличных данных используется сортировка по времени, а для новых данных оно будет трактоваться, как отрицательное число, то эти данные будут трактоваться как старые данные, и сортировка будет нарушена.

Или, например, если программа очищает, какие-нибудь данные спустя определенное время, то при неверной трактовки времени, могут быть удалены еще актуальные данные.

Получается, что, чем больше работа программа зависит от времени, хранимого 32-х битном типе signed integer, то тем серьезнее могут быть последствия.

Так ли все серьезно

И да и нет. На самом деле — да!

Современные 64-х разрядные системы не подвержены данное проблеме, поэтому на них она никак не повлияет.

Для существующих 32-разрядных программ и систем уже выпущено множество патчей для исправления данной проблемы. Например, Microsoft, как он утверждает, уже обнаружил и исправил проблемы в 32-х разрядных версиях Windows.

Но все программы не исправить, поэтому многие из них остаются в зоне риска. Более того, даже сейчас выпускается множество 32-х битных систем, особенно встраиваемых.

Наибольшую опасность здесь представляет программное обеспечение, которое используется в промышленных областях. Для управления станками, машинами, отвечает за работу заводов, электростанций, медицинских приборов, военных устройств и других важных объектов.

Проблема 2038

Поэтому, если не предпринимать никаких действий, то последствия проблемы 2038 года могут от смешных до катастрофических.

Конечно, до 2038 года еще много времени и многие из них будут заменены на новые. Но все мы знаем, как быстро идет время, поэтому расслабляться не стоит. Более того, есть программы, которые уже сейчас могут использовать даты в будущем. Проблемы в таких программах могут начаться намного раньше.

Unix Millennium bug

Лайков: +2
войдите, чтобы ставить лайки
2
  • Опубликовано: 13.03.2019

Комментарии

mcsvat
27.01.2023
09:41
Постоянная ссылка на комментарийПостоянная ссылка на комментарий
0
войдите, чтобы ставить лайки
Проблема не в 32 битах, а в том что кто то не может передвинуть начальное число на 1999 год, или 2000 или 2001, или 2022.
Slawyan
Активный пользователь
Активный
27.01.2023
10:04
Постоянная ссылка на комментарийПостоянная ссылка на комментарийРодительский комментарийmcsvatРодительский комментарий
0
войдите, чтобы ставить лайки
Ну и что получится? Сдвинешь ты допустим до 2000, и часы начнут отставать на 30 лет.

Написать комментарий

Ваше имя:
Текст комментария:
  • Уважать других.
  • Не ругаться.
  • Без оскорблений.
  • Без грубости.
  • Не переходить на личности.
  • Писать на русском языке.
  • Без политики.
  • Без флуда.
Правила