プロセスがいくつかのスピンロックまたはセマフォを保持していて、誤って終了した場合(たとえば、Linuxによって強制終了された場合)、Linuxはこれらのロックを正しく解放しますか?Linuxがこの機能を果たさないのなら、なぜですか?
1 に答える
話しているロックの種類によって異なります。
何らかの種類のカーネル内部ロックについて話している場合は、必要に応じて解放されます (そうしないとシステムがすぐにクラッシュするため)。一般に、この種のロックはプロセス自体ではなく、内部のカーネル ワークフローによって所有され、プロセスがユーザー空間に戻った後も通常はロックされたままになりません。
ただし、kill を発行したときにカーネルがすでにデッドロックしている場合は、プロセスが強制終了されない可能性があることに注意してください。プロセスの強制終了は、カーネルからユーザー空間への戻り遷移コードから呼び出されるシグナル処理パスの一部として実行されます。プロセスがカーネル スピンロックを待機している場合、リターン コードにたどり着けないため、プロセスは終了しません。
さらに、カーネルの OOPS が原因でプロセスが強制終了された場合、すべての賭けはオフになります。カーネルはすでに矛盾した状態にあり、OOPS 終了コードは、カーネル スレッドが行った可能性のあるロックをクリーンアップしようとはしません。時の保持。
ユーザー空間のスピンロックまたはセマフォ ( sem_*
IPC セマフォのファミリを含む) について話している場合、セマフォにはロック所有権の概念がないため、それらは解放されません。
flock
ファイル ロックのファミリまたはアドバイザリ ロックについて話している場合、そのプロセスでファイルにバインドされているファイル記述子が閉じられるとfcntl(F_SETLK, ...)
、それらは自動的に解放されます。このため、ほとんどの場合、 を使用するのはお勧めできませんが、プロセスが強制終了された場合は解放されます。flock
process-local について話している場合pthread_mutex
、ミューテックスはプロセスとともに存在しなくなるため、それは意味がありません。
pthread_mutex
共有メモリ セグメント (共有可能にするために使用されているもの) で共有されているものについて話しpthread_mutexattr_setpshared
ている場合、堅牢なミューテックスとしてもマークされている場合にのみ自動解放されpthread_mutexattr_setrobust
ます。再利用; 詳細については、pthread_mutex_consistent
マンページを参照してください。