Абстракция памяти в ос кратко

Обновлено: 04.07.2024

Память является важнейшим ресурсом, требующим тщательного управления со стороны операционной системы.

Задачи управления памятью у операционной системы

Загрузку ОП в ОС Windowsможно посмотреть в Taskmanager.

Рассмотрим основные инструменты управления памятью.

Инструменты управления памятью

В данной статье рассматриваются два первых: регистр база0предел и своп.

Современные ОС

Основным механизмом абстракции в современных ОС является виртуальная память(virtual memory) , используется повсеместно, так как:

Аппаратная поддержка для VM( virtual memory )

Виртуальная память требует аппаратной поддержки:

  • MMU (memory management unit) -Блок управления памятью
  • TLB (Translation lookaside buffe) — Буфер ассоциативной трансляции
  • Таблицы страниц
  • Обработка страничных прерываний

Обычно есть поддержка свопинга и ограниченной сегментации.

Далее мы будем рассматривать разные алгоритмы организации памяти. Часто будем обращаться к понятию фрагментация памяти .

Фрагментация

По сути это неэффективное использование памяти.

Очевидный минус – снижается объем доступной памяти.

Существует 2 типа фрагментации:

  1. Внутренняя : когда выделяется больше памяти, чем запрашивалось, избыток памяти не используется;
  2. Внешняя : свободная память в процессе выделения или освобождения разделяется на мелкие блоки и в результате не обслуживаются некоторые запросы на выделение памяти.

Внутренняя фрагментация

внутренняя фрагментация ОП

Поступает запрос в ОС на выделение блока памяти, длиной N-байт.

Система неким образом(любым алгоритмом) выделяет кусок памяти.

В силу того, что алгоритмы выделения кусков памяти разные, часто реально выделается не N-байт, а N+K байт, где К- значение или 0 или вполне реальное.

Внешняя фрагментация

Внешняя фрагментация памяти

В ОП выделяется много кусков памяти и какие то из них освободились (процессы закончили работать и освободили ОП). В результате получилось 4 занятых куска и 1 и 2 свободные.

Поступает запрос на выделение большого куска памяти. Если суммировать 1+2 блоки памяти, то вполне хватит, но они разбросаны. Поэтому процессу память не выделится, будет получен отказ.

Возникла внешняя фрагментация – по отношению к блоку выделенной памяти она располагается снаружи.

Эволюция памяти

Данный вопрос рассматривается из-за того, что современные аспекты управления памятью сформировались исторически.

С самого начала программы напрямую пользовались физической памятью. ОС загружала задание, оно выполнялось, затем ОС выгружала его и загружала следующее.

Большинство встраиваемых систем не имело виртуальной памяти. Во встраиваемых системах обычно работает только одна программа.

Свопинг

По сути это сохранение полного состояния программы на диске. При этом он позволяет запустить другую программу, выполнить ее , а предыдущую сохранить, потом загрузить обратно предыдущую и продолжить ее выполнение.

Исторически свопинг – это замена одной программы на другую.

Мультипрограммирование

Затем появляется мультипрограммирование. При мультипрограммировании одновременно выполняется несколько процессов и заданий.

При этом возникают требования к менеджеру памяти:

  • Защита: ограничить адресное пространство, используемое процессами.
  • Быстрая трансляция адресов – это защита не должна тормозить процесс трансляции, не должна вносить задержку.
  • Быстрое переключение контекста.

Вводится понятие виртуальных адресов.

Виртуальный адрес – это независимость от физического расположения данных в памяти, т.е. как данные располагаются в памяти как угодно, мы их можем адресовать, используя некоторый виртуальный адрес.

Виртуальный адрес упрощает управление памятью нескольких процессов. Процессорные инструкции используют виртуальные адреса. ЦП преобразует эти виртуальные адреса в физические, используя некоторую помощь от ОС.

Метод фиксированных разделов

Это самый простой метод — метод разбивки физической памяти на разделы фиксированной длины.

Фиксированные – значит заранее определенные, и их размер в процессе работы изменить нельзя.

Аппаратная поддержка в виде регистров база-предел.

Преобразование адресов осуществляется по формуле:

Физический адрес = виртуальный адрес + база

