Операционные системы. Учебное пособие. Марапулец Ю.В. - 98 стр.

UptoLike

Составители: 

При поиске свободного места обычно используются правила «первого подходя-
щего» и «самого неподходящего». Если свободного фрагмента в памяти достаточного
объема нет, но тем не менее сумма свободных фрагментов превышает требования по
памяти для нового сегмента, может быть применена процедура дефрагментации памяти.
В идеальном случае размер сегмента должен быть достаточно малым, чтобы его
можно было разместить в случайно освобождающихся фрагментах оперативной памяти,
но и достаточно большим, чтобы содержать логически законченную часть программы с
тем, чтобы минимизировать межсегментные обращения.
Для решения проблемы замещения (определения того сегмента, который должен
быть либо перемещен во внешнюю память, либо просто замещен новым) используются
следующие правила [2]:
FIFO (first in - first out, что означает: «первый пришедший первым и выбывает»);
LRU (least recently used, что означает «последний из недавно использованных» или,
иначе говоря, «дольше всего неиспользуемый»);
LFU (least frequently used, что означает: «используемый реже всех остальных»);
random (случайный) выбор сегмента.
Первая и последняя дисциплины являются самыми простыми в реализации, но они
не учитывают, насколько часто используется тот или иной сегмент и, следовательно,
диспетчер памяти может выгрузить или расформировать тот сегмент, к которому в са-
мом ближайшем будущем будет обращение.
Алгоритм FIFO ассоциирует с каждым сегментом время, когда он был помещен в
память. Для замещения выбирается наиболее старый сегмент. Учет времени необязате-
лен, когда все сегменты в памяти связаны в FIFO-очередь и каждый помещаемый в па-
мять сегмент добавляется в хвост этой очереди. Алгоритм учитывает только время на-
хождения сегмента в памяти, но не учитывает фактическое использование сегментов.
Например, первые загруженные сегменты программы могут содержать переменные, ис-
пользуемые на протяжении работы всей программы. Это приводит к немедленному воз-
вращению к только что замещенному сегменту.
Для реализации дисциплин LRU и LFU необходимо, чтобы процессор имел допол-
нительные аппаратные средства. В принципе достаточно, чтобы при обращении к деск-
риптору сегмента для получения физического адреса, с которого сегмент начинает рас-
полагаться в памяти, соответствующий бит обращения менял свое значение (скажем, с
нулевого, которое установила ОС, в единичное). Тогда диспетчер памяти может время
от времени просматривать таблицы дескрипторов исполняющихся задач и собирать для
соответствующей обработки статистическую информацию об обращениях к сегментам.
В результате можно составить список, упорядоченный либо по длительности не исполь-
зования (для дисциплины LRU), либо по частоте использования (для дисциплины LFU).
Важнейшей проблемой, которая возникает при организации мультипрограммного
режима, является защита памяти. Для того чтобы выполняющиеся приложения не
смогли испортить саму ОС и другие вычислительные процессы, необходимо, чтобы дос-
туп к таблицам сегментов с целью их модификации был обеспечен только для кода са-
мой ОС. Для этого код ОС должен выполняться в некотором привилегированном режи-
ме, из которого можно осуществлять манипуляции с дескрипторами сегментов, тогда
как выход за пределы сегмента в обычной прикладной программе должен вызывать пре-
рывание по защите памяти. Каждая прикладная задача должна иметь возможность об-
ращаться только к своим собственным сегментам.
Остановимся на основных недостатках сегментного способа распределения памя-
ти. Во-первых, по сравнению с непрерывными способами, произошло увеличение вре-
мени на загрузку программы и ее сегментов. Для получения доступа к искомой ячейке
памяти необходимо сначала найти и прочитать дескриптор сегмента, а уже потом, ис-
пользуя данные из него, вычислить и конечный физический адрес сегмента. Для того
100
      При поиске свободного места обычно используются правила «первого подходя-
щего» и «самого неподходящего». Если свободного фрагмента в памяти достаточного
объема нет, но тем не менее сумма свободных фрагментов превышает требования по
памяти для нового сегмента, может быть применена процедура дефрагментации памяти.
      В идеальном случае размер сегмента должен быть достаточно малым, чтобы его
можно было разместить в случайно освобождающихся фрагментах оперативной памяти,
но и достаточно большим, чтобы содержать логически законченную часть программы с
тем, чтобы минимизировать межсегментные обращения.
      Для решения проблемы замещения (определения того сегмента, который должен
быть либо перемещен во внешнюю память, либо просто замещен новым) используются
следующие правила [2]:
• FIFO (first in - first out, что означает: «первый пришедший первым и выбывает»);
• LRU (least recently used, что означает «последний из недавно использованных» или,
    иначе говоря, «дольше всего неиспользуемый»);
• LFU (least frequently used, что означает: «используемый реже всех остальных»);
• random (случайный) выбор сегмента.
      Первая и последняя дисциплины являются самыми простыми в реализации, но они
не учитывают, насколько часто используется тот или иной сегмент и, следовательно,
диспетчер памяти может выгрузить или расформировать тот сегмент, к которому в са-
мом ближайшем будущем будет обращение.
      Алгоритм FIFO ассоциирует с каждым сегментом время, когда он был помещен в
память. Для замещения выбирается наиболее старый сегмент. Учет времени необязате-
лен, когда все сегменты в памяти связаны в FIFO-очередь и каждый помещаемый в па-
мять сегмент добавляется в хвост этой очереди. Алгоритм учитывает только время на-
хождения сегмента в памяти, но не учитывает фактическое использование сегментов.
Например, первые загруженные сегменты программы могут содержать переменные, ис-
пользуемые на протяжении работы всей программы. Это приводит к немедленному воз-
вращению к только что замещенному сегменту.
      Для реализации дисциплин LRU и LFU необходимо, чтобы процессор имел допол-
нительные аппаратные средства. В принципе достаточно, чтобы при обращении к деск-
риптору сегмента для получения физического адреса, с которого сегмент начинает рас-
полагаться в памяти, соответствующий бит обращения менял свое значение (скажем, с
нулевого, которое установила ОС, в единичное). Тогда диспетчер памяти может время
от времени просматривать таблицы дескрипторов исполняющихся задач и собирать для
соответствующей обработки статистическую информацию об обращениях к сегментам.
В результате можно составить список, упорядоченный либо по длительности не исполь-
зования (для дисциплины LRU), либо по частоте использования (для дисциплины LFU).
      Важнейшей проблемой, которая возникает при организации мультипрограммного
режима, является защита памяти. Для того чтобы выполняющиеся приложения не
смогли испортить саму ОС и другие вычислительные процессы, необходимо, чтобы дос-
туп к таблицам сегментов с целью их модификации был обеспечен только для кода са-
мой ОС. Для этого код ОС должен выполняться в некотором привилегированном режи-
ме, из которого можно осуществлять манипуляции с дескрипторами сегментов, тогда
как выход за пределы сегмента в обычной прикладной программе должен вызывать пре-
рывание по защите памяти. Каждая прикладная задача должна иметь возможность об-
ращаться только к своим собственным сегментам.
      Остановимся на основных недостатках сегментного способа распределения памя-
ти. Во-первых, по сравнению с непрерывными способами, произошло увеличение вре-
мени на загрузку программы и ее сегментов. Для получения доступа к искомой ячейке
памяти необходимо сначала найти и прочитать дескриптор сегмента, а уже потом, ис-
пользуя данные из него, вычислить и конечный физический адрес сегмента. Для того

                                       100