Ошибка 2038 года

From Wikipedia, the free encyclopedia

An animated visual of the bug in action. The overflow error will occur at 03:14:08 UTC on 19 January 2038.

The year 2038 problem (also known as Y2038,[1] Y2K38, Y2K38 superbug or the Epochalypse[2][3]) is a time formatting bug in computer systems with representing times after 03:14:07 UTC on 19 January 2038.

The problem exists in systems which measure Unix time – the number of seconds elapsed since the Unix epoch (00:00:00 UTC on 1 January 1970) – and store it in a signed 32-bit integer. The data type is only capable of representing integers between −(231) and 231 − 1, meaning the latest time that can be properly encoded is 231 − 1 seconds after epoch (03:14:07 UTC on 19 January 2038). Attempting to increment to the following second (03:14:08) will cause the integer to overflow, setting its value to −(231) which systems will interpret as 231 seconds before epoch (20:45:52 UTC on 13 December 1901). The problem is similar in nature to the year 2000 problem.

Computer systems that use time for critical computations may encounter fatal errors if the Y2038 problem is not addressed. Some applications that use future dates have already encountered the bug. The most vulnerable systems are those which are infrequently or never updated, such as legacy and embedded systems. There is no universal solution to the problem, though many modern systems have been upgraded to measure Unix time with signed 64-bit integers which will not overflow for 292 billion years—approximately 21 times the estimated age of the universe.

Cause[edit]

Many computer systems measure time and date as Unix time, an international standard for digital timekeeping. Unix time is defined as the number of seconds elapsed since 00:00:00 UTC on 1 January 1970 (an arbitrarily chosen time), which has been dubbed the Unix epoch.[4]

Unix time has historically been encoded as a signed 32-bit integer, a data type composed of 32 binary digits (bits) which represent an integer value, with ‘signed’ meaning that the number is stored in Two’s complement format. Thus, a signed 32-bit integer can only represent integer values from −(231) to 231 − 1 inclusive. Consequently, if a signed 32-bit integer is used to store Unix time, the latest time that can be stored is 231 − 1 (2,147,483,647) seconds after epoch, which is 03:14:07 on Tuesday, 19 January 2038.[5] Systems that attempt to increment this value by one more second to 231 seconds after epoch (03:14:08) will suffer integer overflow, inadvertently flipping the sign bit to indicate a negative number. This changes the integer value to −(231), or 231 seconds before epoch rather than after, which systems will interpret as 20:45:52 on Friday, 13 December 1901. From here, systems will continue to count up, toward zero, and then up through the positive integers again. As many computer systems use time computations to run critical functions, the bug may introduce fatal errors.

Vulnerable systems[edit]

Any system using data structures with 32-bit time representations has an inherent risk to fail. A full list of these data structures is virtually impossible to derive, but there are well-known data structures that have the Unix time problem:

  • File systems (many file systems use only 32 bits to represent times in inodes)
  • Binary file formats (that use 32-bit time fields)
  • Databases (that have 32-bit time fields)
  • Database query languages (such as SQL) that have UNIX_TIMESTAMP()-like commands

Embedded systems[edit]

Embedded systems that use dates for either computation or diagnostic logging are most likely to be affected by the Y2038 problem.[1] Despite the modern 18–24 month generational update in computer systems technology, embedded systems are designed to last the lifetime of the machine in which they are a component. It is conceivable that some of these systems may still be in use in 2038. It may be impractical or, in some cases, impossible to upgrade the software running these systems, ultimately requiring replacement if the 32-bit limitations are to be corrected.

Many transportation systems from flight to automobiles use embedded systems extensively. In automotive systems, this may include anti-lock braking system (ABS), electronic stability control (ESC/ESP), traction control (TCS) and automatic four-wheel drive; aircraft may use inertial guidance systems and GPS receivers.[a] Another major use of embedded systems is in communications devices, including cell phones and Internet-enabled appliances (e.g. routers, wireless access points, IP cameras) which rely on storing an accurate time and date and are increasingly based on Unix-like operating systems. For example, the Y2038 problem makes some devices running 32-bit Android crash and not restart when the time is changed to that date.[6]

However, this does not imply that all embedded systems will suffer from the Y2038 problem, since many such systems do not require access to dates. For those that do, those systems which only track the difference between times/dates and not absolute times/dates will, by the nature of the calculation, not experience a major problem. This is the case for automotive diagnostics based on legislated standards such as CARB (California Air Resources Board).[7]

Early problems[edit]

In May 2006, reports surfaced of an early manifestation of the Y2038 problem in the AOLserver software. The software was designed with a kludge to handle a database request that should «never» time out. Rather than specifically handling this special case, the initial design simply specified an arbitrary time-out date in the future. The default configuration for the server specified that the request should time out after one billion seconds. One billion seconds (just over 31 years, 251 days, 1 hour, 46 minutes and 40 seconds) after 01:27:28 UTC on 13 May 2006 is beyond the 2038 cutoff date. Thus, after this time, the time-out calculation overflowed and returned a date that was actually in the past, causing the software to crash. When the problem was discovered, AOLServer operators had to edit the configuration file and set the time-out to a lower value.[8][9]

