13.3.3. Обязательные блокировки
13.3.3. Обязательные блокировки
И Linux, и System V поддерживают как обычные, так и обязательные блокировки. Обязательные блокировки устанавливаются и реализуются с помощью того же механизма fcntl(), который используется для рекомендательной блокировки записей. Блокировки считаются обязательными, если бит setgid заблокированного файла установлен, но его бит группового выполнения — нет. В противном случае применяется рекомендательное блокирование.
При активизации обязательного блокирования системные вызовы read() и write() блокируются, если они конфликтуют с уже установленными блокировками. Если процесс пытается осуществить запись в часть файла, на которой имеется блокировка чтения или записи от другого процесса, первый процесс блокируется до тех пор, пока существующая блокировка не будет снята. Подобным же образом вызовы read() блокируются на областях, включенных в обязательные блокировки записи.
Обязательное блокирование записи приводит к большей потере производительности, чем рекомендательное блокирование, поскольку каждый вызов read() и write() должен быть проверен на предмет конфликтов с блокировками. Оно также не настолько переносимо, как рекомендательное блокирование POSIX, поэтому в большинстве приложений обязательное блокирование применять не следует.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Блокировки
Блокировки Теперь давайте рассмотрим более сложный пример конкуренции за ресурсы, который требует более сложного решения. Допустим, что у нас есть очередь запросов, которые должны быть обработаны. Как реализована очередь — не существенно, но мы будем считать, что это —
Спин-блокировки
Спин-блокировки Было бы очень хорошо, если бы все критические участки были такие же простые, как инкремент или декремент переменной, однако в жизни все более серьезно. В реальной жизни критические участки могут включать в себя несколько вызовов функций. Например, очень
Секвентные блокировки
Секвентные блокировки Секвентная блокировка (seq lock) — это новый тип блокировки, который появился в ядрах серии 2.6. Эти блокировки предоставляют очень простой механизм чтения и записи совместно используемых данных. Работа таких блокировок основана на счетчике
Ждущие блокировки
Ждущие блокировки Другая типовая ситуация в многопоточных программах — это потребность заставить поток «ждать чего-либо». Этим «чем- либо» может являться фактически что угодно! Например, когда доступны данные от устройства, или когда конвейерная лента находится в
Операции блокировки
Операции блокировки Для семафора определены три модификации операции блокировки:int sem_wait(sem_t* sem);int sem_trywait(sem_t* sem);#include <time.h>int sem_timedwait(sem_t* sem, const struct timespec * abs_timeout);Все эти функции опираются на функцию (native QNX API):int SyncSemWait(sync_t* sync, int try);Функция простого ожидания sem_wait() пытается
Освобождение блокировки
Освобождение блокировки int pthread_rwlock_unlock(pthread_rwlock_t* rwl);Функция освобождает захваченный любым образом объект блокировки чтения/записи. Если объект был захвачен в режиме множественного использования (блокировки по чтению), то количество его освобождений должно равняться
6.2.1. Обязательные типы POSIX
6.2.1. Обязательные типы POSIX POSIX описывает некоторые определения типов в заголовочном файле <sys/types.h>, которые используются для многих аргументов и возвращаемых значений. Эти определения типов важны, потому что стандартные типы языка С могут быть разными на различных
Обязательные теги
Обязательные теги Все HTML-документы имеют одну и ту же структуру, основу которой составляют обязательные теги. Откройте Блокнот и введите следующий текст: <HTML> <TITLE> Пример простейшего HTML-документа </TITLE> <B0DY> Добро пожаловать на мою первую веб-страницу
Обязательные реквизиты бланка
Обязательные реквизиты бланка Бланки в зависимости от расположения реквизитов могут быть угловыми или продольными.Реквизит 01 (02 или 03) располагают над серединой реквизита 08. Реквизит 03 допускается располагать на уровне реквизита 08.Реквизиты 08, 09, 10, 14, ограничительные
7.5.4. Блокировки
7.5.4. Блокировки В файле /proc/locks перечислены все блокировки файлов, установленные в настоящий момент в системе. Каждая строка соответствует одной блокировке.Для блокировок, созданных функцией fcntl() (описана в разделе 8.3. "Функция fcntl(): блокировки и другие операции над
Обязательные отношения
Обязательные отношения Обязательное отношение - это отношение, которое требует существования как минимум одной дочерней строки для каждой родительской строки. Например, структура накладной (заголовок с информацией о покупателе и адресом поставки) будет нелогичной,
Конфликты блокировки
Конфликты блокировки Конфликт блокировки появляется, когда конкурирующие транзакции пытаются изменить или удалить одну и ту же строку в то время, когда вид состояния базы данных для этих транзакций частично перекрывается. Конфликты блокировок являются запланированным