Завершение процесса, заблокировавшего ресурс

Завершение процесса, заблокировавшего ресурс

Когда взаимное исключение используется совместно несколькими процессами, всегда существует возможность, что процесс будет завершен (возможно, принудительно) во время работы с заблокированным им ресурсом. Не существует способа заставить систему автоматически снимать блокировку во время завершения процесса. Мы увидим, что это свойственно и блокировкам чтения-записи, и семафорам Posix. Единственный тип блокировок, автоматически снимаемых системой при завершении процесса, — блокировки записей fcntl (глава 9). При использовании семафоров System V можно специально указать ядру, следует ли автоматически снимать блокировки при завершении работы процесса (функция SEM_UNDO, о которой будет говориться в разделе 11.3).

Поток также может быть завершен в момент работы с заблокированным ресурсом, если его выполнение отменит (cancel) другой поток или он сам вызовет pthread_exit. Последнему варианту не следует уделять много внимания, поскольку поток должен сам знать, блокирует ли он взаимное исключение в данный момент или нет, и в зависимости от этого вызывать pthread_exit. На случай отмены другим потоком можно предусмотреть обработчик сигнала, вызываемый при отмене потока, что продемонстрировано в разделе 8.5. Если же для потока возникают фатальные условия, это обычно приводит к завершению работы всего процесса. Например, если поток делает некорректную операцию с указателем, что приводит к отправке сигнала SIGSEGV, это приводит к остановке всего процесса, если сигнал не перехватывается, и мы возвращаемся к предыдущей ситуации с гибелью процесса, заблокировавшего ресурс.

Даже если бы система автоматически разблокировала ресурсы после завершения процесса, это не всегда решало бы проблему. Блокировка защищала критическую область, в которой, возможно, изменялись какие-то данные. Если процесс был завершен посреди этой области, что стало с данными? Велика вероятность того, что возникнут несоответствия, если, например, новый элемент будет не полностью добавлен в связный список. Если бы ядро просто разблокировало взаимное исключение при завершении процесса, следующий процесс, обратившийся к списку, обнаружил бы, что тот поврежден.

В некоторых случаях автоматическое снятие блокировки (или счетчика — для семафора) при завершении процесса не вызывает проблем. Например, сервер может использовать семафор System V (с функцией SEM_UNDO) для подсчета количества одновременно обслуживаемых клиентов. Каждый раз при порождении процесса вызовом fork он увеличивает значение семафора на единицу, уменьшая его при завершении работы дочернего процесса. Если дочерний процесс завершит работу досрочно, ядро само уменьшит значение семафора. Пример, в котором автоматическое снятие блокировки ядром (а не уменьшение счетчика, как в вышеописанной ситуации) также не вызывает проблем, приведен в разделе 9.7. Демон блокирует один из файлов данных при записи в него и не снимает эту блокировку до завершения работы. Если кто-то попробует запустить копию демона, она завершит работу досрочно, когда обнаружит наличие блокировки на запись. Это гарантирует работу единственного экземпляра демона. Если же демон досрочно завершит работу, ядро само снимет блокировку, что позволит запустить копию демона.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

ОКНО ДИАЛОГА: Запасной ресурс

Из книги Журнал «Компьютерра» № 22 от 13 июня 2006 года автора Журнал «Компьютерра»

ОКНО ДИАЛОГА: Запасной ресурс Автор: Константин КурбатовНовенький наемный «мерседес» увозит ранним утром директора одной из западных компаний на работу — это аутсорсинг. Большая, совсем не ароматная машина, заезжающая во дворик забирать мусор, — это тоже аутсорсинг. И


Завершение процесса с помощью команды KILL

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

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


Завершение и прекращение выполнения процесса

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Завершение и прекращение выполнения процесса После того как процесс завершил свою работу, он, или, точнее, выполняющийся в этом процессе поток, может вызвать функцию ExitProcess, указав в качестве параметра кодом завершения (exit code): VOID ExitProcess(UINT uExitCode)  Эта функция не


Информация как новый ресурс

Из книги Внедрение SAP R/3: Руководство для менеджеров и инженеров автора Кале Вивек

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


Внешний ресурс

Из книги Интерактивные доски и их использование в учебном процессе автора Горюнова М. А.

Внешний ресурс Функция Внешний ресурс позволяет добавить на слайды презентации иллюстрации, хранящиеся в специальной папке программы Flow!Works, которая представляет собой библиотеку изображений. Библиотека содержит иллюстрации, объединенные общей тематикой в папки,


Завершение процесса

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

Завершение процесса С завершением процесса дело обстоит достаточно просто, по крайней мере, в сравнении с тем, что происходит при завершении потока, как это и будет показано очень скоро. Процесс завершается, если программа выполняет вызов exit() или выполнение просто


Главный ресурс

Из книги Знакомьтесь, информационные технологии автора Воловник Аркадий Авральевич

Главный ресурс Государства рождаются, развиваются, умирают. Почему? Что является причиной, стимулом развития и смерти государств? Только ли пассионарность населения? Всегда можно выделить основной ресурс, который определяет развитие государства. По мере накопления


9.1.5. Завершение процесса

Из книги Linux программирование в примерах автора Роббинс Арнольд

9.1.5. Завершение процесса Завершение процесса включает два шага: окончание процесса с передачей системе статуса завершения и восстановление информации родительским


Создание, завершение и просмотр учетной записи процесса

Из книги Недокументированные и малоизвестные возможности Windows XP автора Клименко Роман Александрович

Создание, завершение и просмотр учетной записи процесса К другим основным возможностям инструментария управления WMI относятся возможности работы с процессами, запущенными на удаленном или локальном компьютере. При этом инструментарий предоставляет возможности не


3.4. Завершение процесса

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

3.4. Завершение процесса Обычно процесс завершается одним из двух способов: либо выполняющаяся программа вызывает функцию exit(), либо функция main() заканчивается. У каждого процесса есть код завершения — число, возвращаемое родительскому процессу. Этот код передается в


Информация как ключевой ресурс 

Из книги Реконизм. Как информационные технологии делают репутацию сильнее власти, а открытость — безопаснее приватности автора Сименко Илья Александрович


Завершение выполнения процесса

Из книги Операционная система UNIX автора Робачевский Андрей М.

Завершение выполнения процесса Процесс завершает свое выполнение с помощью функции exit(). Эта функция может быть вызвана системным вызовом exit(2), а если завершение процесса вызвано получением сигнала, функцию exit() вызывает само ядро. Функция exit() выполняет следующие


5.12. Завершение процесса сервера

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

5.12. Завершение процесса сервера Теперь мы запустим соединение клиент-сервер и уничтожим дочерний процесс сервера. Это симулирует сбой процесса сервера, благодаря чему мы сможем выяснить, что происходит с клиентом в подобных ситуациях. (Следует точно различать сбой


Интернет-ресурс

Из книги Разработка ядра Linux автора Лав Роберт

Интернет-ресурс Автор поддерживает Интернет-сайт http://tech9.net/rml/kernel_book/, содержащий информацию о данной книге, включая ошибки, расширенные и исправленные разделы, а также информацию о будущих изданиях. Всем читателям рекомендуется посетить этот


Завершение процесса

Из книги автора

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