Solutions [edit]

There is no universal solution for the Year 2038 problem. For example, in the C language, any change to the definition of the time_t data type would result in code-compatibility problems in any application in which date and time representations are dependent on the nature of the signed 32-bit time_t integer. For example, changing time_t to an unsigned 32-bit integer, which would extend the range to 2106 (specifically, 06:28:15 UTC on Sunday, 7 February 2106), would adversely affect programs that store, retrieve, or manipulate dates prior to 1970, as such dates are represented by negative numbers. Increasing the size of the time_t type to 64 bits in an existing system would cause incompatible changes to the layout of structures and the binary interface of functions.

Most operating systems designed to run on 64-bit hardware already use signed 64-bit time_t integers. Using a signed 64-bit value introduces a new wraparound date that is over twenty times greater than the estimated age of the universe: approximately 292 billion years from now.[10] The ability to make computations on dates is limited by the fact that tm_year uses a signed 32-bit integer value starting at 1900 for the year. This limits the year to a maximum of 2,147,485,547 (2,147,483,647 + 1900).[11]

Alternative proposals have been made (some of which are already in use), such as storing either milliseconds or microseconds since an epoch (typically either 1 January 1970 or 1 January 2000) in a signed 64-bit integer, providing a minimum range of 300,000 years at microsecond resolution.[12][13] In particular, Java’s use of 64-bit long integers everywhere to represent time as «milliseconds since 1 January 1970» will work correctly for the next 292 million years. Other proposals for new time representations provide different precisions, ranges, and sizes (almost always wider than 32 bits), as well as solving other related problems, such as the handling of leap seconds. In particular, TAI64[14] is an implementation of the International Atomic Time (TAI) standard, the current international real-time standard for defining a second and frame of reference.

Implemented solutions[edit]

  • Starting with Ruby version 1.9.2, the bug with year 2038 is fixed,[15] by re-implementing time to have no minimum or maximum.[16]
  • Starting with NetBSD version 6.0 (released in October 2012), the NetBSD operating system uses a 64-bit time_t for both 32-bit and 64-bit architectures. Applications that were compiled for an older NetBSD release with 32-bit time_t are supported via a binary compatibility layer, but such older applications will still suffer from the Y2038 problem.[17]
  • OpenBSD since version 5.5, released in May 2014, also uses a 64-bit time_t for both 32-bit and 64-bit architectures. In contrast to NetBSD, there is no binary compatibility layer. Therefore, applications expecting a 32-bit time_t and applications using anything different from time_t to store time values may break.[18]
  • Linux originally used a 64-bit time_t for 64-bit architectures only; the pure 32-bit ABI was not changed due to backward compatibility.[19] Starting with version 5.6 of 2020, 64-bit time_t is supported on 32-bit architectures, too. This was done primarily for the sake of embedded Linux systems.[20]
  • FreeBSD uses 64-bit time_t for all 32-bit and 64-bit architectures except 32-bit i386, which uses signed 32-bit time_t instead.[21]
  • The x32 ABI for Linux (which defines an environment for programs with 32-bit addresses but running the processor in 64-bit mode) uses a 64-bit time_t. Since it was a new environment, there was no need for special compatibility precautions.[19]
  • Network File System version 4 has defined its time fields as struct nfstime4 {int64_t seconds; uint32_t nseconds;} since December 2000.[22] Values greater than zero for the seconds field denote dates after the 0-hour, January 1, 1970. Values less than zero for the seconds field denote dates before the 0-hour, January 1, 1970. In both cases, the nseconds (nanoseconds) field is to be added to the seconds field for the final time representation.
  • The ext4 filesystem, when used with inode sizes larger than 128 bytes, has an extra 32-bit field per timestamp, of which 30 bits are used for the nanoseconds part of the timestamp, and the other 2 bits are used to extend the timestamp range to the year 2446.[23]
  • The XFS filesystem, starting with Linux 5.10, has an optional «big timestamps» feature which extends the timestamp range to the year 2486.[24]
  • While the native APIs of OpenVMS can support timestamps up to 31 July 31086,[25] the C runtime library (CRTL) uses 32-bit integers for time_t.[26] As part of Y2K compliance work that was carried out in 1998, the CRTL was modified to use unsigned 32-bit integers to represent time; extending the range of time_t up to 7 February 2106.[27]
  • As of MySQL 8.0.28, the functions FROM_UNIXTIME(), UNIX_TIMESTAMP(), and CONVERT_TZ() handle 64-bit values on platforms that support them. This includes 64-bit versions of Linux, MacOS, and Windows.[28] In relational database versions prior to August 2021, built-in functions like UNIX_TIMESTAMP() will return 0 after 03:14:07 UTC on 19 January 2038.[29]

See also[edit]

  • Year 2000 problem, a similar problem that occurred with a rollover in years
  • Time formatting and storage bugs lists other similar problems, often caused by rollover similar to the cause of this year 2038 problem.
  • A GPS week number rollover will coincidentally happen later in 2038, for a different reason than this year 2038 problem.

Notes[edit]

  1. ^ GPS suffers its own time counter overflow problem known as GPS Week Number Rollover.

References[edit]

  1. ^ a b «Is the Year 2038 problem the new Y2K bug?». The Guardian. 17 December 2014. Retrieved 11 October 2018.
  2. ^ Bergmann, Arnd (6 February 2020). «The end of an Era». Linaro.
  3. ^ Wagenseil, Paul (28 July 2017). «Digital ‘Epochalypse’ Could Bring World to Grinding Halt». Tom’s Guide.
  4. ^ «Epoch Time». unixtutoria. Retrieved 13 April 2023.
  5. ^ Diomidis Spinellis (2006). Code quality: the open source perspective. Effective software development series in Safari Books Online (illustrated ed.). Adobe Press. p. 49. ISBN 978-0-321-16607-4.
  6. ^ «ZTE Blade running Android 2.2 has 2038 problems». Retrieved 20 November 2018.
  7. ^ «ARB Test Methods / Procedures». ARB.ca.gov. California Air Resources Board. Archived from the original on 18 November 2016. Retrieved 12 September 2013.
  8. ^ «The Future Lies Ahead». 28 June 2006. Retrieved 19 November 2006.
  9. ^ Weird «memory leak» problem in AOLserver 3.4.2/3.x 12 May 2006
  10. ^ «When does the 64-bit Unix time_t really end?». Retrieved 24 September 2022.
  11. ^ Felts, Bob (17 April 2010). «The End of Time». Stablecross.com. Retrieved 19 March 2012.
  12. ^ «Unununium Time». Archived from the original on 8 April 2006. Retrieved 19 November 2006.
  13. ^ Sun Microsystems. «Java API documentation for System.currentTimeMillis()». Retrieved 29 September 2017.
  14. ^ «TAI64».
  15. ^ «Ruby 1.9.2 is released». 18 August 2010. Retrieved 1 April 2022.
  16. ^ «Ruby 1.9.2 preview 1 released». www.ruby-lang.org. Retrieved 22 March 2023.
  17. ^ «Announcing NetBSD 6.0». 17 October 2012. Retrieved 18 January 2016.
  18. ^ «OpenBSD 5.5 released (May 1, 2014)». 1 May 2014. Retrieved 18 January 2016.
  19. ^ a b Jonathan Corbet (14 August 2013). «Pondering 2038». LWN.net. Archived from the original on 4 March 2016. Retrieved 9 March 2016.
  20. ^ «LKML: Arnd Bergmann: [GIT PULL] y2038: core, driver and file system changes». lkml.org. Retrieved 30 January 2020.
  21. ^ «arch». www.freebsd.org.
  22. ^ Haynes, Thomas; Noveck, David, eds. (March 2015). «Structured Data Types». Network File System (NFS) Version 4 Protocol. sec. 2.2. doi:10.17487/RFC7530. RFC 7530.
  23. ^ «ext4 Data Structures and Algorithms». Retrieved 13 September 2022.
  24. ^ Michael Larabel (15 October 2020). «XFS File-System With Linux 5.10 Punts Year 2038 Problem To The Year 2486». Phoronix. Retrieved 13 September 2022.
  25. ^ «Why is Wednesday, November 17, 1858 the base time for OpenVMS (VAX VMS)?». Stanford University. 24 July 1997. Archived from the original on 24 July 1997. Retrieved 8 January 2020.
  26. ^ «VSI C Run-Time Library Reference Manual for OpenVMS Systems» (PDF). VSI. November 2020. Retrieved 17 April 2021.
  27. ^ «OpenVMS and the year 2038». HP. Retrieved 17 April 2021.
  28. ^ «What Is New in MySQL 8.0». dev.mysql.com.
  29. ^ «MySQL Bugs: #12654: 64-bit unix timestamp is not supported in MySQL functions». bugs.mysql.com.

External links[edit]

  • Y2038 Proofness Design glibc Wiki
  • Entry in How Stuff Works
  • The Project 2038 Frequently Asked Questions
  • Critical and Significant Dates 2038
  • A 2038-safe replacement for time.h on 32 bit systems
  • Baraniuk, Chris (5 May 2015). «The number glitch that can lead to catastrophe». BBC Future.
  • Clewett, James. «2,147,483,647 – The End of Time [Unix]». Numberphile. Brady Haran. Archived from the original on 22 May 2017. Retrieved 7 April 2013.

19 января 2038 года в 03:14:07 по Всемирному времени, в приложениях, работающих под 32-битной версией PHP, может произойти сбой. В этот момент, стандартные функции работы с датой и временем перестанут корректно обрабатывать текущее время.

