Mutex反発ロック

2092 ワード

本文はブロガーのオリジナル文章で、ブロガーの許可を得ずに転載してはならない.https://blog.csdn.net/huangweiqing80/article/details/83060119
1、反発ロックの理解?
反発ロックの使用もカーネル臨界領域の同期を保つものであり、反発ロックは信号量に由来すると言える.信号量設定カウンタはn個のプロセスが同時に臨界領域にアクセスすることを許容することができるが、反発ロックはできず、毎回1個のプロセスアクセス、すなわちカウンタ値が1の信号量しか許容できないことは理解できる.反発ロックとスピンロックは異なり(明らかに)、反発ロックは、プロセスコンテキストまたはソフトブレークコンテキストでのみ使用できるため、ブレークダウンハンドラおよび遅延可能関数では使用できません.
struct mutex {/* 1: unlocked, 0: locked, negative: locked, possible waiters */atomic_t count; spinlock_t wait_lock; struct list_head wait_list; };
struct mutexメンバーの意味を説明します:count:countは原子変数です(原子変数について分からないので、前の原子変数の文章を見ることができます).count=1がリソースの使用可能を表し、0がリソースの使用不可を表し、ロック状態を表します.負の値は待機者を表します.wait_lock:wait_に使用されるスピンロック変数です.Listの操作は原子変数wait_に変わりますList:mutexを取得するプロセスを管理し、反発ロックを取得できない場合はwait_にスレッドを入れます.Listキューで、スレッドをスリープさせます.wait_Listは待機キューのチェーンヘッダであり、このチェーンテーブルは、反発ロックを待機するすべてのプロセスを1つのチェーンテーブル構造に構成します.このチェーンテーブルには、睡眠中のプロセスチェーンテーブルが格納されています.カーネルは、反発ロックの待機キュー構造体を定義します.
struct mutex_waiter {
	struct list_head	list;
	struct task_struct	*task;
#ifdef CONFIG_DEBUG_MUTEXES
	void			*magic;
#ifdef CONFIG_MT_DEBUG_MUTEXES
	struct task_struct	*task_wait_on;
#endif
#endif
};

Mutex(反発ロック)