最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談nginx讀寫鎖的實現(xiàn)邏輯

 更新時間:2024年05月31日 09:33:15   作者:碼農(nóng)心語  
本文主要介紹了淺談nginx讀寫鎖的實現(xiàn)邏輯,是通過自旋鎖來實現(xiàn)的,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

我們一般認(rèn)為nginx是一個多進(jìn)程單線程的應(yīng)用服務(wù),雖然nginx在一個worker進(jìn)程內(nèi)是沒有數(shù)據(jù)競爭問題的(因為是單線程),但是不免nginx在多個進(jìn)程間還有一些需要共享的數(shù)據(jù),譬如ngx_http_upstream_zone_module模塊將peers數(shù)據(jù)放在了共享內(nèi)存中供多個worker進(jìn)程來使用,又譬如ngx_http_limit_conn_module模塊將并發(fā)連接數(shù)限制也放在了共享內(nèi)存中,諸如此類的,自然會涉及到共享內(nèi)存訪問的互斥鎖的問題,本文對nginx實現(xiàn)的互斥鎖進(jìn)行分析,通過分析學(xué)習(xí)nginx的實現(xiàn)代碼,以便將來可以應(yīng)用到自己的日常應(yīng)用程序中去。

nginx的讀寫鎖實現(xiàn)邏輯是通過自旋鎖來實現(xiàn)的。

nginx一共實現(xiàn)了以下幾個api函數(shù):

void ngx_rwlock_wlock(ngx_atomic_t *lock);
void ngx_rwlock_rlock(ngx_atomic_t *lock);
void ngx_rwlock_unlock(ngx_atomic_t *lock);
void ngx_rwlock_downgrade(ngx_atomic_t *lock);

ngx_rwlock_wlock用來加寫鎖,ngx_rwlock_rlock用來加讀鎖,ngx_rwlock_unlock用來對加的鎖進(jìn)行釋放,ngx_rwlock_downgrade對寫鎖進(jìn)行降級為讀鎖。

鎖變量是ngx_atomic_t類型,對應(yīng)的就是一個unsigned long的類型。

以下是ngx_rwlock_wlock的實現(xiàn)代碼:

void
ngx_rwlock_wlock(ngx_atomic_t *lock)
{
    ngx_uint_t  i, n;

    for ( ;; ) {
		/* 如果*lock的值是0表示現(xiàn)在沒有加任何讀寫鎖
		   ngx_atomic_cmp_set比較如果是lock是0,則將其設(shè)置為NGX_RWLOCK_WLOCK
		   表示加鎖成功,可以返回了
		*/
        if (*lock == 0 && ngx_atomic_cmp_set(lock, 0, NGX_RWLOCK_WLOCK)) {
            return;
        }

        
        if (ngx_ncpu > 1) {
        
			/* 對于多cpu的情況需要進(jìn)行自旋加鎖檢測 */
            for (n = 1; n < NGX_RWLOCK_SPIN; n <<= 1) {

                for (i = 0; i < n; i++) {
                    ngx_cpu_pause();
                }

                if (*lock == 0
                    && ngx_atomic_cmp_set(lock, 0, NGX_RWLOCK_WLOCK))
                {
                    return;
                }
            }
        }

		/* 通知os將自己切出,調(diào)度到其他進(jìn)程 */
        ngx_sched_yield();
    }
}

以下是ngx_rwlock_rlock的實現(xiàn)代碼:

void
ngx_rwlock_rlock(ngx_atomic_t *lock)
{
    ngx_uint_t         i, n;
    ngx_atomic_uint_t  readers;

    for ( ;; ) {
        readers = *lock;
		
		/* 如果*lock的值不是NGX_RWLOCK_WLOCK表示現(xiàn)在沒有加寫鎖,則可以嘗試獲取讀鎖,
		   ngx_atomic_cmp_set比較如果是lock和之前保存的readers一致,
		   則將其設(shè)置為readers+1,表示加鎖成功,可以返回了
		*/
		
        if (readers != NGX_RWLOCK_WLOCK
            && ngx_atomic_cmp_set(lock, readers, readers + 1))
        {
            return;
        }

        if (ngx_ncpu > 1) {
            /* 對于多cpu的情況需要進(jìn)行自旋加鎖檢測 */
            for (n = 1; n < NGX_RWLOCK_SPIN; n <<= 1) {

                for (i = 0; i < n; i++) {
                    ngx_cpu_pause();
                }

                readers = *lock;

                if (readers != NGX_RWLOCK_WLOCK
                    && ngx_atomic_cmp_set(lock, readers, readers + 1))
                {
                    return;
                }
            }
        }
         /* 通知os將自己切出,調(diào)度到其他進(jìn)程 */
        ngx_sched_yield();
    }
}

以下是ngx_rwlock_unlock的實現(xiàn)代碼:

void
ngx_rwlock_unlock(ngx_atomic_t *lock)
{
    if (*lock == NGX_RWLOCK_WLOCK) {
        /* 如果是寫鎖定了,那么將*lock置為0,表示沒有加任何鎖了*/
        (void) ngx_atomic_cmp_set(lock, NGX_RWLOCK_WLOCK, 0);
    } else {
        /*如果當(dāng)前是讀鎖定了,那么只是將*lock-1,表示少了一個讀者 */
        (void) ngx_atomic_fetch_add(lock, -1);
    }
}

以下是ngx_rwlock_downgrade的實現(xiàn)代碼:

void
ngx_rwlock_downgrade(ngx_atomic_t *lock)
{
	/* 如果當(dāng)前是加上了寫鎖的,因為肯定沒有讀者,將自己變?yōu)樽x者,所以只有1個讀者,
	   因此將*lock設(shè)置為1
	*/
    if (*lock == NGX_RWLOCK_WLOCK) {
        *lock = 1;
    }
}

到此這篇關(guān)于淺談nginx讀寫鎖的實現(xiàn)邏輯的文章就介紹到這了,更多相關(guān)nginx讀寫鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • nginx的master進(jìn)程和worker進(jìn)程用法解讀

    nginx的master進(jìn)程和worker進(jìn)程用法解讀

    Nginx啟動后包含master和worker進(jìn)程,master負(fù)責(zé)管理worker及讀取配置,worker處理請求,通過worker_processes設(shè)置worker數(shù)量(通常不超過CPU核心數(shù))或auto自動檢測,結(jié)合worker_cpu_affinity綁定CPU核心以優(yōu)化性能
    2025-07-07
  • Nginx的版本平滑升級和回退的實現(xiàn)

    Nginx的版本平滑升級和回退的實現(xiàn)

    有時候我們需要對Nginx版本進(jìn)行升級以滿足對其功能的需求,而此時 Nginx又在跑著業(yè)務(wù)無法停掉,這時我們就可能選擇平滑升級平滑升級,本文就來詳細(xì)的介紹一下Nginx的版本平滑升級和回退的實現(xiàn),感興趣的可以了解一下
    2026-05-05
  • 詳解Nginx進(jìn)行TCP代理配置的詳細(xì)指南

    詳解Nginx進(jìn)行TCP代理配置的詳細(xì)指南

    Nginx 是一個高性能的 HTTP 和反向代理服務(wù)器,它也支持 TCP/UDP 的負(fù)載均衡,本文將介紹如何配置 Nginx 作為 TCP 代理,需要的可以了解下
    2025-07-07
  • shell腳本定時統(tǒng)計Nginx下access.log的PV并發(fā)送給API保存到數(shù)據(jù)庫

    shell腳本定時統(tǒng)計Nginx下access.log的PV并發(fā)送給API保存到數(shù)據(jù)庫

    這篇文章主要介紹了shell腳本定時統(tǒng)計Nginx下access.log的PV并發(fā)送給API保存到數(shù)據(jù)庫的實現(xiàn)方法 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • 為Nginx自定義404,502錯誤頁面的方法

    為Nginx自定義404,502錯誤頁面的方法

    為Nginx自定義404,502錯誤頁面的方法,需要的朋友可以參考下。
    2010-12-12
  • Nginx與后臺應(yīng)用端口沖突的解決方案

    Nginx與后臺應(yīng)用端口沖突的解決方案

    在部署Web應(yīng)用時,Nginx和后臺應(yīng)用(如Node.js、Python Flask、Java Spring Boot等)常常需要同時運(yùn)行在一臺服務(wù)器上,然而,當(dāng)它們需要監(jiān)聽同一個端口(如8000)時,就會出現(xiàn)端口沖突的問題,本文將詳細(xì)介紹幾種解決Nginx與后臺應(yīng)用端口沖突的方法
    2025-02-02
  • Nginx 動態(tài)域名解析過程詳解

    Nginx 動態(tài)域名解析過程詳解

    這篇文章主要為大家介紹了Nginx 動態(tài)域名解析過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Nginx配置系統(tǒng)服務(wù)&設(shè)置環(huán)境變量方式

    Nginx配置系統(tǒng)服務(wù)&設(shè)置環(huán)境變量方式

    本文介紹了如何將Nginx配置為系統(tǒng)服務(wù)并設(shè)置環(huán)境變量,以便更方便地對Nginx進(jìn)行操作,通過配置系統(tǒng)服務(wù),可以使用系統(tǒng)命令來啟動、停止或重新加載Nginx,并通過設(shè)置環(huán)境變量可以簡化執(zhí)行其他命令的操作步驟
    2025-03-03
  • Nginx中include的具體用法

    Nginx中include的具體用法

    本文主要介紹了Nginx中include的具體用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Nginx配置終極版指南(全網(wǎng)最詳細(xì))

    Nginx配置終極版指南(全網(wǎng)最詳細(xì))

    對于前端項目來說,nginx是必須了解和熟悉的,本文對nginx整體的概念進(jìn)行了重新梳理,同時幫讀者理清nginx配置思路,文中通過代碼示例和圖文講解的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2024-11-11

最新評論

满洲里市| 靖宇县| 珠海市| 高青县| 宁晋县| 新干县| 宁都县| 塔河县| 抚顺市| 福海县| 虎林市| 邯郸市| 宜宾县| 集贤县| 噶尔县| 安顺市| 舒兰市| 旬邑县| 新昌县| 安多县| 五指山市| 石阡县| 山阴县| 潮安县| 江津市| 新乐市| 赣州市| 尼木县| 余江县| 平江县| 乡城县| 八宿县| 尉犁县| 丰城市| 兖州市| 如东县| 岱山县| 尤溪县| 周宁县| 华蓥市| 类乌齐县|