Все это связано с тем, что для представления даты и времени используется целое число. Данное число представляет собой количество секунд прошедших с начала эпохи UNIX, а именно с полночи 1 января 1970 года по Всемирному времени. В 32-битной версии PHP для хранения этого числа используется 32-битное целое со знаком. Максимально возможным значением для такого типа является 2 147 483 647, которое соответствует указанной критической дате.

Существует большая степень вероятности того, что к 2038 году все функционирующие системы и PHP-интерпретаторы будут 64-битные. Такое изменение, даст возможность беспрепятственно работать с датой примерно на 290 миллиардов лет вперед. Однако возникает сомнение, что это произойдет к 2038 году.

Еще одной проблемой 2038 года является невозможность работы с датами в прошлом и в будущем, уже сейчас. Под данное ограничение подпадают даты находящиеся до 1902 и после 2037 года.

Пути решения

Существует 2 способа решения данной проблемы:

  1. Не делать ничего, т.к. к 2038 году проблема будет решена естественным образом;
  2. Использовать встроенный класс «DateTime».

Первый способ полностью себя исчерпывает и, несмотря на свою простоту, является недальновидным.

Второй способ, напротив, имеет право на существование. О нем и пойдет речь далее.

Класс «DateTime»

Класс «DateTime», появившийся в PHP 5.2, призван полностью решить проблему 2038 года. Однако, программистам, привыкшим к стандартным функциям обработки даты и времени, работать с этим классом будет неудобно. Для ускорения процесса разработки приложений лучше всего использовать функции являющиеся интерфейсом к классу «DateTime».

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

Функция получения текущей метки времени Unix

<source lang="php">
//
// Улучшенная функция «time»
// (функция возвращает текущую метку времени)
//
function enhanced_time()
{
  $DateTime_obj = new DateTime();
  return $DateTime_obj->format("U");
}
</source>

Функции вывода даты и времени в определенном формате

<source lang="php">
//
// Улучшенная функция «date»
// (функция форматирует системную дату/время)
//
function enhanced_date($format_str, $timestamp = NULL, $timezone = NULL)
{
  //
  // Явно объявить переменные
  //
  settype($format_str, "string"); // Формат, в котором следует выводить дату и время



  //
  // Если не указана метка времени - использовать текущую метку времени
  //
  if (is_null($timestamp))
  {
    $timestamp = "now";
  }
  else // Иначе - использовать переданную метку времени
  {
    $timestamp = "@" . number_format($timestamp, 0, ".", "");
  }



  //
  // Если не указан часовой пояс - использовать часовой пояс по умолчанию
  //
  if (!is_string($timezone))
  {
    $timezone = date_default_timezone_get();
  }



  //
  // Создать экземпляр класса DateTime с необходимыми параметрами 
  //
  $DateTime_obj = new DateTime($timestamp);
  $DateTime_obj->setTimezone(new DateTimeZone($timezone));



  //
  // Вернуть дату и время в указанном формате
  //
  return $DateTime_obj->format($format_str);
}



//
// Улучшенная функция «gmdate»
// (функция форматирует системную дату/время по Гринвичу)
//
function enhanced_gmdate($format_str, $timestamp = NULL)
{
  return enhanced_date($format_str, $timestamp, "UTC");
}
</source>

Функция получения информации о метке времени Unix

<source lang="php">
//
// Улучшенная функция «getdate»
// (функция возвращает информацию о дате/времени)
//
function enhanced_getdate($timestamp = NULL, $timezone = NULL)
{
  //
  // Получить информации о дате/времени в виде неассоциативного массива
  //
  $arr = explode("=", enhanced_date("s=i=H=d=w=m=Y=z=l=F=U", $timestamp, $timezone));



  //
  // Вернуть информацию о дате/времени в виде ассоциативного массива
  //
  return array(
                "seconds" => (int) $arr[0], 
                "minutes" => (int) $arr[1], 
                "hours"   => (int) $arr[2], 
                "mday"    => (int) $arr[3], 
                "wday"    => (int) $arr[4], 
                "mon"     => (int) $arr[5], 
                "year"    => (int) $arr[6], 
                "yday"    => (int) $arr[7], 
                "weekday" =>       $arr[8], 
                "month"   =>       $arr[9], 
                0         =>       $arr[10]                
              );
}
</source>

Функции формирования метки времени Unix для заданной даты и времени

