Синхронизация процессов и потоков

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

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

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

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

Еще одной проблемой синхронизации является распознавание тупиков ( временных блокировок).

Поток АПоток В

ресурс 1 ресурс 2

ресурс 2 ресурс 1

Пусть поток А обращается к ресурсам в порядке номеров 1 и 2 , а поток В наоборот.

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

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

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

1. отслеживание свободной и занятой памяти;

2. выделение памяти процессом и освобождение ее после завершения;

3. выполнение кодов и данных, принадлежащих процессам из ОП на диск ( полное или частичное), когда размеры основной памяти недостаточно для размещения в ней всех процессов и возвращение их в ОП, когда в ней освобождается место;

4. настройка программы на конкретную область физической памяти;

5. защита памяти процессов от взаимного вмешательства.

Типы адресов.

Для идентификации переменных и команд на разных этапах жизненного цикла программы используется:

1. символические имена (метки) – их присваивает пользователь при написании программы на языке программирования;

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

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

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

Существует два принципиально разных подхода к преобразованию виртуальных адресов в физические:

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

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

Виртуальная память.

Виртуализация оперативной памяти (т.е. подмена ее дисковой памятью) осуществляется совокупностью программных модулей ОС и аппаратных схем процессора и включает решение задач:

· размещение данных в ЗУ разного типа (часть кода программы - в оперативную память, часть на диске);

· выбор образов процессов или их частей для перемещения из оперативной памяти на диск и обратно.

Примечание: образ процесса – содержимое назначенного процессу виртуального адресного пространства, то есть коды команд, исходные и промежуточные данные, а так же результаты вычислений.

· преобразование виртуальных адресов в физические.

· перемещение данных по мере необходимости между памятью и диском.

Виртуализация памяти может быть осуществлена на основе двух различных подходов:

· свопинг (swopping) – образы процесса выгружается на диск, возвращаются обратно в память полностью;

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

Свопинг – частный случай виртуальной памяти. Ему присуща избыточность. В настоящее время все множество реализаций виртуальной памяти может быть представлено тремя классами:

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

· сегментная виртуальная память - предусматривает перемещение данных сегментами, т.е. частями виртуального адресного пространства, произвольного размера, полученными с учетом смыслового значения данных.

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

· сегментно- страничная виртуальная память - сочетает достоинства обоих подходов.

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