Базовый регистр загружается ОС при переключении процесса.

Простая защита : Если виртуальный адрес больше база+предел, тогда наступает определенное системой событие – отказ в доступе или выводится ошибка. Есть механизм, который позволяет это отследить.

Преимущества:

Недостатки:

  • внутренняя фрагментация – доступный раздел выделяется, как правило больше, чем требуется.
  • внешняя фрагментация – когда требуется большой объем памяти, но осталось только 2 маленьких раздела (кусочка)

На рисунке ниже показано как определить физический адрес памяти.

метод фиксированных разделов

Метод фиксированных разделов

Есть виртуальный адрес, он дает нам смещение.

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

Регистр базы на рисунке равен 6Кб. Процесс будет располагаться между 6 и 8Кб.

Данную предложенную схему необходимо улучшить, а именно: разбивать физическую память на разделы динамически (разделы переменной длины).

Аппаратные требования те же: регистр база-предел

Физический адрес = виртуальный адрес + база

Защита – проверять если физический адрес больше, чем виртуальный адрес + предел

Преимущества:

  • нет внутренней фрагментации – выделяется столько, сколько запрашивается.

Недостатки:

Все тоже самое, но в памяти появились свободные пространства.

метод фиксированных разделов

Метод фиксированных разделов

Управление памятью

устранение внешней фрагментации

Как бороться с внешней фрагментацией?

На помощь приходит свопинг.

Все поднимается и остается большой кусок памяти для загрузки большой задачи.

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

Современный подход к решению этой проблемы – организация памяти в виде страниц.

Другие основные инструменты управления памятью мы рассмотрим в следующей статье.

Привет, Хабр! Хочу представить вашему вниманию серию статей-переводов одной интересной на мой взгляд литературы — OSTEP. В этом материале рассматривается достаточно глубоко работа unix-подобных операционных систем, а именно — работа с процессами, различными планировщиками, памятью и прочиими подобными компонентами, которые составляют современную ОС. Оригинал всех материалов вы можете посмотреть вот тут. Прошу учесть, что перевод выполнен непрофессионально (достаточно вольно), но надеюсь общий смысл я сохранил.

Рассмотрим наиболее фундаментальную абстракцию, которую ОС предоставляет пользователям: процесс. Определение процесса довольно-таки просто — это работающая программа. Программа сама по себе является безжизненной вещью, располагающейся на диске — это набор инструкций и возможно каких-то статических данных, ожидающих момента запуска. Именно ОС берет эти байты и запускает их, преобразую программу во что-то полезное.
Чаще всего пользователи хотят запускать более одной программы одновременно, например вы можете запустить на вашем ноутбуке браузер, игру, медиаплеер, текстовый редактор и тому подобное. Фактически типичная система может запускать десятки и сотни процессов одновременно. Этот факт делает систему более простой в использовании, вам никогда не приходится беспокоиться о том, свободен ли CPU, вы просто запускаете программы.

Отсюда вытекает проблема: как обеспечить иллюзию множества CPU? Как ОС создать иллюзию практически бесконечного количества CPU, даже если у вас всего один физический CPU?

ОС создает эту иллюзию посредством виртуализации CPU. Запуская один процесс, затем останавливая его, запуская другой процесс и так далее, ОС может поддерживать иллюзию того, что существует множество виртуальных CPU, хотя фактически это будет один или несколько физических процессоров. Такая техника называется разделение ресурсов CPU по времени. Эта техника позволяет пользователям запускать столько одновременных процессов, сколько они пожелают. Ценою такого решения является производительность – поскольку если CPU делят несколько процессов, каждый процесс будет обрабатываться медленнее.
Для воплощения виртуализации CPU, а особенно для того чтобы делать это хорошо, ОС нуждается и в низкоуровневой и в высокоуровневой поддержке. Низкоуровневая поддержка называется механизмами — это низкоуровневые методы или протоколы, которые реализуют нужную часть функционала. Пример такого функционала — контекстное переключение, которое дает ОС возможность останавливать одну программу и запускать на процессоре другую программу. Такое разделение по времени реализовано во всех современных ОС.
На вершине этих механизмов располагается некоторая логика, заложенная в ОС, в форме “политик”. Политика — это некоторый алгоритм принятия решения операционной системой. Такие политики, например, решают, какую программу надо запускать (из списка команд) в первую очередь. Так, например, данную задачу решит политика, называющаяся планировщик (scheduling policy) и при выборе решения будет руководствоваться такими данными как: история запуска (какая программа была запущена дольше всех за последнюю минут), какую нагрузку осуществляет данный процесс (какие типы программ были запущены), метрики производительности (оптимизирована ли система для интерактивного взаимодействия или для пропускной способности) и так далее.