<source lang="php">
//
// Улучшенная функция «mktime»
// (функция возвращает метку времени для заданной даты)
//
function enhanced_mktime($timezone = NULL, $hour = NULL, $minute = NULL, $second = NULL, $month = NULL, $day = NULL, $year = NULL)
{
  //
  // Если не указан часовой пояс - использовать часовой пояс по умолчанию
  //
  if (!is_string($timezone))
  {
    $timezone = date_default_timezone_get();
  }



  //
  // Получить массив информации о времени по умолчанию
  //
  $default_datetime_arr = enhanced_getdate(NULL, $timezone);
  


  //
  // Заполнить значениями по умолчанию, параметры, которые не были переданы в функцию
  //
  if (is_null($hour))   { $hour   = $default_datetime_arr["hours"]; }
  if (is_null($minute)) { $minute = $default_datetime_arr["minutes"]; }
  if (is_null($second)) { $second = $default_datetime_arr["seconds"]; }
  if (is_null($month))  { $month  = $default_datetime_arr["mon"]; }
  if (is_null($day))    { $day    = $default_datetime_arr["mday"]; }
  if (is_null($year))   { $year   = $default_datetime_arr["year"]; }



  //
  // Изменить тип переменных при необходимости
  //
  settype($hour, "integer");
  settype($minute, "integer");
  settype($second, "integer");
  settype($month, "integer");
  settype($day, "integer");
  settype($year, "integer");



  //
  // Создать экземпляр класса DateTime с необходимыми параметрами
  //
  $DateTime_obj = new DateTime();
  $DateTime_obj->setTimezone(new DateTimeZone($timezone));
  $DateTime_obj->setDate($year, $month, $day);
  $DateTime_obj->setTime($hour, $minute, $second);



  //
  // Вернуть метку времени
  //
  return $DateTime_obj->format("U");
}



//
// Улучшенная функция «gmmktime»
// (возвращает метку времени Unix для времени по Гринвичу)
//
function enhanced_gmmktime($hour = NULL, $minute = NULL, $second = NULL, $month = NULL, $day = NULL, $year = NULL)
{
  return enhanced_mktime("UTC", $hour, $minute, $second, $month, $day, $year);
}
</source>

Заключение

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

<source lang="php">
//
// Установить часовой пояс по умолчанию
//
date_default_timezone_set("Asia/Bangkok");
</source>

Также приведу несколько вариантов применения указанных функций:

<source lang="php">
//
// Получить и вывести текущую метку времени Unix
//
$timestamp_now = time();
echo $timestamp_now . "<br>";

$timestamp_now_e = enhanced_time();
echo $timestamp_now_e . "<br><br>";



//
// Получить и вывести информацию о текущей метке времени Unix
//
echo "<pre>";
var_dump(getdate($timestamp_now));
var_dump(enhanced_getdate($timestamp_now_e));
echo "

«;

//
// Вывести текущую дату и время в указанном формате
//
echo date(«Y-m-d H:i:s», $timestamp_now). «
«;
echo enhanced_date(«Y-m-d H:i:s», $timestamp_now_e). «

«;

//
// Получить и вывести метку времени Unix для даты и времени в далеком будущем
//
$year = 2050;
$month = 3;
$day = 18;
$hour = 22;
$minute = 56;
$second = 53;

$timestamp_future = mktime($hour, $minute, $second, $month, $day, $year);
echo $timestamp_future. «
«;

$timestamp_future_e = enhanced_mktime(NULL, $hour, $minute, $second, $month, $day, $year);
echo $timestamp_future_e. «

«;

//
// Вывести дату и время в будущем в указанном формате
//
echo date(«Y-m-d H:i:s», «2531257013»). «
«;
echo enhanced_date(«Y-m-d H:i:s», «2531257013»). «

«;

Ссылки

Проблема 2038 года
UNIX-время
Date/Time Функции
Класс «DateTime»
Список поддерживаемых часовых поясов

Более 20 лет назад весь мир стоял на ушах в преддверии 2000 года. Наступали новый век и очередное тысячелетие — события из ряда вон выходящие сами по себе, символизирующие начало другой эпохи. Ощущения были необычные, хотя для истории и течения времени нет никакого значения, что там за цифры на выдуманных человеком календарях.

Millennium bug

В новостях тогда активно обсуждали новый феномен, не характерный для прошлого, — проблему 2000 года. В интернете, на телевидении и даже в газетах пугали грядущим цифровым апокалипсисом: все компьютеры после наступления нового года превратятся в тыкву. А заодно — и электроника, которая хоть как-то умеет считать время. Странно, но все было завязано на то, как компьютеры записывают дату — или, вернее, год. Для его обозначения использовалось всего две цифры: например, 97, 98, 99 и, наконец, 00. Это позволяло сократить объем хранимых данных, да и смысла в четырех символах не было.

Но для компьютера два нуля вовсе не означало 2000 год: он мог «подумать», что наступает 1900-й или просто 0-й. Так могли появиться очень «старые» дети, которым сразу после рождения стукнуло 100 лет, банки путались бы в платежах, а самолеты летели бы в непонятном направлении — опасались этого и всего чего угодно еще.

На решение проблемы, которую обрисовали задолго до ее наступления, якобы направили сотни миллиардов долларов (точной цифры никто не знает). Гипотетический (отчасти, потому что сбои все же наблюдались) баг смогли обойти, и никакого апокалипсиса не настало. Одни говорили, что все было потрачено не зря и что в противном случае мир перестал бы существовать. Другие указывали на то, что огромное количество электроники не было затронуто мероприятиями по обеспечению «поддержки 2000 года», но на ее работе это никак не сказалось.

