Лекции / 3. IPC
.pdfАлгоритм банкира для одного вида ресурсов
Алгоритм банкира для несколько видов ресурсов
E=(6342) - существующие ресурсы,
P=(5322) - занятые ресурсы,
A=(1020) - доступные ресурсы
Предотвращение
взаимоблокировок
пронумеровать ресурсы и упорядочить
Системные средства синхронизации
•системные семафоры;
•мьютексы;
• события; |
объекты ядра |
|
•таймеры;
•файлы, процессы, потоки…
ОС |
Wait ( ) |
Set ( ) |
Windows NT |
WaitForSingleObjeсt ( ) |
SetEvent ( ) |
|
WaitForMultipleObjeсt ( ) |
|
UNIX |
sleep ( ) |
wakeup ( ) |
OS/2 |
DosSemWait ( ) |
DosSemSet ( ) |
Мьютексы
PTHREAD_MUTEX_ERRORCHECK — повторные захваты тем же потоком вызывают немедленную ошибку
Фьютексы
•Фьютекс, или fast user space mutex, — быстрый мьютекс в пользовательском пространстве.
•Фьютекс относится к свойствам Linux, реализующим основную блокировку (во многом похожую на мьютекс), но избегающим выпадения в режим ядра до возникновения в этом реальной надобности., что существенно повышает производительность.
•Фьютекс состоит из двух частей: службы ядра и пользовательской библиотеки. Служба ядра предоставляет «очередь ожидания», позволяющую ожидать снятия блокировки нескольким процессам. Они не будут запущены, пока ядро не разблокирует их явным образом. Чтобы процесс попал в очередь ожидания, требуется (довольно дорого обходящийся) системный вызов, чего следует избегать. Зато при отсутствии конкуренции фьютекс работает полностью в пользовательском пространстве. Говоря конкретнее, процессы совместно используют общую переменную блокировки, являющуюся вымышленным названием для выровненного 32-разрядного целочисленного значения, которое служит в качестве блокировки. Предположим, что исходное значение блокировки равно 1, и под этим подразумева-ется, что блокировка свободна. Поток захватывает блокировку, проводя атомарное «уменьшение на единицу и тестирование». Затем поток анализирует результат, выясняя, была ли блокировка свободна. Если она была в незаблокированном состоянии, все обходится благополучно и наш поток успешно захватывает блокировку. Но если блокировка удерживается другим потоком, поток вынужден ждать. В таком случае библиотека фьютекса не обращается к спину, а использует системный вызов для помещения потока в очередь ожидания в пространстве ядра. Есть надежда на то, что затраты на переключение в режим ядра теперь оправданны, поскольку поток все равно был бы заблокирован. Когда поток, захвативший блокировку, выполнит свою задачу, он освободит блокировку, проводя атомарное увеличение на единицу и тестирование и проверяя результат, чтобы увидеть, есть ли процессы, заблокированные на очереди ожидания в пространстве ядра. Если таковые имеются, он даст ядру понять, что оно может разблокировать один или несколько таких процессов. Если же конкуренция отсутствует, ядро вовлекаться в работу вообще не будет.
•
Системные семафоры
принцип действия мьютексов, но в них заложена возможность подсчета ресурсов, что позволяет заранее определенному числу
потоков одновременно войти в синхронизуемый участок кода.
с автоматическим сбросом
как и в случае мьютекса, в состояние «готовность» переводится только один
поток
Сигнал
или виртуальное является сообщением, |
которое система посылает |
процессу или один процесс |
посылает другому |
С точки зрения пользователя получение процессом сигнала выглядит как возникновение прерывания. Процесс прерывает исполнение, и управление передается функции-обработчику сигнала. По окончании обработки сигнала процесс может возобновить регулярное исполнение.
•SIGALRM – сигнал таймера
•SIGCHLD – сигнал останова или завершения дочернего процесса.
•SIGHUP – сигнал освобождения линии. Посылается ядром всем процессам, подключенным к управляющему терминалу при отключении терминала. Он также посылается всем членам сеанса, если завершает работу лидер сеанса (обычно процесс командного интерпретатора), связанного с управляющим терминалом;
•SIGINT – сигнал прерывания программы . Посылается ядром всем процессам сеанса, связанного с терминалом, когда пользователь нажимает клавишу прерывания. Это также обычный способ остановки выполняющейся программы;
•SIGKILL – сигнал уничтожения процесса (kill). Это довольно специфический сигнал, который посылается от одного процесса к другому и приводит к немедленному прекращению работы получающего сигнал процесса;
•SIGPIPE – сигнал, посылаемый процессу при попытке записи в соединение (канал или сокет) при отсутствии или обрыве соединения с читающей стороной;
•SIGPOLL – сигнал о возникновении одного из опрашиваемых событий . Этот сигнал генерируется ядром, когда некоторый открытый дескриптор файла становится готовым для ввода или вывода;
•SIGPROF – сигнал профилирующего таймера. любой процесс может установить не менее трех таймеров. Второй из этих таймеров может использоваться для измерения времени выполнения процесса в пользовательском и системном режимах. Этот сигнал генерируется, когда истекает время, установленное в этом таймере, и поэтому может быть использован средством профилирования программы;
•SIGQUIT – сигнал о выходе. Очень похожий на сигнал SIGINT, этот сигнал посылается ядром, когда пользователь нажимает клавишу выхода используемого терминала. В отличие от SIGINT, этот сигнал приводит к аварийному завершению и сбросу образа памяти;
•SIGSTOP – сигнал останова. Это сигнал управления заданиями, который останавливает процесс.
•SIGTERM – программный сигнал завершения. Программист может использовать этот сигнал для того, чтобы дать процессу время для «наведения порядка», прежде чем посылать ему сигнал SIGKILL;
•SIGTRAP – сигнал трассировочного прерывания. Это особый сигнал, который в сочетании с системным вызовом ptrace используется отладчиками, такими как sdb, adb, gdb;
•SIGTSTP – терминальный сигнал остановки. Он формируется при нажатии клавиши останова;
•SIGTTIN – сигнал о попытке ввода с терминала фоновым процессом.. Действие сигнала по умолчанию – остановка процесса;
•SIGTTOU – сигнал о попытке вывода на терминал фоновым процессом. Аналогичен сигналу SIGTTIN, но генерируется, если фоновый процесс пытается выполнить запись в управляющий терминал. Действие сигнала по умолчанию – остановка процесса;
•SIGURG – сигнал о поступлении в буфер сокета срочных данных . Он сообщает процессу, что по сетевому соединению получены срочные внеочередные
Мониторы Хоара
Монитор – это пассивный набор разделяемых переменных и повторно входимых процедур доступа к ним, которыми процессы пользуются в режиме разделения, причем в каждый момент времени им может пользоваться только один процесс.