Проблема 2YK Жива. Взгляд изнутри » Статьи Добавить в Избранное Написать админу
Программы: SoftForFree.com - бесплатные программы: Virtual Dub, WinRAR, eMule, FlashGet, WinDVD, Doom 3 и многое другое.
 Программы  |  Игровые новости  |  Новости авторов ПО  |  Статьи  |  Новости по RSS
Стиль:
Подробнее о EgoSteam 2016.11.01EgoSteam 2016.11.01

EgoSteam - программа для поиска Steam-игр в десятках интернет-магазинов. Поможет сэкономить время и деньги и купить игру дешевле, чем в Steam.

Скачать Сайт автора
Подробнее о Memo Fora 4x4 «Свой бизнес» от 02.12.2016 г.Memo Fora 4x4 «Свой бизнес» от 02.12.2016 г. Новейшая версия

Учет в торговой фирме / Сервисном Центре. Конструктор ценников, отчеты по шаблонам, затраты, CRM, печать чеков на POS принтер и SMS информирование.

Скачать Сайт автора

Программы


Рейтинги программ


Лучшие из лучших


Проблема 2YK Жива. Взгляд изнутри

Проблема 2YK Жива. Взгляд изнутри

12 Сентября, 2012
Проблема 2YK Жива. Взгляд изнутри
Итак, решена ли проблема 2000? Сейчас можно лишь сказать, что решена она лишь частично и проблема 2000 или как ее еще называют Y2K только начало всех проблем связанных с датами в ПК.
В чем же проблема на сей раз? Опять же в датах и особенностях языка С. Вы можете спросить причем здесь язык С? А все дело в том, что на этом языке написана операционная система UNIX, да и Linux тоже, а также очень много программ под Windows.

Язык С немного по другому обрабатывает время и даты - с помощью так называемого GMT, где время считается в кол-вах секунд начиная с 1970 года. Проблема еще и в том, что временные "заплатки" на ОС, связанные с корректировкой дат, также себя не оправдывают в случае когда используются архивы и программы, написанные ранее 1970 или даже 1980 (на моем компьютере) года. Давайте для начала рассмотрим как же программисты решили проблему Y2K.

Было очень много различных предложений, затрачено очень много денег (300 миллиардов долларов) на решение этой проблемы - в итоге был найден выход - называемый метод окон. Суть его в следующем: считаем, что если год больше чем 80, стало быть век XX, если меньше чем 80 - то XXI. Выглядеть это будет примерно так:

If year<80 then writeln('19',year) else writeln('20',year);

Таким образом дается отсрочка на 80 лет, но не учитывается то обстоятельство, что у программ написанных ранее 1980 года дата и время сохранились и при поиске они будут считаться программами написанными в 2080 году. Вряд ли это отразится на домашних компьютерах, а в больших базах данных - это может дать серьезный сбой. Тем не менее такой паники, какая было накануне 2000 года уже быть не должно. И хотя особо ничего не случилось, не надо считать что проблема прошла не оставив следа.
Предлагаю вашему вниманию статью, пришедшую мне на e-mail:

Y2K жив. Дмитрий Беспалов

