Подробнее о Ломалка паролей 2.1Ломалка паролей 2.1

Никаких звездочек - только пароли!

Скачать Подробнее
Подробнее о Русификатор Photoshop CS2 9.0Русификатор Photoshop CS2 9.0

Русификатор программы Adobe Photoshop CS2 9.0.
Размер файла: 519.74 кБ.

Скачать Подробнее

Программы


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


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


Проблема 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
Сайт автора
Просмотров: 2786
Комментарии



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

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

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

 
          
          
  

* * *

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

Типы принтеров: Плюсы и минусы Типы принтеров: Плюсы и минусы
Принтеры являются важным компонентом офисной и домашней техн
Раздел: Компьютер
Как выбрать USB-мышь: гайд для «чайников» Как выбрать USB-мышь: гайд для «чайников»
От характеристик и особенностей USB-мыши во многом зависит комфорт пользователя....
Раздел: Компьютер
Ноутбуки, нетбуки, планшеты что выбрать Ноутбуки, нетбуки, планшеты что выбрать
Оглянитесь в прошлое, лет так 10-15 назад....
Раздел: Компьютер
VBA: показ нескольких листов в Excel VBA: показ нескольких листов в Excel
Автоиатизация приложений MS Excel становится ежедневной задачей всех обладателей Майкрософт Оффиса.Можно найти много задач выполнение которых можно ускориить или упростить с помощью простого и доступного языка программирования VBA
Раздел: Компьютер
Файловая система ReFS изнутри Файловая система ReFS изнутри
В статье изложено общее описание структуры файловой системы ReFS, ее преимуществ и недостатков.
Раздел: Компьютер

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


Рекомендуем

OpenVPN 2.4.0

Полнофункциональное SSL VPN решение, получившее название OpenVPN, может использоваться для решения большого спектра проблем, в том числе и в сети VPN,

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

• • •

Adobe Illustrator 2017

Довольно мощный и одновременно простой редактор векторной графики для дизайнеров, разработанный компанией Adobe Systems.

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

• • •

FlashGet 3.7.0.1218

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

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

• • •

MSN Messenger 8.5

MSN Messenger - это клиент обмена мгновенными текстовыми, звуковыми и видеосообщениями посредством сети интернет.

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

• • •

Adobe Audition CC

Известная программа Audition будет вашим лучшим помощником в обработке звука на профессиональном уровне.

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



Наша кнопка


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

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

Новости Hitech



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

Подробнее о Norton AntiVirus 2015 22.0.0Norton AntiVirus 2015 22.0.0

Разработанный компанией Symantec пакет антивирусных программ Norton AntiVirus в данный момент является одним из популярнейших антивирусных средством в

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

Подробнее о Canon Laser Shot LBP-1120 Printer Drivers 1.00.0.007Canon Laser Shot LBP-1120 Printer Drivers 1.00.0.007

Самая последняя официальная версия драйверов для лазерного монохромного принтера Laser Shot LBP-1120 фирмы Canon.

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

Подробнее о WinZip 21WinZip 21

Одна из наиболее популярных и самых первых служебных программ для сжатия файлов в Windows.

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




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

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

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

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