Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции / 3. IPC

.pdf
Скачиваний:
7
Добавлен:
15.02.2021
Размер:
13.89 Mб
Скачать

Алгоритм банкира для одного вида ресурсов

Алгоритм банкира для несколько видов ресурсов

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 – сигнал о поступлении в буфер сокета срочных данных . Он сообщает процессу, что по сетевому соединению получены срочные внеочередные

Мониторы Хоара

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

Соседние файлы в папке Лекции