» Hardware » Software » Windows » Internet » Humor » Other

«Out of resources» или еще один довод в пользу перехода на XP

Argon On-Line » Windows » Windows XP
 

Существует довольно большой класс программ, называемых утилитами. Это такие мелкие, как правило, программки. которые делают что-то сравнительно простое, но полезное. А среди утилит есть «подкласс», занимающийся мониторингом системы и выдающий пользователю самую разную информацию о компьютере, на котором он работает, например, свободное пространство на диске, количество принятых/переданных по сети данных, размер свободной оперативной памяти… И во многих из этих утилит есть такой показатель, как свободные системные ресурсы.

Показатель этот довольно важный, но вот если попробовать расспросить пользователей о том, что же это такое, то наверняка большинство задумается и, в лучшем случае, скажет, что «больше свободных ресурсов — это хорошо!». Некоторые считают, что это показатель количества памяти, и что если компьютеру постоянно не хватает ресурсов, то надо идти покупать новый DIMM… Некоторые думают, что это как-то связанно со скоростью процессора… Встречалась мне и оригинальная теория, что это некая интегрированная величина, характеризующая производительность компьютера, в которой учитываются и память, и процессор, и размер винчестера, и объем видеопамяти…

Увы, все это далеко от истины. Ресурс в Windows — это практически любой объект, например, окно программы, кнопка, открытый файл и т.д. и т.п. Когда программе требуется воспользоваться каким-то ресурсом, она обращается к операционной системе с просьбой его создать или загрузить. Например, программа говорит: «Windows, мне надо создать окно размером 320 на 240 пикселей». Windows в ответ создает требуемое окно и возвращает программе некое число, указывающее на этот ресурс. «Я создала ваше окно, его номер 12345». Программа после этого оперирует полученным числом для того, чтобы проделать какие-то манипуляции с ресурсом. «Windows, покажи-ка окно 12345 в правом верхнем углу экрана». «Сделано!». В конце, когда программе больше не требуется указанный ресурс, она просит Windows его удалить.

Что же за число Windows присваивает ресурсам? В большинстве операционных систем, таким числом является указатель на область памяти компьютера, в которой ресурс расположен. Память в данном случае, можно представить себе как некий набор ячеек, каждая из которых может хранить единицу информации. Все ячейки пронумерованы и вот этот-то номер ячейки и является ее адресом. Т.е. большинство операционных систем в ответ на просьбу создать или загрузить какой-то ресурс просто вернут адрес той ячейки, в которую этот ресурс был помещен.

На Intel-машинах указатель имеет размер в 4 байта. Т.е. если программе требуется хранить указатель на какой-то ресурс, то ей придется потратить на него 4 байта памяти. Это было довольно существенной проблемой при разработке Windows, т.к. в те времена компьютеры были весьма ограничены — средняя машина имела 2-4 мегабайта оперативной памяти. А каждая программа может задействовать тысячи ресурсов в своей работе. И если бы в качестве указателей использователись четырехбайтовые значения, то весьма ощутимая часть памяти тратилась бы просто на хранение этих указателей…

И разработчики Windows пошли по другому пути — они создали таблицу ресурсов. Таблица ресурсов — это довольно длинный список, содержащий информацию обо всех ресурсах, которые находятся в памяти в данный момент. И когда программа просит Windows загрузить какой-то ресурс, то Windows просматривает таблицу ресурсов, находит пустую строчку и вписывает в нее информацию о свежесозданном ресурсе. И после этого программе возвращается не четырехбайтовый указатель на ресурс, а номер строчки таблицы, в которой записана информация о ресурсе, как бы «ссылка на ссылку на ресурс». А т.к. размер индекса таблицы ресурсов не 4, а 2 байта, то расход памяти на хранение указателей заметно сокращается. И в те времена, когда память компьютеров была сильно ограничена это было весьма ощутимым достижением!

Разумеется, эта схема не лишена недостатков. Количество чисел, которые можно передать с помощью определенного числа байт ограниченно. Если у вас есть 4 байта памяти, то вы можете адресовать свыше 4 миллиардов ресурсов, двумя байтами — только 65536. Таким образом, в каждый момент времени в Windows не может быть загружено больше, чем 65536 ресурсов — если их будет больше, то у программы не будет возможности к ним обратиться! Но в те времена, когда эта схема разрабатывалась у компьютера просто не было достаточно памяти, чтобы разместить в ней больше нескольких тысяч ресурсов, так что это ограничение не было столь существенным…

