Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OS-theory.doc
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
154.62 Кб
Скачать

Межпроцессная коммуникация (ipc)

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

С амую первую схему решения задачи предложил Дейкстра в задаче об обедающих философах (1965) – процессами там выступали философы, ресурсами - вилки. Разделение общих ресурсов выполняется при помощи семафорного подхода: процесс, который хочет захватить ресурс, проверяет флаг, и если 0 (ресурс свободен), ставит 1 (захватывает). На языке программирования без средств ОС так сделать нельзя, поскольку процесс может прерваться посреди оператора

if (flag==0)

flag=1;

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

В некоторых процессорах есть команда «проверить на 0, и если 0, то поставить 1», являющаяся элементарным действием, не прерываемым посреди выполнения.

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

Одним из простейших механизмов является mutex (Mutual Exclusion). Они гарантируют взаимные исключения, т.е. 2 процесса не могут одновременно обращаться к одному ресурсу. Как только процесс завершается, он очищает mutex’ы всех своих ресурсов. Если завершение происходит аварийно, это делает за него ОС.

В частности, mutex’ы порождают deadlock. Он происходит, если 2 процессам для работы нужны 2 ресурса, первый процесс захватывает первый ресурс, второй – второй ресурс. Далее каждый процесс будет ждать освобождения другого ресурса, в результате чего процессы блокируют друг друга.

В качестве одного из решений проблемы deadlock’a можно предложить рассматривать эти 2 ресурса как один искусственный. При большом количестве общих данных, в крайнем случае, получим однозадачную систему.

Семафор – развитый mutex (0,…n; n-кол-во ресурсов, защищаемых семафором).

Windows отличается разнообразием механизмов синхронизации:

  1. Критические секции

  2. Mutex’ы

  3. Семафоры

  4. Event’ы

  5. Таймеры ожидания

Mutex’ы и семафоры – полноценные объекты ядра.

Проблема «писатель-читатель»: нужно уметь ждать друг друга.

Везде под процессом понимается нечто исполняемое; сейчас это уместнее называть потоком.

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

В Windows программы не могут иметь общих данных.

Трубы (pipes) работают между двумя процессами. Бывают безымянные (всегда односторонние) и именованные. Одна программа создает трубу и кидает туда данные. Другая программа в нужное время заходит в трубу, берет данные, а если их там нет, то ждет.

Mailbox(Unix)/Mailslot(Windows) – механизм почтовых ящиков. Нужен, если есть редко используемый сервис. Ему можно кидать данные в ящик, а он будет время от времени его проверять. Почтовых ящиков может быть много.

Память

Каждой задаче в Windows выделяется 4 Гб памяти.

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

В момент, когда память заканчивается, начинается процесс подкачки (swapping’а). Суть: находится кусок памяти, не влезающий физическую память, и отправляется на жёсткий диск. Естественно, это на порядок медленней. При swapping’е фактически скорость работы компьютера определяется скоростью обращения к жёсткому диску.

VMM (Virtual memory management) невозможно реализовать без аппаратной поддержки. В Windows адрес – логическое, а не физическое понятие. Он кроме числа (номера ячейки) содержит ещё селектор на таблицу дескрипторов: GDT или LDT.

GDT – таблица для всей ОС. LDT – таблица для данного процесса; переключая процесс, нужно указать новую LDT.

В плоской модели памяти у всех регистров процесса один селектор (CS = ES = SS = DS).

Можно создавать страницы памяти различного размера. Чем меньше страница, тем вероятней, что ее будут выгружать. 2Мб – страницы Windows; 4 Кб – пользовательские страницы.

Из 32 бит адреса 10 бит – индекс страницы, 22 бита – смещение. Физический адрес страницы памяти мы знаем; вся таблица страниц хранится в 4 Кб.

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

Выделение памяти: mov [1000h], EAX (из виртуальной в физическую). При работе с памятью может произойти ошибка страницы (page fail), если мы обратимся к виртуальной памяти, которой ничего не соответствует.

Механизм VMM:

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

  2. Нет виртуальной памяти, тогда надо освободить какую-то часть и поставить вместо нее (если нужно, перенести старую страницу на жесткий диск).

Алгоритм выбора жертвы:

Невозможно проверить все оставшиеся на странице адреса, чтобы понять, обращаются они к кому-то или нет. Лучше найти страницу, к которой в ближайшее время не будет обращения. На страницу могут быть флаги R (хоть раз читали) и M (хоть раз писали).

  1. Алгоритм RNU (Recent not used) – используется редко. Разбивает страницы на 4 класса:

  1. R=0, M=0

  2. R=1, M=0

  3. R=0, M=1

  4. R=1, M=1

Ищем с 1-й по 4-ю. Если M=0, то страницу сбрасывать не нужно.

  1. А лгоритм FIFO. Есть очередь всех страниц. Выбрасываем самую старую и добавяем в конец очереди нашу.

Можно сделать кольцевую очередь и ходить по кругу.

  1. Алгоритм LRU (Least recent used). Можно реализовать там, где есть аппаратная поддержка. У LRU полной поддержки нет.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]