Абстракция: процесс

Абстракция работающей программы, выполняемая операционной системой это то, что мы называем процесс. Как уже было сказано ранее процесс – это просто работающая программа, в любой моментальный промежуток времени. Программа с помощью которой мы можем получить суммарную информацию с различных ресурсов системы, и к которым обращается или которые эта программа затрагивает в процессе своего выполнения.
Для понимания составляющих процесса нужно понимать состояния системы: что программа может считывать или изменять во время своей работы. В любой момент времени нужно понимать, какие элементы системы важны для выполнения программы.
Одним из очевидных элементов состояния системы, которые включает в себя процесс — это память. Инструкции располагаются в памяти. Данные, которые программа читает или пишет также, располагаются в памяти. Таким образом, память, которую процесс может адресовать (так называемое адресное пространство) является частью процесса.
Также частью состояния системы являются регистры. Множество инструкций направлено на то, чтобы изменить значение регистров или прочитать их значение и таким образом регистры тоже становятся важной частью работы процесса.
Следует отметить, что состояние машины формируется также из некоторых специальных регистров. Например, IP — instruction pointer — указатель на инструкцию, которую программа исполняет в текущий момент. Еще есть stack pointer и связанный с ним frame pointer, которые используются для управления: параметрами функций, локальными переменными и адресами возврата.
Наконец, программы часто обращаются к ПЗУ (постоянному запоминающему устройству). Такая информация о “I/O” (вводе-выводе) должна включать в себя список файлов, открытых процессом в данный момент.

Process API

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

● Create (создание): В ОС должен входить какой либо метод, позволяющий создавать новый процессы. Когда вы вводите команду в терминал или запускаете приложение через двойной клик по иконке, посылается обращение к ОС для создания нового процесса и последующего запуска указанной программы.
● Удаление: Раз есть интерфейс для создания процесса, ОС также должна предоставлять возможность для принудительного удаления процесса. Большинство программ естественно будут запущены и завершены сами по себе по мере их выполнения. В противном случае пользователь хотел бы иметь возможность убить их и таким образом интерфейс для остановки процесса будет не лишним.
● Wait (ожидание): Иногда полезно дождаться завершения процесса, поэтому обеспечиваются некоторые интерфейсы предоставляющие возможностью ожидания.
● Misc Control (разное управление): Кроме убийства и ожидания процесса еще существуют другие разнообразные контролирующие методы. Например большинство ОС предоставляют возможность заморозки процесса (остановка его выполнения на некоторый период) и последующее возобновление (продолжение исполнения)
● Status (состояние): Существуют различные интерфейсы для получения некоторой информации он статусе процесса, такие как продолжительность его работы или в каком состоянии он сейчас находится.

image

Создание процесса: детали

Одна из интересных вещей — как же именно программы трансформируются в процессы. Особенно, как ОС поднимает и запускает программу. Как конкретно создается процесс.
В первую очередь ОС должна загрузить код программы и статические данные в память (в адресное пространство процесса). Программы обычно располагаются на диске или твердотельном накопителе в некотором исполняемом формате. Таким образом, процесс загрузки программы и статических данных в память требует от ОС возможности прочитать эти байты с диска и расположить их где-то в памяти.

В ранних ОС процесс загрузки выполнялся нетерпеливо (eagerly), то есть это значит что код загружался в память целиком до того как программа запускалась. Современные ОС делают это лениво (lazily), то есть загружая кусочки кода или данных только тогда, когда они требуются программе во время ее выполнения.