В наши дни ситуация изменилась. Память резко подешевела и экономия памяти на использовании двухбайтовых указателей вместо четырехбайтовых практически незаметна. Памяти среднего компьютера вполне хватило бы на то, чтобы хранить сотни тысяч ресурсов одновременно. Но… Наследие прошлого не позволяет адресовать больше чем 65536 ресурсов! И как только вы пытаетесь создать еще один, то компьютер оказывается «out of resources», независимо от количества свободной памяти…

Почему же Microsoft не хочет увеличить размерность указателей, скажем, задействовать 4 байта вместо двух? Ответ прост — требуется сохранить совместимость со старыми программами. Если изменить размерность указателей, то придется переписывать все программы, т.к. иначе они просто перестанут работать. А покупателям это не понравится…

И вот, вместо того, чтобы решить задачу раз и навсегда (попутно развалив существующий рынок программного обеспечения!), Microsoft начал делать различные исправления, стараясь смягчить проблему. Наиболее существенным шагом было разделение таблицы ресурсов на три части. Если заглянуть внутрь Windows, то вы увидите, что значительная часть кода находится в трех библиотеках — USER (которая содержит большинство функций для работы с интерфейсом пользователя), GDI (где находятся функции для работы с графикой и шрифтами) и KERNEL (которая содержит функции для работы с железом, управления задачами, памятью и т.п.).

Когда пользовательская программа просит Windows что-либо сделать, то почти всегда это осуществляется вызовом функций, хранящихся в одной из этих библиотек. И разработчики Windows сумели модифицировать свою операционную систему таким образом, что вместо одной таблицы ресурсов стало использоваться три. Если программа хочет создать окно, то этот ресурс помещается в таблицу USER; если производятся какие-то манипуляции с картинкой, то ресурс хранится в таблице GDI; а если открывается файл, то указатель на этот файл хранится в таблице KERNEL (на самом деле, все немножко сложнее, но это описание дает представление об идее).

Благодаря тому, что, скажем, системные функции не применяются к картинкам, Windows вполне успешно может разделять ресурсы, даже если они имеют одинаковые указатели. Это позволило в три раза увеличить количество ресурсов, которые могут храниться в памяти компьютера в каждый момент времени, но, безусловно, не решило проблему полностью. Наверняка, каждый из вас не раз сталкивался с ситуацией, когда у компьютера заканчивалось место для хранения ссылок на тот или иной вид ресурсов…

В Windows NT ситуация немножко отличается — там каждая программа логически отделена от других и не имеет такого доступа к «чужим» ресурсам, как в Win9x. Благодаря этому у каждой программы имеется своя таблица, что позволяет компьютеру держать в памяти намного больше ресурсов. Кстати, это же является причиной из-за которой многие программы, разработанные для Win9x не хотят работать под NT…

Ну и в конце этой заметки немножко практики:

Основным проявлением нехватки ресурсов является замедление реакции Windows, непрорисовка окон, сообщения об ошибках и т.п. Причем, часто случается так, что закрытие приложений не помогает или помогает ненадолго — дело в том, что при запуске какой-то программы она может загрузить «общие» библиотеки, т.е. такие, которые могут использоваться разными приложениями. Эти библиотеки тоже задействуют какие-то ресурсы. И после закрытия первоначальной программы Windows эти ресурсы не освободит — ведь они могут понадобиться кому-то еще… В этом случае, увы, помогает только перезагрузка.

Наиболее «ресурсоемкими» программами являются различные мультимедийные приложения (особенно Active desktop), веб-браузеры, программы загружающие большое количество шрифтов (например, MS Office 2000 при запуске загружает в GDI таблицу все установленные в системе шрифты). У старых 16-ти битных программ есть одно неприятное свойство — задействованные ими ресурсы не освобождаются до тех пор, пока не будут закрыты все 16-ти битные приложения…

Так что, если в процессе работы вам требуется держать открытыми множество программ и вы периодически сталкиваетесь с нехваткой ресурсов, то задумайтесь о переходе на «более свежую» версию Windows, базирующуюся на архитектуре NT. В частности, домашняя верия Windows XP зарекомендовала себя очень неплохо — помимо многочисленных улучшений в самой операционной системе, в нее встроена довольно приличная система обеспечения совместимости со старыми программами и, по крайней мере у меня, при переходе на нее не возникло практически никаких проблем, а вот количество зависаний и падений очень заметно уменьшилось…

 
Еще
Оглавление раздела
Содержание / Новости

Карта сайта
О сайте
Ссылки

Форум
Обратная связь
Если ты нашел ошибку, хочешь что-то посоветовать либо поругать меня, не посчитай за труд написать об этом в следующем поле...







К началу страницы© 2002—2008 Argon