nginx的spinlock的學習

2021-08-10 22:56:13 字數 689 閱讀 5523

在nginx中,廣泛使用了cas來進行各個執行緒,各個程序的同步訪問,而單獨用cas並不能最優的實現同步的功能,需要封裝乙個更合理的設計。

那麼spinlock就設計出來了,採用了大部分使用者態,偶爾核心態的方法,對頻繁訪問的資料進行了鎖操作。

void

ngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin)

if (ngx_ncpu > 1)

if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, value)) }}

ngx_sched_yield();

}}

在spinlock中,第一次的ngx_atomic_cmp_set是單純獲取鎖。

發現是多核cpu,ngx_ncpu > 1,則在使用者態多等等。其中spin是設定的等待次數,ngx_cpu_pause是讓cpu進行pause一下,即在使用者態的可控的usleep。

如果是單核cpu,則直接ngx_sched_yield,讓出cpu進入核心態,短暫的睡眠(sched_yield或者usleep)使執行緒後台執行,然後再在for(;;)中進行迴圈獲取lock。這與mutex長期處於核心態sleep等待futex不同,spinlock的喚醒是主動的進入使用者態,而不是像mutex那樣被動的等待喚醒。

spinlock的設計和實現

在linux的核心中,spin lock用在多處理器環境中。當乙個cpu訪問乙個臨界資源 critical section 的時候,需要預先取得spin lock,如果取不到的話,它就在空迴圈 等待,直到另外的cpu釋放spin lock。由於涉及到多個處理器,spin lock的效率非常重要。因為...

mutex和spin lock的區別

mutex和spin lock的區別和應用 sleep waiting和busy waiting的區別 2011 10 19 11 43 訊號量mutex是sleep waiting。就是說當沒有獲得mutex時,會有上下文切換,將自己 加到忙等待佇列中,直到另外乙個執行緒釋放mutex並喚醒它,而...

mutex 和spin lock的區別

在這裡推薦一本書 深入linux核心機制分析 這本書對這些講得非常好,對有基礎的朋友幫助會很大,新手建議不好要使用,因為有一種雲裡霧裡的感覺,非常的枯燥。有哪些核心鎖機制?1 原子操作 atomic t資料型別,atomic inc atomic t v 將v加1 原子操作比普通操作效率要低,因此必...