С тех пор прошло более 20 лет, уже меньше отделяет нас от аналогичной напасти — проблемы 2038 года. Она отчасти походит на свою предшественницу тем, что вновь компьютерам может не хватить символов для записи дат и прошедшего времени, которое чаще считается машинами в секундах. Только говорят, что теперь все серьезнее. Так ли это на самом деле?

На заре современного компьютеростроения речь шла о 16-битных системах, способных хранить в своей памяти всего 65 536 значений. Это теперь компьютеры управляют практически всеми аспектами нашей жизни, а тогда они не были тесно интегрированы в нее. Позже распространение получили 32-битные системы, которые остались всерьез и надолго, однако не навсегда.

Время пойдет вспять после отметки 03:14:08.

Если говорить о подсчете времени, в распоряжении условного 32-битного «Скайнета» находится лишь 2 147 483 647 секунд, еще столько же — со знаком минус, но ими обычно нельзя воспользоваться. И вот эти секунды «закончатся» в 2038 году, так как отсчет ведется с 1970-го (со временем отсчета — «эпохами» — есть нюансы, так как «обычные» ПК, например, часто отсчитывают время с 1980 года; есть и другие исключения, продлевающие или укорачивающие время «жизни»). То есть 2 147 483 647 — максимальное число, которое умещается в 32-разрядной системе без «твиков».

Помните, в 2012 году отовсюду звучала песня Gangnam Style южнокорейского артиста PSY? Спустя пару лет композиция стала первой набравшей на YouTube более 2 млрд просмотров. И тогда проявился баг, напомнивший об ограниченных возможностях существующих систем (когда видеосервис только стартовал, казалось, что 32-битного поля более чем достаточно для счетчика просмотров).

В конце 2014 года оказалось, что счетчика не хватает. В начале декабря СМИ пестрели заголовками: «Хит Gangnam Style сломал YouTube». На самом деле все было не так, однако небольшой лаг в подсчетах все же случился — какие-то 5 млн просмотров. Само собой, в YouTube прогнозировали события, поэтому начали модернизировать систему заранее, переведя ее на платформу с поддержкой 64-битных типов данных. Над этим команда инженеров начала работать еще осенью 2014 года, увеличив максимально возможное количество просмотров до 9,22 квинтильона.

История с Gangnam Style — наглядный пример того, чем грозит 2038 год, если не предпринимать хотя бы минимальных усилий. 64-битные процессоры и соответствующее программное обеспечение для него стали мейнстримом давно: даже Windows XP успела перейти на 64 бита, а с 2011 года аналогичным путем двинулась Apple с ее настольной ОС. Однако в строю остается немало систем, не отвечающих новым требованиям, да и наверняка к тому времени останется кучка пользователей «древней» электроники.

Какие конкретно есть угрозы

GPS

Чаще всего вспоминают системы GPS, которые полностью завязаны на время и транслируют его. Существует миф, что спутники и управляющие системы в 2038 году могут выйти из строя, потянув за собой все остальное. Да, отсчет времени для GPS ведется как раз с 1980 года, однако он происходит по неделям и секундам в каждой из них. Более того, каждые 19,7 года (или 1024 недели) наступает событие GPS week number rollover, когда отсчет начинается заново: 10-битного значения достаточно для хранения информации только о 1023 неделях. Следующий сброс запланирован как раз на 2038 год (а прошлый состоялся в 2019-м).

Более того, современные устройства перешли на более совершенную систему, которая использует для хранения информации о неделях 13 бит, что позволяет считать недели без каких-либо проблем до 2137 года. Что касается конечного оборудования, здесь все кроется в своевременном обновлении ПО, а это зависит от его поставщиков и производителей. Ранее из-за запоздавшей реакции пострадали некоторые аэропорты, научное оборудование, системы слежения за погодой, бытовые GPS-навигаторы и даже старые iPhone и iPad. То есть основная проблема кроется в неправильной обработке данных о времени на конечном устройстве.

Для ГЛОНАСС эта проблема вовсе не характерна, а у других спутниковых систем «запас» времени иссякнет нескоро — лет через 50.

Компьютеры, смартфоны, базы данных и ПО

Сейчас сложнее найти новое устройство, которое работало бы на 32-битных платформах: все давно переходят на 64-битные, не остаются в стороне и мобильные девайсы.

Однако проблема не столько кроется в железе и операционных системах (отдельные 32-битные, которые могут использовать 64-битный тип данных для хранения времени, либо беззнаковые 32-битные, где это возможно), сколько касается прикладного ПО, встраиваемых систем, коммуникационных протоколов (NTP, например), баз данных, файловых систем, драйверов и остального. На условном 64-битном компьютере можно запускать 32-битное приложение, не совместимое с проблемой 2038 года, да и 64-битная программа может быть собрана «криво».

Теперь популярна и концепция интернета вещей, которая может стать одним из слабых звеньев цепи, если разработчики не предусмотрят все нюансы. Не исключено, что их пока будут частично игнорировать из-за желания сэкономить, снизив затраты на разработку и комплектующие. Так что в 2038-м «кое-какие» проблемы все же будут.

Для обхода может использоваться адаптация «несовместимого» кода. Это касается, например, баз данных, в которых возможно записывать даты в «правильном» формате — просто потребуется немного работы инженеров и больше дискового пространства (в четыре раза больше, если быть точнее). В прошлом это было серьезным ограничением, однако ныне это уже менее актуально.

ПО можно перекомпилировать (если, конечно, не утеряны исходники оригинального кода), остается и вопрос внутренней совместимости. Доступен переход на новые решения, но в некоторых случаях потребуется время. Представьте, как компания с 10 тыс. сотрудников запускает новый почтовый сервер с новым клиентом: надо все перенести, «отформатировать», как полагается, и объяснить, как с этим работать. Или системы видеонаблюдения с десятками тысяч камер и гигабайтами логов…

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

Часть профессионального сообщества считает Y2K bug более серьезным, нежели грядущий в 2038-м — потому что тогда решение не было столь очевидным. В то же время через 17 лет компьютеры будут распространены куда шире, чем 21 год назад, и их будет в разы больше. Поэтому другая часть ждет восстания машин.

Читайте также:

  • Кто кого? Ноутбук MagicBook View 14 против MacBook на M1
  • Омикрон создали биохакеры, «непонятные» лаборатории и мыши? Что сейчас известно о новом штамме коронавируса

Наш канал в Telegram. Присоединяйтесь!

Есть о чем рассказать? Пишите в наш телеграм-бот. Это анонимно и быстро

Перепечатка текста и фотографий Onlíner без разрешения редакции запрещена. ng@onliner.by

Цифровой конец света. Компьютерам по всему миру может не хватить чисел

Программисты опасаются сбоя в работе компьютеров в 2038 году из-за нехватки чисел

Специалисты предупреждают, что компьютеры по всему миру перестанут работать в 2038 году. Все из-за того, что на устройствах с 32-битной системой закончатся числа, и они больше не смогут измерять время. Впрочем, схожую проблему прогнозировали еще в 2000 году, но ничего не произошло.

По сообщениям RT, компьютерный мир может столкнуться с глобальной проблемой в 2038 году. Если быть точнее, то 19 января 2038 года в 03:14:07 по Гринвичу устройства, использующие 32-битную систему, перестанут верно отсчитывать время. Дело в том, что система перерабатывает каждую дату в двоичный код, но эту не сможет, потому что ей не хватит чисел.

Компьютеры и другие устройства, работающие на ОС Windows, Android, Macintosh, считают время с 1 января 1970 года в секундах внутри 32-битного значения. Данное значение вмещает в себя только определенное количество цифр и дальше расшириться не может. Соответственно 19 января 2038 года внутри системы просто не окажется необходимого числа, чтобы записать наступление 2 147 483 648-й секунды. Это вызовет сбой в устройствах и приведет к их обнулению, то есть они начнут отсчитывать время вновь с 1970 года.

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

Еще один яркий случай был на YouTube, когда клип Gangnam Style от Psy стал набирать рекордное число просмотров. Счетчик не был запрограммирован на такие цифры, поэтому перестал работать на отметке 2 147 483 647 просмотров. Google пришлось срочно переписывать систему, и теперь счетчик может доходить до цифры превышающую девять триллионов.

Масштаб проблем

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

Разумеется, к 2038 году многие компании и организации могут обновить системы, совершив переход из 32-битной системы в 64-битную, что отложит «проблему 2038 года» еще на 290 миллиардов лет. Проблема заключается в том, что чем больше лет проходит, тем больше появляется программ, сайтов и пользователей. Невозможно покрыть все сферы. Нельзя забывать о том, что это коснется не только компьютеров, но и в целом оборудования на заводах, энергетических станциях и других местах. Все придется модернизировать.

«Это непростая проблема, потому что сложность этой среды за последние двадцать лет резко возросла. Программ стало больше. Пользователей тоже», — заметил в разговоре с «360» российский предприниматель в сфере информационных технологий, искусственного интеллекта, разработки программного обеспечения, управления проектами, генеральный директор компании «Ашманов и партнеры» Игорь Ашманов.

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

Как решить проблему

Решение проблемы лежит на поверхности. Как уже было сказано ранее, большинство компаний просто переходят на 64-битную систему отсчета времени. К тому же за 20 лет многие устройства, работающие на 32-битной системе, попросту устареют и будут заменены.

По словам Вакулина, в Windows с этой проблемой уже разобрались.

«Разработчики разных компаний прибегнут к обновлениям. Возможно появится некий пак обновлений, который автоматически будет установлен на устройство при наличии доступа в интернет. Другие просто перейдут на новую систему исчислений», — заключил собеседник «360».

Интернет

Спустя 17 лет после проблем, возникших в связи с ошибкой 2000 года по всему миру; мир сейчас обеспокоен новой проблемой. Это называется проблемой 2038 года , и вокруг этой проблемы много путаницы. Люди задаются вопросом, является ли проблема Y2K38 такой же или хуже, чем проблема Y2K. Что будет в 2038 году? Некоторые предположения говорят, что это может нанести больше ущерба, чем Y2K. Но все ли это правда? Давайте разберемся.

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

