Линукс освобождает спин-блокировку / семафор, когда он убивает процесс? - PullRequest
6 голосов
/ 19 марта 2012

Если процесс удерживает некоторые спин-блокировки или семафоры и неожиданно завершает работу (например, уничтожен linux), будет ли linux правильно снимать эти блокировки? Если Linux не выполняет эту работу, почему?

1 Ответ

10 голосов
/ 25 марта 2012

Это зависит от типа блокировки, о которой вы говорите.

Если вы говорите о каких-либо внутренних блокировках ядра, они будут сняты соответствующим образом (в противном случае ваша система вскоре может аварийно завершить работу). Как правило, блокировки такого типа принадлежат не самому процессу, а некоторым внутренним рабочим процессам ядра и обычно не остаются заблокированными после того, как процесс все равно возвращается в пользовательское пространство.

Обратите внимание, однако, что если ядро ​​ уже заблокировано при выполнении команды kill, скорее всего, процесс не будет уничтожен. Завершение процесса выполняется как часть пути обработки сигнала, который вызывается из кода перехода возврата из ядра в пользовательское пространство. Если процесс ожидает спин-блокировки ядра, вы никогда не доберетесь до кода возврата, поэтому процесс не завершится.

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

Если вы говорите о любом виде спин-блокировки или семафора в пользовательском пространстве (включая семафоры IPC sem_*), то нет, они не будут выпущены, так как нет концепции владения блокировкой с семафором.

Если вы говорите о семействе файловых блокировок flock или консультативных блокировках fcntl(F_SETLK, ...), они будут автоматически разблокированы, когда любая дескриптор файла, связанный с файлом в этом процессе, закрыт. Из-за этого flock является плохой идеей для использования в большинстве случаев, но да, он будет освобожден, если процесс будет убит.

Если вы говорите о локальном процессе pthread_mutex, это спорный вопрос, потому что мьютекс перестанет существовать вместе с процессом.

Если вы говорите о разделяемом pthread_mutex в сегменте совместно используемой памяти (в котором pthread_mutexattr_setpshared был использован для обеспечения общего доступа), он будет автоматически освобожден, только если он также помечен как надежный мьютекс, с pthread_mutexattr_setrobust - но он должен быть помечен как непротиворечивый перед повторным использованием; Подробнее см. справочную страницу pthread_mutex_consistent.

...