執行緒 IO 模型

2021-10-07 04:42:13 字數 1084 閱讀 2790

一、redis 單執行緒為什麼還能這麼快?

​ 因為它所有的資料都在記憶體中,所有的運算都是記憶體級別的運算。正因為 redis 是單執行緒,所以要小心使用 redis 指令,對於那些時間複雜度為 o(n) 級別的指令,一定要謹慎使用,一不小心就可能會導致 redis 卡頓。

redis 單執行緒如何處理那麼多的併發客戶端連線?

​ 多路復用

二、非阻塞 io

​ 當我們呼叫套接字的讀寫方法,預設它們是阻塞的,比如read方法要傳遞進去乙個引數n,表示最多讀取這麼多位元組後再返回,如果乙個位元組都沒有,那麼執行緒就會卡在那裡,直到新的資料到來或者連線關閉了,read方法才可以返回,執行緒才能繼續處理。

​ 非阻塞 io 在套接字物件上提供了乙個選項non_blocking,當這個選項開啟時,讀寫方法不會阻塞,而是能讀多少讀多少,能寫多少寫多少。能讀多少取決於核心為套接字分配的讀緩衝區內部的資料位元組數,能寫多少取決於核心為套接字分配的寫緩衝區的空閒空間位元組數。讀方法和寫方法都會通過返回值來告知程式實際讀寫了多少位元組。

​ 有了非阻塞 io 意味著執行緒在讀寫 io 時可以不必再阻塞了,讀寫可以瞬間完成然後執行緒可以繼續幹別的事了。

三、select 系列的事件輪詢

​ 有乙個timeout引數,如果沒有任何事件到來,那麼就最多等待timeout時間,執行緒處於阻塞狀態。一旦期間有任何事件到來,就可以立即返回。時間過了之後還是沒有任何事件到來,也會立即返回。拿到事件後,執行緒就可以繼續挨個處理相應的事件。處理完了繼續過來輪詢。於是執行緒就進入了乙個死迴圈,我們把這個死迴圈稱為事件迴圈,乙個迴圈為乙個週期。

因為我們通過select系統呼叫同時處理多個通道描述符的讀寫事件,因此我們將這類系統呼叫稱為多路復用 api。

四、指令佇列

​ redis 會將每個客戶端套接字都關聯乙個指令佇列。客戶端的指令通過佇列來排隊進行順序處理,先到先服務。

I O模型 I O模型

輸入 輸出 i o 是在主存和外部裝置 例如磁碟驅動器 終端和網路 之間複製資料的過程。輸入操作是從 i o 裝置複製資料到主存,輸出資料是從主存複製資料到 i o 裝置。描述的是使用者執行緒與核心的互動方式 描述的是使用者執行緒呼叫核心 i o 操作的方式 乙個 i o 操作其實分成了兩個步驟 發...

多執行緒隙 IO模型(BIO NIO AIO)

同步,非同步,是描述被呼叫方的。阻塞,非阻塞,是描述呼叫方的。同步不一定阻塞,非同步也不一定非阻塞。沒有必然關係。舉個簡單的例子 1 老張把水壺放到火上,一直在水壺旁等著水開。同步阻塞 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻塞 3 老張把響水壺放到火上,一直在水壺旁...

I O復用和I O模型

由 unix網路程式設計卷1 總結而來。同時監視多個i o條件,在其中任意乙個就緒時通知程序,這樣的能力稱為i o復用。由select和poll函式支援,較新的還有posix中的pselect函式。linux中還有epoll i o復用應用場合 1 客戶同時處理多個描述符時,必須使用i o復用。2 ...