
- •Конспект лекций по курсу «Операционные системы», (1 семестр , часть 1)
- •Занятие 1.Введение
- •Занятие 2.Прерывания, многозадачность
- •Занятие 3.Работа с памятью
- •Занятие 4.Процессы
- •Занятие 5.Потоки. Многопроцессорные системы
- •Занятие 6.Микроядро.
- •Занятие 7.Устройства ввода-вывода. Dma.
- •Занятие 8.Буферизация операций ввода-вывода
- •Циклическая буферизация
- •Занятие 9.Структура hdd.
- •Занятие 10.Файловая система
- •Смешанный – состоят из записей разной длины с разным количеством полей:
- •Последовательный – состоит из записей одинаковой длины с одинаковым количеством и размеров полей.
- •Непрерывный
- •Цепочечный
- •Индексированный
- •Битовые таблицы ( маска)
- •Список свободных блоков
- •Цепочки свободных блоков
- •Индексирование
- •Занятие 11. Инсталяция windows
- •Запуск инсталляции
- •Занятие 12.Загрузка windows
- •Занятие 13.Загрузочный файл boot.Ini
- •Загрузочные файлы
- •Файл Boot.Ini
- •Занятие 14.Диск аварийного восстановления
- •Занятие 15.Консоль восстановления
- •Консоль восстановления
- •Занятие 16.Адресация и доступ к разным типам памяти
- •Основная и верхняя память.
- •Менеджеры памяти
Занятие 3.Работа с памятью
Требования к управлению памятью
Перемещение: при работе нескольких процессов одновременно, постоянно приходится какие-то задачи выгружать из памяти, а другие загружать. При этом другие задачи могут занять память, которую занимала прежняя задача. Однако при возврате к первой задаче и повторной ее загрузке в память не рационально требовать ее загрузку в ту же самую область, в которой она была. Более правильным решением будет размещение ее в свободной области т.е. возникает перемещение программы при вторичной ее загрузке в память по сравнению с прежним размещением и это требует от программы более сложной адресации к своим данным.
Защита: при работе программ должен быть механизм, который защищает область памяти программы, от вторжения в нее других программ.
Совместное использование: наряду с защитой областей памяти, требуется для гибкой работы нескольких программ создание участков памяти, которыми могут пользоваться несколько программ. Например, одна и та же подпрограмма может не переписываться заново для каждой задачи, а загружаться в память один раз и использоваться несколькими программами одновременно.
оптимальное размещение: при размещении программ в памяти, необходимо разработать способ максимально эффективного ее использования
работа с виртуальной памятью: для размещения одной программы, может не хватить оперативной памяти. В этом случае часть программы размещается на вторичной памяти т.е. дисках. Поэтому необходим механизм взаимодействия основной памяти и вторичной.
Распределение памяти в многозадачных системах
В многозадачных системах одновременно в памяти должны находиться несколько выполняемых заданий. Однако часто памяти не хватает для всех заданий. Т.к. процессор задания выполняет поочередно, то используется принцип поочередного выделения памяти для них ( если для всех не хватает).
В первых ОС память размещалась очень просто – каждая программа начиналась с одного и того же адреса т.е. каждая следующая накладывалась на предыдущую. Если часть программы оставалась в памяти, то при следующей загрузке догружалась только недостающая часть. Например:
память |
выполнение задачи 1 |
выполнение задачи 2 |
выполнение задачи 3 |
выполнение задачи 2 |
0 000 - 5 000 |
Система |
Система |
|
Система |
10 000 |
задача 1 |
задача 2 |
задача 3 |
догрузка 2 |
15 000 |
задача 2 |
задача 2 |
||
20 000 |
||||
25 000 |
свободная память |
|||
32000 |
свободная память |
свободная память |
свободная память |
В этом примере для загрузки задачи 2 повторно не требуется загружать ее всю ( т.к. часть ее уже находится в памяти), а только недостающую часть, которую использовала задача 3 до этого..
Однако такое распределение неэффективно. Например, задачу3 можно было разместить в свободном участке и тогда задачу2 не пришлось бы повторно догружать. Поэтому появились другие системы распределения памяти:
раздел 8М |
раздел 8М |
раздел 8М |
раздел 8М |
... |
Фиксированное распределение:
вся память делится на одинаковые части – разделы. Каждой программе отводится свой раздел. Однако для маленьких программ, большая часть раздела остается неиспользованной ( это называется внутренней фрагментацией), а для больших программ одного раздела недостаточно и приходится программисту использовать «оверлеи» т.е. распределять размещение данных в памяти в нескольких разделах, а затем позаботиться о переключении на использование то одного, то другого раздела, так как в каждый момент работы должен использоваться только один раздел. Т.е. программист сам должен позаботиться о распределении памяти, что сильно усложняет его работу и требует много времени на разработку программ. Бороться с этим можно путем использования фиксированных разделов разного размера:
-
2М
4М
8М
8М
16М
...
и тогда каждую программу размещать в максимально подходящем для нее разделе. Однако, если есть несколько программ одного размера, то выстраивается очередь для использования подходящего раздела в то время как другие разделы простаивают.
Динамическое распределение: для каждой программы выделяется строго необходимое ей место и не более. Однако при освобождении памяти образуются между разделами активных программ «дырки» от освободившихся мест и размеры их не всегда подходят для размещения следующих программ. Это называется внешней фрагментацией. Для решения этой проблемы приходится выполнять упаковку фрагментов памяти в сплошной поток с освобождением одного свободного пространства. Однако, это требует дополнительной загрузки процессора, что замедляет работу программ.
-
1 прогр
2 прогр
4 прогр
6пр
...
система «двойников»: это был компромисс между динамическим и фиксированным распределением, по которому память выделялась блоками размером 2к . Допустим вся память размером 1 М, тогда для размещения программы 100кБ подбирается блок следующим образом: вся память делится пополам ( т.е. на 2 части по 512 кБ), затем снова пополам ( по 128Кб) и отводится для программы кусок 128Кб т.к. при следующем делении программа уже не разместится. По такому же принципу размещаются остальные программы в оставшейся части памяти. При образовании двух подряд одинаковых свободных кусков они объединяются в один блок. Например, при запросе на размещение программ А( =100Кб) , В ( =186 Кб) и С( =52Кб) они будут размещены последовательно так:
-
А - 128
128 Кб
256 Кб
512 Кб
А - 128
128 Кб
В - 256
512 Кб
А - 128
С-64
64Кб
В - 256
512 Кб
Страничная организация: Вся память разбивается на небольшие блоки одинакового размера – страницы. Для каждой программы отводится необходимое ей количество страниц. При этом страницы могут находиться не подряд, а вразброс. Поэтому для каждой программы создается своя таблица страниц. Реальный адрес памяти формируется из логического адреса, который состоит из номера страницы и смещения внутри страницы. Преобразование адреса выполняет система невидимо для программиста. За счет малых размеров страниц внутренняя фрагментация небольшая, а внешняя отсутствует.
Сегментация: второй способ разбивки на блоки, но разбивается не оперативная память, а программа на сегменты. При этом они могут быть разного размера, но есть максимальный предел. Физический адрес вычисляется аналогично страничной памяти путем сложения номера сегмента и смещения внутри сегмента. В отличие от страниц, сегменты «видимы» для программиста и он в программе может распределять по ним код программы и данные.
Комбинация страничной и сегментированной памяти: преимущества страничной памяти можно совместить с преимуществами сегментированной. Для этого программы делятся на сегменты, которые в свою очередь занимают целое число фиксированных страниц памяти. Для программиста видны сегменты, а для системы распределение выполняется постранично. Для программиста адрес в памяти это номер сегмента и смещения, а для ОС реальный адрес вычисляется как адрес страницы, где начинается сегмент + количество страниц для смещения внутри сегмента.
Виртуальная память
При невозможности разместить программу целиком в оперативной памяти, часть ее размещается на вторичной памяти ( обычно на жестких дисках) – которую называют виртуальной памятью. При этом система должна следить за своевременной догрузкой в оперативную память недостающих частей с диска и выгрузкой неиспользуемых частей на диск. Это занимает определенное время и тормозит выполнение программ, но на практике эта система оказалась удобной, т.к. программист может не знать при разработке программы, сколько понадобится памяти и сколько ее будет в наличие на компьютере пользователя.
Для работы с виртуальной памятью наиболее удобна страничная организация памяти: каждая загружаемая и выгружаемая на диск часть программы – это одна страница. Однако с виртуальной памятью работают и системы с сегментацией памяти.
При нехватке памяти стоит задача определения – какие страницы выгрузить? На первый взгляд кажется, что можно выгрузить первые не используемые по порядку их расположения, но на практике оказывается, что они могут понадобиться очень скоро и может возникнуть ситуация. когда одни и те же страницы постоянно то выгружаются, то снова загружаются, а длительно неиспользуемые остаются постоянно в памяти, что сильно замедляет работу. Поэтому в настоящее время разработаны несколько алгоритмов выбора выгружаемых страниц по критерию прогноза их ближайшего использования. Для этого в таблицах страниц ведется учет количества обращений и длительности простоя для каждой страницы, на основании которых определяются самые менее используемые страницы для выгрузки. Эти алгоритмы значительно ускорили работу с памятью.
Сами таблицы при большом количестве программ могут быть очень большими и поэтому тоже могут размещаться в виртуальной памяти, при этом обращение к виртуальной памяти как бы удваивается – вначале для загрузки части таблицы, а затем для загрузки самой страницы.
Для ускорения работы виртуальной памяти используется высокоскоростной кэш ( или буфер поиска трансляции) для хранения записей таблицы страниц, которые использовались последними и вероятнее всего будут использоваться и следующими. При этом поиск таблицы страниц сначала выполняется в кэше, а затем в виртуальной памяти.
Кэш – память
Для ускорения обращений процессора к памяти используется кэш-память. Эта память более скоростная, чем оперативная и непосредственно связана с процессором. В этой памяти размещаются последние данные, с которыми работал процессор и с которыми, вероятнее всего, он будет работать еще. Выбор блоков. Которые нужно оставить в КЭШе, а какие выгрузить из него определяется путем подсчет количества обращений к этому блоку и времени последнего обращения. Поэтому процессор сначала обращается к кэш-памяти и ищет в ней данные и, если их в ней нет, то из оперативной памяти в кэш считывается блок памяти с нужными данными и продолжается выборка данных из кэша процессором. Таким образом, процессор чаще всего работает с кэш памятью, которая более быстрая, чем оперативная и, следовательно, значительно ускоряется работа с памятью. Считывание информации и загрузка в кэш выполняется блоками. Поэтому выборка из кэша в пределах блока не требует дополнительных обращений к памяти.
Вопросы на повторение:
Какие задачи стоят перед разработчиками ОС по управлению памятью. Как распределялась память в первых ОС. За счет чего получается ускорение работы с оперативной памятью при наличии кэш-памяти.
Принцип фиксированного и простого динамического распределения памяти.
Принцип работы страничной памяти и сегментированной ( в чем отличия). Как работает смешанная система страничной памяти и сегментированной
Назначение и принцип работы виртуальной памяти. Какой механизм разработан для ускорения работы виртуальной памяти.