Nginx高併發之IO模型 走了多遠,又是多遠

2022-09-23 07:27:08 字數 1799 閱讀 5492

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?nginx高併發之io模型介紹

? ?nginx?是乙個高效能的http和反向**web伺服器,同時也提供了imap/pop3/smtp服務。眾所周知nginx的相比於apache有更高的併發,可以接收處理更多的訪問請求,這得益於io模型,下面為大家介紹io模型相關。

?一、先了解下同步非同步,阻塞和非阻塞:

同步/非同步? 關注是訊息通訊機制

1、同步

呼叫者等待被呼叫者返回訊息,才能繼續執行

例如:老闆布置你任務,一直向你詢問有沒有完成,完成了老闆做下一件事,這種通訊機制成為同步。

2、非同步

被呼叫者通過狀態、通知或者**機制主動通知被呼叫者的執行狀態

例如:老闆分配你任務,任務進度狀態你會向老闆匯報,老闆做自己的事情,不會向你問詢結果。

阻塞/非阻塞:關注呼叫者在等待結果返回之前的狀態

1、阻塞 blocking?

指io操作需要徹底完成後才返回到使用者空間,呼叫結果返回之前,呼叫者被掛起

例如:? 洗衣服手洗,沒洗完之前你都是被占用的狀態。

2、非阻塞 nobloking?

指io操作被呼叫後立刻返回乙個使用者狀態,無需等io操作徹底完成,最終的呼叫結果返回之前,呼叫者不會被掛起

例如:全自動洗衣機,不需要占用你時間,洗完會通知你,在期間你沒有因為洗衣服被占用時間。

二、io模型介紹

1、同步阻塞型

即使用者程序通過系統呼叫拿資源,因不確定是否拿到資料,所以會一次次的詢問結果,這個過程是同步。

將資料從磁碟拷貝到核心空間,再將核心中的資料複製到應用的使用者空間,這個過程程序不能做其他事,即阻塞。

2、同步非阻塞

即使用者程序通過系統呼叫拿資源,因不確定是否拿到資料,所以會一次次的詢問結果,這個過程是同步。

將資料從磁碟拷貝到核心空間,再將核心中的資料複製到應用的使用者空間,這個過程程序可以做其他事,即非阻塞。

這個較同步阻塞沒有改善,看似非阻塞,程序可以幹其他事,但由於是同步,程序依舊在不斷問詢結果,反而更消耗資源。

3、io多路復用

使用者程序找乙個**select,而不直接與核心打交道,系統呼叫交於select進行處理。

使用者程序收到資源從磁碟寫入核心緩衝區資訊後,將核心緩衝區內容複製到使用者空間。

select接待使用者程序不是一對一的方式,而是一對多。使用者程序依舊阻塞於select呼叫。這個有點像吃飯,客人和服務員之間的關係,>客人不會和後廚打交道,交由服務員完成。

io多路復用只能成為非同步阻塞模型,因阻塞在io呼叫那裡,但乙個select可以檢測多個io模型,相比與同步阻塞只能檢測乙個提高了cpu的利用率。

4、訊號驅動型

即使用者程序建立sigio的訊號處理程式,複製資料從磁碟到核心空間,等處理完遞交sigio告知使用者程序,這個過程是不阻塞的狀態。

使用者程序從核心空間複製到使用者應用空間,這個過程是阻塞的。

訊號驅動並未完全解決問題,只是做到了一部分不阻塞,一部分阻塞。

5、非同步io模型

使用者程序不受阻塞,所有的請求,拿資料拷貝到應用空間都由核心完成,使用者程序可以接收更多的使用者請求。

三、nginx高併發原理

nginx高併發使用的是epoll的方式,提供給使用者訪問,複製資料的一些操作交由核心完成。自身做的事情越少接待的使用者請求就越多。

epoll在linux2.6中增加了記憶體拷貝mmap機制,加速與核心空間的訊息傳遞,即記憶體對映。

記憶體對映機制:磁碟中有資料,資料有對應的inode,在記憶體中對映乙個相同的inode,大小也相同,下次拿資料不需要遍歷inode,分析路

徑了。這樣提高了效率。

I O模型和併發模型

1 針對非阻塞i o執行的系統呼叫總是立即返回,而不管事件是否已經發生。如果事件沒有立即發生,這些系統呼叫返回 1,和出錯情況是一樣的。此時必須根據errno來區分這兩種情況。很顯然,我們只能在事件已經發生的情況下操作非阻塞i o,才能提高程式效率,因此,非阻塞i o通常需要和其他的i o通知機制一...

併發程式設計之IO模型

io模型 io指的是輸入輸出,模型指的是套路,io模型就是指所有可以實現輸入輸出的套路。io的分類 io分為兩類 1.本地io 指的是輸入輸出到本地計算機,比如寫入硬碟,從硬碟中讀取資料等 2.網路io 指的是輸入輸出到網路計算機,速度遠比本地io慢。網路io是非常重要的乙個知識點 io模型一共分為...

nginx高併發配置

nginx配置及說明 worker processes 8 nginx 程序數,建議按照cpu 數目來指定,一般為它的倍數。worker cpu affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000...