После того как код и статические данные загружены в память ОС нужно выполнить еще несколько вещей перед тем как запустить процесс. Некоторое количество памяти должно быть выделено под стек. Программы используют стек для локальных переменных, параметров функций и адресов возврата. ОС выделяет эту память и отдает ее процессу. Стек также может выделяться с некоторыми аргументами, конкретно она заполняет параметры функции main(), например массивом argc и argv.

Операционная система может также выделять некоторое количество памяти под кучу (heap) программы. Куча используется программами для явно запрашиваемых динамически выделенных данных. Программы запрашивают это пространство, вызывая функцию malloc() и явно очищает, вызывая функцию free(). Куча нужна для таких структур данных как: связанные листы, таблицы хэшей, деревья и другие. По началу под кучу выделяется маленькое количество памяти, но со временем в процессе работы программы куча может запросить большее количество памяти, через библиотечный API вызов malloc(). Операционная система вовлечена в процесс выделения большего количества памяти для того, чтобы помочь в удовлетворении этих вызовов.

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

Таким образом, загружая код и статические данные в память, создавая и инициализируя стек, а также выполняя другую работу, относящуюся к выполнению задач ввода-вывода, ОС подготавливает площадку для выполнения процесса. В конце концов, остается последняя задача: запустить на исполнение программу через ее точку ввода, называемую функцией main(). Переходя к выполнению функции main(), ОС передает управление CPU вновь созданному процессу, таким образом, программа начинает исполняться.

Состояние процесса

Теперь, когда у нас есть некоторое понимание, что такое процесс и как он создается, перечислим состояния процесса, в которых он может находиться. В самой простой форме процесс может находиться в одном из этих состояний:
● Running. В запущенном состоянии процесс выполняется на процессоре. Это значит, что происходит выполнение инструкций.
● Ready. В состоянии готовности процесс готов запуститься, но по каким-то причинам ОС не исполняет его в заданный момент времени.
● Blocked. В заблокированном состоянии процесс выполняет какие-то операции, которые не дают ему быть готовым к исполнению до тех пор, пока не произойдет какое-либо событие. Один из обычных примеров — когда процесс инициализирует операцию IO, он становится заблокированным и таким образом какой-то другой процесс может использовать процессор.

image

Представить себе эти состояния можно в виде графа. Как мы можем видеть на картинке, состояние процесса может меняться между RUNNING и READY на усмотрение ОС. Когда состояние процесса меняется с READY, на RUNNING это означает, что процесс был запланирован. В обратную сторону — снят с планировки. В момент, когда процесс становится BLOCKED, например, инициализирую операцию IO, ОС будет держать его в этом состоянии до наступления некоторого события, например завершение IO. в этот момент переход в состояние READY и возможно моментально в состояние RUNNING, если так решит ОС.
Давайте взглянем на пример того, как два процесса проходят через эти состояния. Для начала представим, что оба процесса запущены, и каждый использует только CPU. В этом случае, их состояния будут выглядеть следующим образом.

image

В следующем примере первый процесс через некоторое время работы запрашивает IO и переходит в состояние BLOCKED, предоставляя другому процессу возможность запуска (РИС 1.4). ОС видит, что процесс 0 не использует CPU и запускает процесс 1. Во время выполнения процесса 1 — IO завершается и статус процесса 0 меняется на READY. Наконец процесс 1 завершился, а по его окончание процесс 0 запускается, исполняется и заканчивает свою работу.

image

Структура данных

ОС сама является программой, и также как и любая другая программа имеет некоторые ключевые структуры данных, которые отслеживают разнообразные релевантные куски информации. Для отслеживания состояния каждого процесса в ОС будет поддерживаться некоторый process list для всех процессов в состоянии READY и некоторую дополнительную информацию для отслеживания процессов, которые выполняются в текущий момент. Также, ОС должна отслеживать и заблокированные процессы. После завершения IO, ОС обязана пробудить нужный процесс и перевести его в состояние готовности к запуску.

Так, например, ОС должна сохранить состояние регистров процессора. В момент остановки процесса состояние регистров сохраняется в адресном пространстве процесса, а в момент продолжения его работы — восстановить значения регистров и таким образом продолжить выполнения этого процесса.

