music ringtones
cheap valium
cialis online
phentermine online
mtv ringtones
levitra online
free free ringtones
buy clonazepam
verizon ringtones
generic viagra
buy ambien
nextel ringtones
lexapro and valium
ambien online
buy wellbutrin
wellbutrin online
free tracfone ringtones
free mp3 ringtones
free real ringtones
phentermine
cheap soma
cheap diazepam
cheap norco
fioricet online
cingular ringtones
real ringtones
cheap albuterol
polyphonic ringtones
prozac online
cheap cialis
ambien
buy celexa
propecia online
samsung ringtones
motorola ringtones
free funny ringtones
free sprint ringtones
sprint ringtones
cheap phentermine
free ringtones
free kyocera ringtones
buy zyban
free mono ringtones
ultram online
xenical online
free real ringtones
xenical online
free cingular ringtones
kyocera ringtones
free sonyericsson ringtones
valium overdose
free ericsson ringtones
cheap fioricet
but soma
wellbutrin online
cheap fioricet
cheap wellbutrin
free sharp ringtones
what does valium do
nexium online
midi ringtones
sonyericsson ringtones
paxil online
free midi ringtones
valium sale
cheap ambien
sprint ringtones
cheap adipex
cheap ativan
buy nexium
free sagem ringtone
ativan online
mono ringtones
cheap lorazepam
free ringtones
mono ringtones
real ringtones
generic ativan
buy phentermine
cheap norco
free ericsson ringtones
buy cialis
cheap ultram
free nokia ringtones
levitra online
real ringtones
free ericsson ringtones
ortho online
free free ringtones
free samsung ringtones
cyclobenzaprine online
cheap wellbutrin
free punk ringtones
cool ringtones
buy clomid
free alltel ringtones
cheap lortab
diazepam
free sagem ringtones
cheap ativan
free motorola ringtones
nextel ringtones
meridia online
nokia ringtones
cheap paxil
free sony ericsson ringtones
best bonus casino online
sprint ringtones
free alltel ringtones
buy xenical
tramadol
fioricet online
polyphonic ringtones
buy carisoprodol
buy ativan
cheap ambien
free alltel ringtones
buy clomid
cheap alprazolam
free samsung ringtones
free nokia ringtones
adipex online
verizon ringtones
free kyocera ringtones
tracfone ringtones
free qwest ringtone
xanax online
generic clonazepam
xenical online
free cingular ringtones
cialis online
generic alprazolam
nexium online
fioricet online
free funny ringtones
mp3 ringtones
cheap ultracet
cheap ativan
free verizon ringtones
generic diazepam
ericsson ringtones
rivotril online
free ringtones
cheap carisoprodol
cheap xanax
free free ringtones
tracfone ringtones
vicodin online
wwe ringtones
buy phentermine
cyclobenzaprine online
verizon ringtones
hydrocodone online
buy xenical
levitra online
order hydrocodone
cheap meridia
nokia ringtones
ultram online
cheap soma
propecia online
buy ativan
cheap adipex
cheap lorazepam
free samsung ringtones
free mono ringtones
sprint ringtones
cheap soma
cheap celexa
buy vicodin
buy cialis
sonyericsson ringtones
canadian casino online
cyclobenzaprine online
free qwest ringtones
polyphonic ringtones
ultram online
order xanax
free tracfone ringtones
qwest ringtones
cheap lipitor
ultram online
buy nexium
free sony ericsson ringtones
ativan online
xenical online
cialis online
carisoprodol online
free sagem ringtones
generic meridia
free nextel ringtones
but tramadol
carisoprodol online
mixing valium and xanax
norco online
cheap valium
buy cyclobenzaprine
clonazepam online
kyocera ringtones
adipex online ===Список замеченных содержательных ошибок в первом издании книги «Введение в операционные системы»===
Раздел 4.4.1 Управление памятью в Mac OS? и Win 16?
Все инвективы в адрес «ручечного» управления памятью относятся к программированию на plain C и Pascal, т.е. на языках, в которых есть понятие указателя, но при этом указатель нельзя ни во что «завернуть» (как это можно сделать в C~ ). Действительно, в C~ можно спрятать «ручку» внутри класса smart pointer, который выглядит как указатель, поддерживает все те же самые операции, но делает GlobalUnlock в подходящий момент. Поэтому уже при программировании на C~ проблема далеко не так остра, как при программировании на C.
В языках более высокого уровня – Smalltalk, Java, даже в Basic – понятия указателя вообще нет, и разработчик среды исполнения языка волен реализовать объектные ссылки так, как сочтет нужным. В том числе путем инкапсуляции «ручки» внутри этой ссылки.
Реальные интерпретаторы Smalltalk и современные виртуальные машины Java/C# реализованы именно таким образом: каждая объектная ссылка представляет собой «ручку» – индекс в глобальном массиве указателей на объекты. Это позволяет перемещать объекты по памяти, не теряя ссылок на них, и реализовать такие стратегии сборки мусора, как копирующие и генерационные. В этом смысле, слова, что от «ручечного» управления памятью все отказались, просто не соответствуют действительности.
Тем не менее, критика эксплуатационных характеристик Win16 в этом разделе полностью соответствует действительности. Во второй половине 80х, когда начинась разработка приложений для MacOS, язык C~ был вообще только что придуман, и до середины 90х нормальных компиляторов этого языка вообще не было. Поэтому старые приложения для MacOS и большинство коммерческих приложений для Win16 разрабатывались на plain C и очень сильно страдали от ошибок работы с «ручками».
Исправлено во втором издании книги
Раздел 5.4 Разделяемые библиотеки
В книге утверждается, что в OS/2 и Win32 разделяемые библиотеки загружаются в определенный глобальный диапазон адресов и при загрузке перемещаются для настройки на свободные адреса. Это не совсем верно.
Точнее, это безусловно верно для OS/2: в этой системе приватные сегменты EXE и DLL формата LE/LX загружаются с начала 512-мегабайтного адресного пространства, а разделяемые – с конца. При этом все DLL перемещаются. При этом перемещенный код, разумеется, считается модифицированным и при подкачке сбрасывается в swap-файл. В Win32, DLL формата PE имеют таблицу перемещений (т.наз. fixup). В Windows 95 эта таблица даже принудительно используется – все DLL загружаются как разделяемые и всегда загружаются в третий гигабайт адресного пространства.
Я долгое время пребывал в убеждении, что аналогичная схема загрузки используется и в линии Windows NT, с той лишь разницей, что система не отображает DLL в адреса тех процессов, которые об этом явно не просили, а начиная с версии 4.5 (Windows 2000) еще и учитывает при загрузке полное путевое имя DLL, позволяя, таким образом, загрузить несколько одноименных библиотек. Это убеждение и отражено в книге.
Действительность оказалась гораздо богаче (спасибо Андрею Таранцову, который мне на это указал). Кроме fixup, PE DLL имеют также «рекомендованный» адрес загрузки. Windows NT пытается загрузить DLL по этому адресу. Если это получается, код DLL оказывается разделяемым и при подкачке берется из файла DLL. Поскольку он не модифицирован, то не требуется сбрасывать его в swap-файл. Самое интересное происходит, если код не удается загрузить по рекомендованному адресу. Тогда Windows использует fixup-таблицу и перемещает код по свободному адресу, который ищет в адресном пространстве текущего процесса. Как и в OS/2, перемещенный код считается модифицированным и подкачивается из swap-файла.
Разумеется, в адресных пространствах других процессов этот диапазон адресов может оказаться занят, поэтому Windows не разделяет сегмен кода такой DLL.
Никогда.
Таким образом, основная схема загрузки DLL в Windows NT похожа на схему, применяемую в архаичных юниксах с форматами a.out и COFF (кстати, формат PE и является нестандартным расширением формата COFF). Только адресное пространство для разделяемых библиотек никто не распределяет.
Вообще никто. Вместо этого, загрузчик использует фиксап-таблицу для разрешения конфликтов. Разумеется, на машинах, на которых установлена сложная смесь приложений, возникает много конфликтов и производительность сильно страдает. Это еще одна причина, по которой не рекомендуется устанавливать на Windows-серверах несколько серверных приложений.
Исправлено во втором издании книги
Раздел 11.4.1 Устойчивость к сбоям питания
Архиваторы PkZIP и InfoZip действительно сохраняют каталог архива в конце файла. И, действительно, недописанный или недокачанный архив не имеет каталога и оказывается испорченным. Однако утверждение, что он испорчен безнадежно, не соответствует действительности. Информация каталога, в действительности, дублируется в теле архива – перед каждым файлом размещается метаинформация о нем с указанием имени, даты создания, длины упакованного образа и т.д. На основе этой информации архиватор может воссоздать каталог – у InfoZip это делается запуском zip с ключом -F или -FF. Разумеется, если речь идет о недописанном архиве, последий файл в архиве будет поврежден. Эта операция осуществляется путем полного сканирования архива с проверкой контрольных сумм, поэтому работает довольно долго, но на выходе получается полноценный архив со всеми полагающимися каталогами.
Эта ошибка была допущена в определенном смысле сознательно – мне хотелось найти убедительный пример того, как нештатное завершение программы приводит к потере данных. Более удачным примером, возможно, было бы поведение MS Office – но и там, в версии Office 2003, была добавлена возможность «починки» поврежденных файлов. По видимому, удачный и в то же время общеизвестный пример найти практически невозможно, потому что все более или менее распространенные форматы файлов в той или иной степени допускают их починку после аварийного завершения программы. Форматы же файлов, которые этого не допускают (и приложения, которые этого не умеют) просто не получают распространения. Естественный отбор в действии.
Исправлено во втором издании книги
Если вы знаете (или считаете, что знаете) о каких-то других ошибках, пишите комментарии к этой странице.