Y2K оказался не таким уж и безобидным, как его уже успели представить. Кое-где ошибка все-таки проявилась. В прошлую пятницу Visa и Mastercard сообщили о недавно обнаруженном баге в программном обеспечении компании CyberCash Inc., из-за которого со счетов владельцев кредитных карточек могут многократно списываться суммы за одну и ту же покупку. Представители обеих компаний заявили, что пытаются отследить такие случаи, но все же больше полагаются на бдительность самих пользователей, которым рекомендуется тщательно изучить свои финансовые отчеты. Проблема вызвана работой продукта ICVERIFY для которого CyberCash еще в прошлом году выпустила Y2K fix. ICVERIFY используют около 100000 компаний и большинство из них сообщили, то провели апгрейд программного обеспечения до Нового года, но нашлись и такие, кто либо игнорировал предупреждения, либо просто не знал о потенциальной опасности до тех пор, пока не столкнулся с последствиями своей беспечности. Впервые проблема была обнаружена несколькими компаниями, обрабатывающими транзакции, которые заметили, что у некоторых владельцев кредиток со счетов ежедневно списывается одна и та же сумма. В ходе расследования выяснилось, что причина ошибки формат именования файлов, применяемый в ICVERIFY. Программа записывала затраты, используя только одну цифру для указания года, в данном случае 0 , за которой шел номер месяца 01 . Таким образом, январские транзакции 2000 года записывались как 001 , что соответствует другому файлу программы, который содержит неоплаченные счета. В результате, ежедневно подсчитывая затраты, ICVERIFY интерпретировала январские счета как неоплаченные. Представители CyberCash сообщают, что большинство пострадавших компаний малые предприятия, которые уделили проблеме Y2K слишком мало внимания. Ну а владельцам кредиток, обнаруживших фальшивые затраты, рекомендовано обращаться в свои банки. Какую ответственность понесет CyberCash за столь дорогостоящую; ошибку, пока не ясно;

****

Кстати говоря, можно провести небольшой эксперимент - посмотрите на дату создания файлов на вашем компьютере. Особо не удивляйтесь если у некоторых из них в графе год стоит число "00". Вообще проблема времени очень даже интересна, например Windows поддерживает даты вплоть до 2099 года, а если вы попытаетесь поставить 2100 год, то вместо ожидаемого получите 1980 год. Это как раз и есть метод "окон". Но 2099 год еще очень далеко и за это время 10 раз сменится и сама Windows и компьютеры. С этим же расчетом сделан и BIOS. Например, у меня в ПК максимально возможный год 2079, потом год сбрасывается на 1994 (год изготовления компьютера). Но и 2079 год тоже еще далеко, и опять же можно сменить компьютер 10 раз. Гораздо хуже дело обстоит с ОС UNIX - там предел для года наступает в 2038 году - в этот год все даты сбрасываются в 1901 год.(в BIOS поставьте дату 2038, затем в командной строке UNIXа введите data).

К сожалению пока нет возможности проверить даты на системе linux, но наверняка (раз использовался язык С) там картина такая же. А сбой в системах на основе юникса - дело очень серьезное.
Для лучшего понятия этой проблемы нам необходимо рассмотреть язык С и его процедуры.
Для начала можно попробовать следующую программу, конечно предварительно поставив в BIOS 2038 год.

#include
#include

void main(void)
{
time_t t;
time(&t);
printf("Дата и время: %sn", ctime(&t));
}

На что вам будет выдан ответ:

Дата и время: Thu Jan 01 00:00:00 1970

Время полночь и год 1970 - и причем время больше меняться не будет - оно как бы остановится. Сколько бы вы не меняли дату на часах всегда будет полночь.

Для того, чтобы понять почему получается сбой, по всей видимости, необходимо рассмотреть как работают функции time и ctime.

Собственно функция ctime не представляет для нас ничего особо интересного - она просто преобразовывает в строку числовое представление времени и даты. Вот как выглядит эта функция:

_TCHAR * _RTLENTRY _EXPFUNC _tctime(const time_t *clock)
{
struct tm *p = NULL;
if (clock)
p = localtime(clock);
return p ? _tasctime(p) : NULL;
}
А вернее будет сказать, что функция принимает ссылку на структуру данных, далее преобразовывает все в строку и если преобразование прошло успешно возвращает адрес символьной переменой содержащей дату и время, а иначе возвращается NULL.Стало быть самими преобразованиями занимается функции time.

time_t _RTLENTRY _EXPFUNC time(time_t *tloc)
{
time_t x;
SYSTEMTIME st;

GetLocalTime(&st);
x = _totalsec(st.wYear-1900, st.wMonth-1, st.wDay-1,
st.wHour, st.wMinute, st.wSecond, -1);
if (tloc)
*tloc = x;
return (x);
}

Не рассматривая внимательно функцию и совершенно не углубляясь в то, что она делает сразу бросается в глаза строка "st.wYear-1900" -
Уж не в ней ли дело? Теперь посмотрим что вызывается, а именно, что такое _totalsec?