Кроме состояний ready, blocked, running существуют еще некоторые другие состояния. Иногда в момент создания процесс может иметь состояние INIT. Наконец процесс может быть помещен состояние FINAL, когда он уже завершился, но информация о нем еще не вычищена. В UNIX системах такое состояние называется процесс-зомби. Это состояние полезно для случаев когда родительский процесс хочет узнать код возврата потомка, например, обычно 0 сигнализирует об успешном завершении, а 1 об ошибочном, однако программисты могут делать дополнительные коды вывода, сигнализируя о разных проблемах. При завершении процесс-родитель делает последний системный вызов, например wait(), чтобы дождаться завершения работы процесса-потомка и просигнализировать ОС о том, что можно очистить любые данные, связанные с завершенным процессом.


Ключевые моменты лекции:


● Процесс — главная абстракция работающей программы в ОС. В любой момент времени процесс может быть описан по его состоянию: содержимое памяти в его адресном пространстве, содержимое регистров процессора, включая instruction pointer и stack pointer также информацией о IO, например открытыми файлами, которые считываются или записываются.
● Process API состоит из вызовов, которые программы могут делать в отношении процессов. Обычно это вызовы создания, удаления или другие.
● Процесс находится в одном из множества состояний, включая running, ready, blocked. Различные события, такие как планировка, исключение из планировки или ожидания могут переводить состояние процесса из одного в другое.
● Process list содержит информацию обо всех процессах в системе. Каждая запись в ней называется process control block, которая в реальности является структурой, которая содержит всю необходимую информацию о конкретном процессе.

С понятием управления паметью в ОС связаны следующие технологии:

  • Функции управления памятью в ОС
  • Типы адресов
  • Методы распределения памяти в ОС
  • Принцип кэширования данных в ОС

Содержание

Функции управления памятью в ОС

Операционная система решает следующие задачи:

  • Отслеживание свободной и занятой памяти.
  • Выделение и освобождение памяти по запросам процессов.
  • Обеспечение настройки адресов.
  • Поддержка механизма виртуальной памяти

Типы адресов

Для идентификации переменных и команд используются символьные имена (метки), виртуальные адреса и физические адреса.

Символьные имена

Символьные имена присваивает пользователь при написании программы.

Виртуальные адреса

Виртуальные адреса вырабатывает компилятор. Так как не известно, в какое место оперативной памяти будет загружена программа, то компилятор присваивает переменным и командам виртуальные (условные) адреса, обычно считая по умолчанию, что программа будет размещена, начиная с нулевого адреса. Совокупность виртуальных адресов процесса называется виртуальным адресным пространством. Каждый процесс имеет собственное виртуальное адресное пространство.

Физические адреса

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

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

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

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

Иногда (обычно в специализированных системах) заранее точно известно, в какой области оперативной памяти будет выполняться программа, и компилятор выдает исполняемый код сразу в физических адресах.

Аннотация: В лекции рассмотрены: обзор функциональности ОС: управление памятью, файлами, процессами, сетями, командными интерпретаторами, сервисы ОС, системные вызовы; организация ОС по принципу уровней абстракции; особенности архитектуры UNIX и MS-DOS.

Презентацию к данной лекции Вы можете скачать здесь.

Введение

В данной лекции мы продолжаем обзор основной функциональности операционной системы. Рассмотрены также архитектура MS-DOS и UNIX и подход к разработке операционных систем на основе уровней абстракции.

Управление основной памятью

Основную (оперативную) память компьютерной системы можно рассматривать как большой массив слов или байтов, каждый из которых имеет свой адрес . Память - это хранилище данных с быстрым доступом, совместно используемое процессором и устройствами ввода-вывода .

