linux 2 6 互斥鎖的實現 原始碼分析

2021-04-30 08:43:21 字數 2069 閱讀 7636

看了看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次...