nignx下自旋鎖原始碼分析

2021-08-27 17:23:09 字數 1265 閱讀 1610

nginx_spinlock.c

/* */

#include #include //函式:基於原子操作的自旋鎖方法ngx_spinlock的實現

//引數解釋:

//lock:原子變數表達的鎖

//value:標誌位,鎖是否被某一程序占用

//spin:在多處理器系統內,當ngx_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();

} #else

#if (ngx_threads)

#error ngx_spinlock() or ngx_atomic_cmp_set() are not defined !

#endif

#endif

}

自旋鎖是一種非睡眠鎖。如果某程序檢視獲得自旋鎖,當發現鎖已經被其他程序獲得時,那麼不會使得當前程序進入睡眠狀態,而是始終保持程序在可執行狀態,每當核心排程到這個程序執行時就持續檢查是否可以獲取到所鎖。

自旋鎖主要是為多處理器作業系統而設定的,他要解決的共享資源保護場景就是程序使用鎖的時間非常短(如果鎖的使用時間很久,自旋鎖不合適,因為會占用大量的cpu資源)。大部分情況下nginx的worker程序最好都不要進入睡眠狀態,因為它非常繁忙,在這個程序的epoll上可能有十萬甚至百萬的tcp連線等待著處理,程序一旦睡眠後必須等待其他事件的喚醒,這中間及其頻繁的程序間切換帶來的負載消耗可能無法讓使用者接受。

函式ngx_cpu_pause():是虛度哦架構體系中專門為了自旋鎖而提供的指令,它會告訴cpu現在處於自旋鎖等待狀態,通常乙個cpu會將自己置於節能狀態,降低功耗。但是當前程序並沒有讓出正在使用的處理器。函式ngx_sched_yield():當前程序仍仍然處於可執行狀態,但暫時讓出處理器,使得處理器優先排程其他可執行狀態的程序,這樣,在程序被核心再次排程時,在for迴圈**中可以期望其他程序釋放鎖。

nignx下自旋鎖原始碼分析

nginx spinlock.c include include 函式 基於原子操作的自旋鎖方法ngx spinlock的實現 引數解釋 lock 原子變數表達的鎖 value 標誌位,鎖是否被某一程序占用 spin 在多處理器系統內,當ngx spinlock方法沒有拿到鎖時,當前程序在核心的一次...

ReentranLock重入鎖原始碼分析

今天來分析一下重入鎖的原始碼 重入鎖reentranlock是一種支援重進入的鎖,表示該鎖可以支援乙個執行緒對資源重複加鎖,並且分為公平鎖和非公平鎖 synchronized大家一定都很熟悉了,這也是一種隱式的重入鎖,是一種非公平鎖 當執行緒再次獲取鎖時,鎖需要先判斷該執行緒是否為當前佔據鎖的執行緒...

可重入鎖原始碼分析

reentrantlock實現了lock,初始化時可選擇fairsync nonfairsync。sync繼承了abstractqueuedsynchronizer。abstractqueuedsynchronizer的state 0表示未持有鎖 1表示持有鎖 1表示鎖被重入。abstractque...