Следует иметь в виду важную особенность основной памяти. В компьютерных архитектурах имеется два различных способа нумерации байтов в слове. По традиции будем представлять себе память как линейный массив , расположенный "слева направо", такой, что адреса слов, находящихся левее, меньше, чем адреса слов, находящихся правее. Каждое слово делится на байты, имеющие в слове свои номера – 0, 1 и т.д.. Например, в 64-разрядных системах в слове 8 байтов, с номерами от 0 до 7, в более старых 16-разрядных ( x86 ) – два байта, с номерами 0 и 1. Если нумерация байтов в слове начинается слева, т.е. начиная со старших битов, то такую архитектуру принято называть big endian, если же справа, т.е. начиная с младших битов, то little endian.Например, при big endian – архитектуре 32-разрядного процессора байты двух соседних слов памяти нумеруются так: 0, 1, 2, 3, 0, 1, 2, 3.При little endian же архитектуре нумерация будет иной: 3, 2, 1, 0, 3, 2, 1, 0.Представим теперь, что мы хотим рассматривать эти же два слова как массив байтов длиной 8 и записать туда байт за байтом символы строки: "ЭТОТЕКСТ" (всего – 8 символов). Такая операция при обеих архитектурах будет выполнена одинаково, т.е. последовательные байты получат именно эти значения. Затем рассмотрим результат снова, но уже как последовательность их двух слов. Каково будет содержимое этих слов? При big endian – архитектуре сюрпризов не будет: первое слово – " ЭТОТ",второе "ЕКСТ".Однако при little endian – архитектуре результат будет совсем иным: первое слово – "ТОТЭ",второе – " ТСКЕ"!Не забудем, что при обработке целого слова в little endian – архитектуре байты как бы "переставляются" в обратном порядке. Разумеется, это неудобно. С подобной проблемой автор столкнулся при переносе написанного им компилятора с архитектуры SPARC (big endian ) на архитектуру Intel x86 (little endian ), используя типы byte и word на Турбо- Паскале . Подобная операция типична для системных программ , например, таблица идентификаторов в компиляторе должна содержать как символы идентификатора (последовательность байтов), так и другую информацию о нем (длину, ссылки в различные таблицы и т.д.). Поэтому при little endian – архитектуре приходится хранить и обрабатывать байтовые массивы и массивы слов отдельно, и нельзя изменять точку зрения на одну и ту же область памяти и рассматривать ее то как массив байтов, то как массив слов.

Пример little endian – архитектуры – x86 . Пример big endian – архитектуры – SPARC . При программировании на языках высокого уровня разработчику, как правило, не приходится учитывать это различие. Однако если при реализации распределения памяти требуется одну и ту же область памяти рассматривать то как массив слов, то как массив байтов, то для little endian – архитектур могут быть "сюрпризы", связанные с тем, что при записи в память как в массив слов байты как бы переставляются.

Основная память – это неустойчивое ( volatile ) устройство памяти. Ее содержимое теряется при сбое системы или при выключении питания. Для организации устойчивой памяти используются другие, более медленные технологии.

ОС отвечает за следующие действия, связанные с управлением памятью:

  • Отслеживание того, какие части памяти в данный момент используются и какими процессами. Как правило, ОС организует для каждого процесса свою виртуальную память – расширение основной памяти путем хранения ее образа на диске и организации подкачки в основную память фрагментов (страниц или сегментов) виртуальной памяти процесса и ее откачки по мере необходимости.
  • Стратегия загрузки процессов в основную память, по мере ее освобождения. При активизации процесса и его запуске или продолжении его выполнения процесс должен быть загружен в основную память , что и осуществляется операционной системой. При этом, возможно, какие-либо не активные в данный момент процессы приходится откачивать на диск.
  • Выделение и освобождение памяти по мере необходимости. ОС обслуживает запросы вида "выделить область основной памяти длиной n байтов" и "освободить область памяти, начинающуюся с заданного адреса, длиной m байтов". Длина участков выделяемой и освобождаемой памяти может быть различной. ОС хранит список занятой и свободной памяти. При интенсивном использовании памяти может возникнуть ее фрагментация – дробление на мелкие свободные части, вследствие того, что при запросах на выделение памяти длина найденного сегмента оказывается немного больше, чем требуется, и остаток сохраняется в списке свободной памяти как область небольшого размера (подчас всего 1 – 2 слова). В курсе рассмотрены различные стратегии управления памятью и борьбы с фрагментацией. При исчерпании основной памяти ОС выполняет сборку мусора – поиск не используемых фрагментов, на которые потеряны ссылки, и уплотнение (компактировку) памяти – сдвиг всех используемых фрагментов по меньшим адресам, с корректировкой всех адресов.

Управление файлами

