亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談nginx讀寫鎖的實現邏輯

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

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

nginx的讀寫鎖實現邏輯是通過自旋鎖來實現的。

nginx一共實現了以下幾個api函數:

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用來對加的鎖進行釋放,ngx_rwlock_downgrade對寫鎖進行降級為讀鎖。

鎖變量是ngx_atomic_t類型,對應的就是一個unsigned long的類型。

以下是ngx_rwlock_wlock的實現代碼:

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

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

        
        if (ngx_ncpu > 1) {
        
			/* 對于多cpu的情況需要進行自旋加鎖檢測 */
            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將自己切出,調度到其他進程 */
        ngx_sched_yield();
    }
}

以下是ngx_rwlock_rlock的實現代碼:

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表示現在沒有加寫鎖,則可以嘗試獲取讀鎖,
		   ngx_atomic_cmp_set比較如果是lock和之前保存的readers一致,
		   則將其設置為readers+1,表示加鎖成功,可以返回了
		*/
		
        if (readers != NGX_RWLOCK_WLOCK
            && ngx_atomic_cmp_set(lock, readers, readers + 1))
        {
            return;
        }

        if (ngx_ncpu > 1) {
            /* 對于多cpu的情況需要進行自旋加鎖檢測 */
            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將自己切出,調度到其他進程 */
        ngx_sched_yield();
    }
}

以下是ngx_rwlock_unlock的實現代碼:

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 {
        /*如果當前是讀鎖定了,那么只是將*lock-1,表示少了一個讀者 */
        (void) ngx_atomic_fetch_add(lock, -1);
    }
}

以下是ngx_rwlock_downgrade的實現代碼:

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

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

相關文章

  • 教你如何快速搭建和配置 Nginx 服務器

    教你如何快速搭建和配置 Nginx 服務器

    Nginx 是一個高性能的 HTTP 和反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器,本文將詳細介紹如何在 Linux 上安裝、配置和管理 Nginx 服務器,感興趣的朋友一起看看吧
    2024-07-07
  • Nginx整合Kafka的方法示例

    Nginx整合Kafka的方法示例

    這篇文章主要介紹了Nginx整合Kafka的方法示例,nginx整合kafak后,可以將nginx中的數據,直接保存到kafka中,感興趣的小伙伴們可以參考一下
    2018-10-10
  • WordPress中開啟多站點支持及Nginx的重寫規(guī)則配置

    WordPress中開啟多站點支持及Nginx的重寫規(guī)則配置

    這篇文章主要介紹了WordPress中開啟多站點支持及Nginx的重寫規(guī)則配置方法,在同一個WordPress軟件中開啟的多個站點如果需要綁定不同域名的話也可以使用WordPress MU Domain Mapping插件,需要的朋友可以參考下
    2016-03-03
  • Nginx跨域設置Access-Control-Allow-Origin無效的解決辦法

    Nginx跨域設置Access-Control-Allow-Origin無效的解決辦法

    今天小編就為大家分享一篇關于Nginx跨域設置Access-Control-Allow-Origin無效的解決辦法,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • Nginx配置四層、七層網絡代理轉發(fā)的方法示例

    Nginx配置四層、七層網絡代理轉發(fā)的方法示例

    nginx作為透明代理可以充分利用其高性能和靈活性來實現網絡流量的轉發(fā)和處理,本文主要介紹了Nginx配置四層、七層網絡代理轉發(fā)的方法示例,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • nginx訪問日志并刪除指定天數前的日志記錄配置方法

    nginx訪問日志并刪除指定天數前的日志記錄配置方法

    這篇文章主要介紹了nginx訪問日志并刪除指定天數前的日志記錄配置方法,需要的朋友可以參考下
    2014-03-03
  • 詳解Nginx與Apache共用80端口的配置方法

    詳解Nginx與Apache共用80端口的配置方法

    這篇文章主要介紹了Nginx與Apache共用80端口的配置方法,當然如果想Nginx不與Apache搶80端口的話,本文后面也附帶了Nginx的端口修改方法,需要的朋友可以參考下
    2016-01-01
  • 詳解Nginx服務器之負載均衡策略(6種)

    詳解Nginx服務器之負載均衡策略(6種)

    這篇文章主要介紹了詳解Nginx服務器之負載均衡策略(6種),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 文件上傳到服務器文件名中文亂碼問題

    文件上傳到服務器文件名中文亂碼問題

    上傳附件到部署服務器,但是上傳到服務器出現文件名中文亂碼,中文變成(?)問號,而且在本地測試是正常的,通過打印日志發(fā)現,下面fileName亂碼,本文給大家講解文件上傳到服務器文件名中文亂碼問題解決方案,感興趣的朋友一起看看吧
    2024-02-02
  • Nginx與Lua灰度發(fā)布的實現

    Nginx與Lua灰度發(fā)布的實現

    這篇文章主要介紹了Nginx與Lua灰度發(fā)布的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03

最新評論