Это функция возвращающая кол-во секунд прошедших с 1 января 1970 года - GMT.

unsigned long _totalsec
(int year, int month, int day, int hour, int min, int sec, int dst_flag)
{
int leaps;
time_t days, secs;

if (year < 70 || year >138) return ((time_t) -1);

min += sec / 60;
sec %= 60; /* Seconds are normalized */
hour += min / 60;
min %= 60; /* Minutes are normalized */
day += hour / 24;
hour %= 24; /* Hours are normalized */

year += month / 12; /* Normalize month (not necessarily final) */
month %= 12;

while (day >= _Days[month])
{
if (!(year & 3) && (month ==1))
{
if (day > 28)
{
day -= 29;
month++;
}
else
break;
}
else
{
day -= _Days[month];
month++;
}

if (month >= 12) /* Normalize month */
{
month -= 12;
year++;
}
}
year -= 70;
leaps = (year + 2) / 4;

if (!((year+70) & 3) && (month < 2))
--leaps;

days = year*365L + leaps + _YDays[month] + day;
secs = days*86400L + hour*3600L + min*60L + sec + _timezone;
if (dst_flag == -1)
{
if (_daylight && _isDST(hour, day, month+1, year))
secs -= 3600;
}
else
secs -= (dst_flag ? 3600 : 0);

return(secs > 0 ? secs : (time_t) -1);
}

Наверное не имеет смысла полностью рассматривать данную функцию, если хотите вы можете сделать это сами. А в данный момент достаточно будет одной строки (она находится в самом начале)

if (year < 70 || year > 138) return ((time_t) -1);

Эта строка означает примерно следующие:
Если год меньше 1970 или год больше 2038 то…..
Вот где скрывается, то что мы искали, но возникает вопрос почему написаны числа 70 и 138?Теперь давайте вспомним как при вызове функции вычитается 1900, т.к. функция может работать только с маленькими числами. Проверка года лишь является проверкой на корректность программы и убрать ее нельзя, иначе вместо того, чтобы показывать 1970 год, программа будет выдавать "run-time" ошибку. Ошибка происходит от переполнения значения функции, иначе говоря в результате вычислений в 2038 году кол-во секунд будет настолько большим, что не вместится в тип переменной unsigned long. Очень хорошо, что создатели языка С предусмотрели это и поставили проверку, иначе вместо простого сбоя дат будет настоящий крах всех UNIX-систем.

Почему же тогда создатели С, если они все это знали, не поставили 64-битный тип double, тогда даты можно было бы спокойно менять еще 584 миллиарда лет? А ответ прост, в то время, когда создавался язык С, не было поддержки 64-разрядных переменных, т.к. не было настолько мощных машин, поэтому и появилась эта проблема .

По расчетам переменная хранящая кол-во секунд достигнет верхнего предела 19 января 2038 года и обнулится. А далее см. проблема 2000 года. Но одно утешает, что до 2038 года еще далеко, а над проблемой работают уже сейчас и через пару лет она будет полностью исправлена. Интересно сколько будет стоить исправить все UNIX-сервера? Это лишь еще раз иллюстрирует русскую- народную пословицу "жадный платит дважды!"
Раздел: Компьютер
Автор статьи: Nimnul
Сайт автора
Просмотров: 1524
Комментарии



Ваш комментарий к статье:

Комментарии публикуются после проверки администратором.
При добавлении отрицательного комментария читайте соглашение об использовании.
Мы не публикуем: сообщения, не относящиеся к статье: "Проблема 2YK Жива. Взгляд изнутри".

Ваше имя: E-mail:
Оценка: нет 1 2 3 4 5
 *Cообщение
(30-1000 зн.):

 
          
          
  

* * *

Другие статьи

VBA: показ нескольких листов в Excel VBA: показ нескольких листов в Excel
Автоиатизация приложений MS Excel становится ежедневной задачей всех обладателей Майкрософт Оффиса.Можно найти много задач выполнение которых можно ускориить или упростить с помощью простого и доступного языка программирования VBA
Раздел: Компьютер
Файловая система ReFS изнутри Файловая система ReFS изнутри
В статье изложено общее описание структуры файловой системы ReFS, ее преимуществ и недостатков.
Раздел: Компьютер
Как защитить свой компьютер? Как защитить свой компьютер? Оценка: 5. Голосов: 2Оценка: 5. Голосов: 2Оценка: 5. Голосов: 2Оценка: 5. Голосов: 2Оценка: 5. Голосов: 2
В этой статье я хочу дать вам несколько простых, но крайне важных рекомендаций в области компьютерной безопасности.
Раздел: Компьютер
5 рабочих примеров использования dos команд 5 рабочих примеров использования dos команд
Командная строка является неотъемлемым элементом при оптимизации (автоматизации) работы за компьютером. В статье дается 5 примеров использования командной строки, собранных из разных источников и регулярно используемых мной как на работе так и дома.
Раздел: Компьютер
Это обычное скроллесико… Это обычное скроллесико…
Небольшая заметка о неочевидных аспектах использования колеса прокрутки мыши.
Раздел: Компьютер


[Все разделы]  [Добавить статью]


Рекомендуем

ПиМаркет 2016 - учёт товара 7.65

Удобная программа для магазина: печать ценников и чеков, данные о наличии товара, продажах, недостачах и многое другое. Любые товары.

Скачать Скриншоты

• • •

Exiland Assistant Free (portable органайзер) 4.4

Бесплатный органайзер для учета контактов, клиентов, организаций, заметок, паролей, событий. Удобный планировщик, напоминания, быстрый поиск по базе.

Скачать Скриншоты

• • •

ПиМаркет Фитнес Клуб 7.77

Учет клиентов и выручки фитнес-клуба, спортзала, центра.
Продажа абонементов и клубных карт. Вы получаете полный учет выручки и Ваших клиентов.

Скачать Скриншоты

• • •

Exiland Backup Professional 4.3

Одна из лучших программ автоматического резервного копирования файлов по сети, FTP, на флешку, HDD. Для дома и офиса. Есть демо и бесплатная версии.

Скачать Скриншоты

• • •

Doom 3

Очередное продолжение невероятной научно-фантастической игры в жанре Survival-Horror, давно ставшей эталоном жанра.

Скачать Скриншоты

Наша кнопка


Программы: SoftForFree.com - тысячи бесплатных программ, 100 лучших программ рунета, статьи, новости софта и многое другое.

Код нашей кнопки:

Новости Hitech



Полезные программы

Подробнее о Logitech QuickCam Driver 11.5Logitech QuickCam Driver 11.5

Драйвера для веб-камер Logitech версии 11.5. Драйвером поддерживаются операционные системы: 64-х битные Microsoft Windows 2000 / XP / Vista.

Скачать Скриншоты

Подробнее о Microsoft Word Viewer 2007Microsoft Word Viewer 2007

Microsoft Word Viewer позволит просматривать, копировать и печатать документы MS Word, даже если на Вашем устройстве нет Word.

Скачать Скриншоты

Подробнее о Русификатор GTA: San Andreas Русификатор GTA: San Andreas

Лучший русификатор в сети для игры GTA: San Andreas от компании Фаргус. Оригинальный готический шрифт, улучшенный перевод.

Скачать Скриншоты



Софт-монитор - новейшие версии программ!

Новый проект, аналогов которому нет в Интернете.
Мониторинг версий популярных программ в реальном времени, мониторинг программ для Windows, Mac OS, Unix, а также приложений на IPAD и Андроид.

[Скачай новейшие версии бесплатно!]



Вверх страницы

 Программы • Статьи • Реклама на сайте •  RSS 2.0 RSS • Контакты • Соглашение об использовании • Политика конфидециальности

© 2003-2016, SoftForFree.com. Использование материалов сайта разрешается только по договоренности с автором.
Автор проекта не несет ответственности за содержание рекламных материалов и качество программного обеспечения.

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