Файл (file) – совокупность логически взаимосвязанной информации, расположенная во внешней памяти. Как правило, файлы представляют программы (в виде исходного текста или в двоичной форме) или данные.

Другой термин, использованный для обозначения файлов фирмой IBM в ее операционной системе – IBM 360/370, - набор данных (data set).

ОС отвечает за следующие действия, связанные с управлением файлами.

Создание и удаление файлов. Отображение файлов на внешнюю память.ОС выделяет внешнюю память при создании нового файла. Файл в большинстве файловых систем состоит из заголовка и памяти. В заголовке хранятся атрибуты файла, например, его длина , тип, ссылка на элементы файла во внешней памяти. Память файла может быть организована по -разному – как список смежных областей ( блоков или записей),одна смежная область, список индексных узлов, ссылающихся на блоки файла и т.д. В курсе подробно рассмотрены некоторые файловые системы. Кроме создания и удаления файла, основные операции над ним – открытие и закрытие. Открытие файла – это считывание в основную память его заголовка и, возможно, одного или нескольких соседних блоков. Оно должно быть выполнено перед выполнением операций чтения из файла или записи в файл . Закрытие файла – это обратная операция: сброс всех копий блоков на внешнюю память и освобождение областей основной памяти, занятых открытым файлом. ОС закрывает файлы процесса при его завершении, если процесс не сделал этого явно (последнее рекомендуется). При отображении файлов на внешнюю память возникают проблемы, аналогичные проблемам распределения основной памяти, - фрагментация, возможность исчерпания внешней памяти или ее раздела (partition) – смежной области внешней памяти, имеющей определенное символьное обозначение.

Создание и удаление директорий. Поддержка примитивов (пользовательских команд и библиотечных вызовов) для управления файлами и директориями. Директория (directory) – это каталог (справочник) ссылок на группу файлов или других директорий, каждый (каждая) из которых имеет в данной директории свое уникальное символьное имя. Иерархия директорий позволяет организовать поиск файла по его символьному пути (path), например, в Windows : c:\doc\plan.txt – текстовый документ, содержащий план моих текущих действий, ссылка на который находится на диске C: , в директории doc. ОС управляет созданием и удалением директорий и поиском в них файлов по их путям. Следует иметь в виду, что на файл возможно несколько ссылок из разных директорий (хотя это и не рекомендуется), так что удаление элемента директории не означает и удаления файла – сам файл сохраняется, пока на него есть хотя бы одна ссылка . Более того, в некоторых файловых системах (например, FAT в Windows ) ошибочно удаленный файл можно восстановить, хотя и под другим именем. В других же файловых системах (например, в UNIX , где используются индексные блоки, хранящие адреса блоков файла) удаление файла – фатальная операция, от ошибок в которой может спасти только вовремя сделанная резервная копия файловой системы на диске или флэшке.

Сброс, или резервное копирование (backup) файлов на устойчивые носители ( флэш-память , компакт- диск , ленточный стример и др.), с целью их последующего восстановления при сбое или при ошибке пользователя. Значение резервного копирования для пользователей ОС трудно переоценить. Все наиболее важные документы, директории, файловые системы должны регулярно копироваться на внешнюю память (желательно делать не одну, а несколько копий на разные носители). Это должно стать непреложным правилом для каждого пользователя. Трудно даже вспомнить, сколько раз автору приходилось выслушивать сетования и жалобы студентов, аспирантов, сотрудников на то, что у них в самый ответственный момент "полетел винчестер ", из-за чего они не могут показать свою программу или отчет. Рецепт очень простой: необходимо регулярно копировать важную информацию на устойчивые носители.Если Вы работаете в локальной сети фирмы, исследовательской лаборатории и т.д., то в ней должен быть системный администратор , который должен заботиться о регулярном резервном копировании всех важных файловых систем. Возможности ОС позволяют выполнять такое копирование автоматически, в определенное время, - например, ночью, когда в офисе никого нет, но компьютеры локальной сети работают.

В некоторых ОС реализованы файловые системы с криптованием данных при записи в файл (например, система ZFS в Solaris). Такой подход позволяет решить проблему сохранения конфиденциальности информации (privacy).

Читайте также: