Unix исполнилось 50 лет. Что это значит?

2020 год знаменателен для Unix: в самом начале года оригинальной операционной системе исполнилось 50 лет. Время Unix, известное также как «даты эпохи», — это количество секунд, прошедших с 1 января 1970 года. Но что же беспокоит разработчиков ядра в связи с полувековым юбилеем Unix?

Хотя некоторые из ранних разработок Unix предшествуют официальному началу его «эпохи», 1 января 1970 года остаётся нулевой точкой во времени POSIX. Поэтому с началом 1 января 2020 года официально платформе исполнилось ровно 50 лет.

Время Unix против времени человека

С точки зрения человеческого времени, 50 лет — это большой период. С точки зрения времени Unix, нет ничего особенного в 50 лет, а 43 года были бы не менее значительными. Системы Unix (включая Linux) хранят значения даты и времени как количество секунд, прошедших с 1970-01-01 00:00:00 UTC, с записью в 32 битах. Чтобы определить, сколько секунд прошло с того времени и, следовательно, текущее значение времени Unix, можно выполнить команду:

$ date +%s

1576883876

Аргумент %s после команды date задаёт отображение текущей даты и времени в виде количества секунд с начала 1970-01-01.

Родословное дерево Unix-базированных систем

Какую максимальную дату могут хранить системы Unix?

Чтобы понять, сколько времени может вместить Unix-система, нужно оценить ёмкость 32-битного поля. Это можно рассчитать так:

$ echo ‘2^32’ | bc

4294967296

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

$ echo ‘2^31’ | bc

2147483648

И так как нумерация Unix начинается с 0, это означает, что у нас есть 2 147 483 648 значений, но самое большое составляет 2 147 483 647 — значение даты и времени Unix не могут превышать это число. Так же, как одометр на автомобиле не может показывать больше 999 999 километров — добавьте 1, и значение обнулится.

Сколько длится год в секундах?

Количество секунд в году можно рассчитываются следующим образом:

$ expr 24 * 60 * 60 * 365

31536000

В високосном году добавляется ещё один день:

$ expr 24 * 60 * 60 * 366

31622400

Низкоуровневый графический интерфейс

Как Unix отображает свой 50-й день рождения?

1 января 2020 года в 12:00 утра будет время 1577836800. Расчет несколько усложняется, потому что следует учитывать високосные годы. С начала эпохи Unix было 12 таких лет, начиная с 1972 года и заканчивая в 2016 году. То есть обычных лет прошло 38.

Вот так выглядит команда expr для подсчета секунд за прошедшие 50 лет:

$ expr 24 * 60 * 60 * 365 * 38 + 24 * 60 * 60 * 366 * 12

1577836800

Или так, с учётом ранее проведённых подсчётов:

$ expr 31536000 * 38 + 31622400 * 12

1577836800

Этот способ записи времени сделал системы Unix невосприимчивым к проблеме Y2K года, из-за которой люди в конце 1999 года беспокоились, что переход на 2000 год может нанести ущерб компьютерным системам. Трудностей оказалось гораздо меньше, чем ожидалось. Фактически, только приложения, записывающие годы в двузначном формате, столкнулись с обнулением дат. Многие разработчики провели дополнительную работу, чтобы гарантировать, что их приложения не будут затронуты проблемой Y2K.

Когда время Unix столкнется с проблемами?

Аналогичные трудности ожидают Unix-системы не ранее 2038 года, когда даты, сохраненные в описанном выше формате, превысят 32-битное пространство. Остаётся ещё 18 лет, но разработчики ядра уже работают над тем, чтобы избежать грядущих сбоев.

Проблема 2038 года иногда упоминается как проблема Y2K38. Если она не будет решена до вторника 19 января 2038 года, после этой даты системы могут подумать, что наступил 1901 год. Один из способов решения этой проблемы — перейти на 64-битное представление информации о дате и времени. Некоторые считают, что и это будет гораздо сложнее, чем может показаться.

В любом случае, паниковать ещё рано. А действительно важным сегодня является 50-летний юбилей систем Unix, которые признаны одними из наиболее важных ОС в истории.

Источник:

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *