Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 23
Текст из файла (страница 23)
Каждый вновь размещаемый в памяти сегмент добавляется в хвост этой очереди. Алгоритм учитывает только время нахождения сегмента в памяти, но не учитываетфактическое использование сегментов. Например, первые загруженные сегментыпрограммы могут содержать переменные, требующиеся на протяжении всей ее работы. Это приводит к немедленному возвращению к только что замещенному сегменту.Для реализации дисциплин LRU и LFU необходимо, чтобы процессор имел дополнительные аппаратные средства. Минимальные требования — достаточно, чтобы при обращении к дескриптору сегмента для получения физического адреса,с которого сегмент начинает располагаться в памяти, соответствующий бит обращения менял свое значение (скажем, с нулевого, которое устанавливает операционная система, в единичное).
Тогда диспетчер памяти может время от временипросматривать таблицы дескрипторов исполняющихся задач и собирать для соответствующей обработки статистическую информацию об обращениях к сегменИх называют «дисциплинами замещения».там. В результате можно составить список, упорядоченный либо по длительностипростоя (для дисциплины LRU), либо по частоте использования (для дисциплины LFU).Важнейшей проблемой, которая возникает при организации мультипрограммного режима, является защита памяти. Для того чтобы выполняющиеся приложенияне смогли испортить саму операционную систему и другие вычислительные процессы, необходимо, чтобы доступ к таблицам сегментов с целью их модификациибыл обеспечен только для кода самой ОС. Для этого код операционной системыдолжен выполняться в некотором привилегированном режиме, из которого можно осуществлять манипуляции дескрипторами сегментов, тогда как выход за пределы сегмента в обычной прикладной программе должен вызывать прерывание позащите памяти.
Каждая прикладная задача должна иметь возможность обращаться только к собственным и к общим сегментам.При сегментном способе организации виртуальной памяти появляется несколькоинтересных возможностей.Во-первых, при загрузке программы на исполнение можно размещать ее в памятине целиком, а «по мере необходимости». Действительно, поскольку в подавляющем большинстве случаев алгоритм, по которому работает код программы, является разветвленным, а не линейным, то в зависимости от исходных данных некоторые части программы, расположенные в самостоятельных сегментах, могут бытьне задействованы; значит, их можно и не загружать в оперативную память.Во-вторых, некоторые программные модули могут быть разделяемыми.
Поскольку эти программные модуля являются сегментами, относительно легко организовать доступ к таким общим сегментам. Сегмент с разделяемым кодом располагается в памяти в единственном экземпляре, а в нескольких таблицах дескрипторовсегментов исполняющихся задач будут находиться указатели на такие разделяемые сегменты.Однако у сегментного способа распределения памяти есть и недостатки. Преждевсего (см. рис. 3.4), для доступа к искомой ячейке памяти приходится тратить многовремени.
Мы должны сначала найти и прочитать дескриптор сегмента, а уже потом, используя полученные данные о местонахождении нужного нам сегмента,вычислить конечный физический адрес. Для того чтобы уменьшить эти потери,используется кэширование — те дескрипторы, с которыми мы имеем дело в данный момент, могут быть размещены в сверхоперативной памяти (специальныхрегистрах, размещаемых в процессоре).Несмотря на то что рассмотренный способ распределения памяти приводит к существенно меньшей фрагментации памяти, нежели способы с неразрывным распределением, фрагментация остается. Кроме того, много памяти и процессорноговремени теряется на размещение и обработку дескрипторных таблиц. Ведь на каждую задачу необходимо иметь свою таблицу дескрипторов сегментов.
А при определении физических адресов приходится выполнять операции сложения, что требует дополнительных затрат времени.Поэтому следующим способом разрывного размещения задач в памяти стал спо°б, при котором все фрагменты задачи считаются равными (одинакового разме-с92Глава 3. Управление памятью в операционных системахра), причем длина фрагмента в идеале должна быть кратна степени двойки, чтобыоперации сложения можно было заменить операциями конкатенации (слияния).Это — страничный способ организации виртуальной памяти. Этот способ мы детально рассмотрим ниже.Примером использования сегментного способа организации виртуальной памяти1является операционная система OS/2 первого поколения , которая была созданадля персональных компьютеров на базе процессора i80286.
В этой операционнойсистеме в полной мере использованы аппаратные средства микропроцессора, который специально проектировался для поддержки сегментного способа распределения памяти.OS/2 v.l поддерживала распределение памяти, при котором выделялись сегменты программы и сегменты данных. Система позволяла работать как с именованными, так и с неименованными сегментами. Имена разделяемых сегментов данныхимели ту же форму, что и имена файлов. Процессы получали доступ к именованным разделяемым сегментам, используя их имена в специальных системных вызовах.
Операционная система OS/2 v. 1 допускала разделение программных сегментов приложений и подсистем, а также глобальных сегментов данных подсистем.Вообще, вся концепция системы OS/2 была построена на понятии разделенияпамяти: процессы почти всегда разделяют сегменты с другими процессами. В этомсостояло существенное отличие системы OS/2 от систем типа UNIX, которыеобычно разделяют только реентерабельные программные модули между процессами.Сегменты, которые активно не использовались, могли выгружаться на жесткийдиск. Система восстанавливала их, когда в этом возникала необходимость. Так каквсе области памяти, используемые сегментом, должны были быть непрерывными,OS/2 перемещала в основной памяти сегменты таким образом, чтобы максимизировать объем свободной физической памяти.
Такое переразмещение сегментовназывается уплотнением памяти (компрессией). Программные сегменты не выгружались, поскольку они могли просто перезагружаться с исходных дисков. Области в младших адресах физической памяти, которые использовались для запуска DOS-программ и кода самой OS/2, в компрессии не участвовали. Кроме того,система или прикладная программа могла временно фиксировать сегмент в памяти с тем, чтобы гарантировать наличие буфера ввода-вывода в физической памятидо тех пор, пока операция ввода-вывода не завершится.Если в результате компрессии памяти не удавалось создать необходимое свободное пространство, то супервизор выполнял операции фонового плана для перекачки достаточного количества сегментов из физической памяти, чтобы дать возможность завершиться исходному запросу.Механизм перекачки сегментов использовал файловую систему для выгрузки данных из физической памяти и обратно. Ввиду того что перекачка и компрессия влияли на производительность системы в целом, пользователь мог сконфигурироватьсистему'так, чтобы эти функции не выполнялись.OS/2 v.l начала создаваться в 1984 году и поступила в продажу в 1987 году.Сегментная, страничная и сегментно-страничная организация памяти9оБыло организовано в OS/2 и динамическое присоединение обслуживающих программ.
Программы OS/2 используют команды удаленного вызова. Ссылки, генерируемые этими вызовами, определяются в момент загрузки самой программы илиее сегментов. Такое отсроченное определение ссылок называется динамическимприсоединением. Загрузочный формат модуля OS/2 представляет собой расширение формата загрузочного модуля DOS. Он был расширен, чтобы поддерживатьнеобходимое окружение для свопинга сегментов с динамическим присоединением. Динамическое присоединение уменьшает объем памяти для программ в OS/2,одновременно делая возможными перемещения подсистем и обслуживающих программ без необходимости повторного редактирования адресных ссылок к прикладным программам.Страничный способ организациивиртуальной памятиКак уже упоминалось, при страничном способе организации виртуальной памятивсе фрагменты программы, на которые она разбивается (за исключением последней ее части), получаются одинаковыми.
Одинаковыми полагаются и единицыпамяти, которые предоставляются для размещения фрагментов программы. Этиодинаковые части называют страницами и говорят, что оперативная память разбивается на физические страницы, а программа — на виртуальные страницы. Частьвиртуальных страниц задачи размещается в оперативной памяти, а часть — во внешней. Обычно место во внешней памяти, в качестве которой в абсолютном большинстве случаев выступают накопители на магнитных дисках (поскольку ониотносятся к быстродействующим устройствам с прямым доступом), называют файлом подкачки, или страничным файлом (paging file). Иногда этот файл называютswap-файлом, тем самым подчеркивая, что записи этого файла — страницы — замещают друг друга в оперативной памяти.