看了看linux 2.6 kernel的原始碼,下面結合**來分析一下在x86體系結構下,互斥鎖的實現原理。
**分析
1. 首先介紹一下互斥鎖所使用的資料結構:
struct mutex ;
2. 互斥鎖加鎖函式
void inline __sched mutex_lock(struct mutex *lock)
呼叫了巨集:
__mutex_fastpath_lock(&lock->count, __mutex_lock_slowpath);
巨集的定義:
將mutex資料結構中,引用計數器減1,如果不為負數就返回,
如果為負數,需要呼叫函式:__mutex_lock_slowpath,接下來我們再來
分析這個函式,我們先來分析一下這個巨集。
#define __mutex_fastpath_lock(count, fail_fn) /
do while (0)
3. **函式
static noinline int __sched __mutex_lock_killable_slowpath(atomic_t *lock_count)
4. 阻塞進**正獲取鎖的地方
static inline int __sched
__mutex_lock_common(struct mutex *lock, long state, unsigned int subclass,
unsigned long ip)
__set_task_state(task, state);
如果還不能獲取所,則將自旋鎖解除,當從schedule返回時再次獲取自旋鎖,
重複如上操作。
spin_unlock_mutex(&lock->wait_lock, flags);
schedule();
spin_lock_mutex(&lock->wait_lock, flags);
}表示已經獲取了鎖
done:
lock_acquired(&lock->dep_map);
將該任務從等待佇列中刪除
mutex_remove_waiter(lock, &waiter, task_thread_info(task));
debug_mutex_set_owner(lock, task_thread_info(task));
如果等待隊列為空將lock->count置為0
if (likely(list_empty(&lock->wait_list)))
atomic_set(&lock->count, 0);
spin_unlock_mutex(&lock->wait_lock, flags);
debug_mutex_free_waiter(&waiter);
return 0;
}5. 解鎖過程
void __sched mutex_unlock(struct mutex *lock)
該巨集是對引用計數器實行加1操作,如果加後小於等於0,說明該等待佇列
上還有任務需要獲取鎖。呼叫__mutex_unlock_slowpath函式。
#define __mutex_fastpath_unlock(count, fail_fn) /
do while (0)
該函式呼叫了__mutex_unlock_slowpath函式。
static noinline void
__mutex_unlock_slowpath(atomic_t *lock_count)
static inline void
__mutex_unlock_common_slowpath(atomic_t *lock_count, int nested)
debug_mutex_clear_owner(lock);
spin_unlock_mutex(&lock->wait_lock, flags);
}總結:互斥鎖的實現,實際上就是一把鎖維護了乙個等待佇列和乙個引用計數器,當獲取鎖
之前,先對引用計數器減1操作,如果為非負,則可以獲取鎖進入臨界區。否則需要將該任務
掛在該等待對列上。
Linux2 6執行緒模型NPTL實現
全選 937 struct task struct pid,從字面上是process id,但其實是thread id。tgid,從字面上,應該是thread group id,也就是真正的process id。這一點,可以從系統呼叫getpid和gettid中看出來 位於kernel timer....
Linux2 6核心實現的是NPTL
nptl是乙個1 1的執行緒模型,即乙個執行緒對於乙個作業系統的排程程序,優點是非常簡單。而其他一些作業系統比如solaris則是mxn的,m對應建立的執行緒數,n對應作業系統可以執行的實體。n轉 全選 937 struct task struct pid,從字面上是process id,但其實是t...
Linux 互斥鎖的實現
一 互斥鎖的作用 執行緒可以在自己的棧空間內使用自己內部的變數,當執行緒想使用乙個在堆上開闢的全域性變數時,其他執行緒也是可以看到這個全域性變數,為了保護這個臨界區,引入了互斥鎖 mutex 實現執行緒的互斥與同步。二 互斥鎖的實現 1.不引入互斥鎖 用兩個執行緒來對乙個全域性變數實現累加5000次...