
Межпроцессная коммуникация (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 отличается разнообразием механизмов синхронизации:
Критические секции
Mutex’ы
Семафоры
Event’ы
Таймеры ожидания
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:
Есть страницы виртуальной памяти, тогда выделяется кусок по некоторому адресу, и возвращается на эту же команду.
Нет виртуальной памяти, тогда надо освободить какую-то часть и поставить вместо нее (если нужно, перенести старую страницу на жесткий диск).
Алгоритм выбора жертвы:
Невозможно проверить все оставшиеся на странице адреса, чтобы понять, обращаются они к кому-то или нет. Лучше найти страницу, к которой в ближайшее время не будет обращения. На страницу могут быть флаги R (хоть раз читали) и M (хоть раз писали).
Алгоритм RNU (Recent not used) – используется редко. Разбивает страницы на 4 класса:
R=0, M=0
R=1, M=0
R=0, M=1
R=1, M=1
Ищем с 1-й по 4-ю. Если M=0, то страницу сбрасывать не нужно.
А
лгоритм FIFO. Есть очередь всех страниц. Выбрасываем самую старую и добавяем в конец очереди нашу.
Можно сделать кольцевую очередь и ходить по кругу.
Алгоритм LRU (Least recent used). Можно реализовать там, где есть аппаратная поддержка. У LRU полной поддержки нет.