Мир приближался к оцепенению, когда приближался 2000 год. Это было не только изменение всех четырех цифр, но также помешало возникновение серьезных проблем для программного обеспечения и программ, разработанных в эпоху с 1960-х по 1980-е годы.

Те, кто забыл о Y2K, или все еще не знают об этом; Y2K была компьютерная ошибка. Ошибка могла бы вызвать проблемы для программного обеспечения и компьютерных программ после даты 31 декабря 1999 года. Y2K также называется « ошибка тысячелетия », так как буква k обозначает килограмм (используется для обозначения номер 1000); таким образом, «2k» представляет 2000 год.

Ошибка 2000 года была проблемой с датами, так как компьютерные программы, разработанные в 20-м веке, использовали двузначный код для года. Например, за 1978 год 19 не было учтено в дате. Только последние две цифры; то есть, 78 представляли год. Причиной короткой формы дат было дорогостоящее хранение данных того времени. Однако эта система дат не будет работать с 1 января 2000 года. Инженеры поняли, что программы и программное обеспечение могут интерпретировать не 00 как 2000, а как 1900. Таким образом, дата 1 января 2000 года будет интерпретироваться как 1 января 1900, по компьютерным программам. Предполагалось, что системы, которые полагаются на точный расчет данных, определенно потерпят неудачу из-за этой неверной интерпретации.

Однако когда приближался 2000 год, компьютерных программ и областей, которые зависели от них, было очень мало и ничтожно мало проблем. Главного беспорядка можно было избежать, просто изменив поле года на 4 цифры вместо 2 цифр. Таким образом, в итоге вся проблема 2000 года оказалась менее катастрофической, чем предполагалось.

В чем проблема 2038 года

Чтобы понять серьезность проблемы Y2K38 или проблемы 2038 года, важно знать, что именно.

Это так называется, потому что проблема 2038 года возникнет 19 января 2038 года. Предполагается, что проблема Y2038 возникнет из-за ограничений 32-разрядных процессоров и систем, которые на них работают.

Исследователи говорят, что в 03:14:07 UTC 19 января 2038 года системы, работающие на 32-разрядных процессорах, не смогут справиться с изменением даты и времени. Компьютеры начали отсчитывать время в секундах с 1 января 1970 года. Но 32-разрядные системы способны рассчитывать только до числа 2 147 483 647 ; таким образом, за время он может рассчитать только эти много секунд. А в 03:14:07 UTC 19 января 2038 года счет достигнет 2 147 483 647 секунд.

Таким образом, вопрос в том, что произойдет, когда тактовая частота 32-разрядных систем превысит порог в 2 147 483 647 секунд? Некоторые предполагают, что эти компьютеры просто сломаются и вообще перестанут работать. В самом деле!?

Конечно, нет! В течение следующих 20 лет (т. Е. До 2038 года) в индустрии компьютеров и программного обеспечения произойдет много изменений. Говорят, что профессионалы в области безопасности данных должны будут изменить методы работы в таких областях, как национальная безопасность, шифрование SSL, устройства Интернета вещей и криптовалюта.

Самое простое решение, предложенное исследователями данных для проблемы 2038 года, – обновить системы до 64-разрядных процессоров . Проще говоря, 64-разрядные машины будут иметь огромную емкость для подсчета до 9 223 372 036 854 775 808; счет, который, конечно, не закончится в ближайшем будущем.

На самом деле, многие новейшие ПК и системы работают на 64-битной платформе. Windows-машины Microsoft работают на 64-битной версии с тех пор, как в 2005 году была выпущена 64-битная версия Windows XP Professional. Даже настольное программное обеспечение Apple OS X работает исключительно на 64-битной версии после того, как Apple выпустила Mac OS X 10.7 Lion в 2011 году. Unix-системы, которые питают веб-серверы и другое серверное оборудование, все еще используют 32-битные системы; большинство из них могут быть обновлены до 64-битных систем с течением времени.

Любопытный случай с видео Gangnam Style

Обновление систем до 64-битных процессоров является доказанным фактом; потому что та же техника была использована YouTube в декабре 2014 года. 3 декабря 2014 года видео южнокорейской поп-звезды Psy «Gangnam Style» побило все рекорды просмотров.Настолько, что количество просмотров превысило 2 147 483 647. Но YouTube, работающий на 32-битных процессорах, не смог рассчитать дальше этого числа, и сайт потерпел крах. Инженеры YouTube смогли быстро решить проблему, обновив систему до 64-битной.

Заключение

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

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

Так что, в конечном итоге, нет необходимости паниковать из-за проблемы 2038 года!

Понравилась статья? Поделить с друзьями:
  • Ошибка 206 при обновлении sml 482
  • Ошибка 20360 шкода
  • Ошибка 2066 haas
  • Ошибка 2054 порше кайен
  • Ошибка 206 амд радеон