關於IO多路復用的簡單整理

2022-05-15 13:57:37 字數 2185 閱讀 3758

併發:一段時間內,有幾個程式在同乙個cpu上執行,但是任意時刻只有乙個程式在乙個cpu上執行

並行:任意時刻有多個程式同時執行在多個cpu上

同步、非同步,與阻塞、非阻塞不相關

函式或方法被呼叫的時候,呼叫者是否得到最終結果

同步:直接得到最終結果的,就是同步呼叫。同步就是一直要執行到返回最終結果

非同步:不直接得到最終結果的,就是非同步呼叫。非同步就是直接返回了,但是返回的不是最終結果

函式或方法被呼叫的時候,是否立刻返回,呼叫者是否還能幹其他事

阻塞:不立即返回就是阻塞呼叫

非阻塞:立即返回就是非阻塞呼叫

c10k問題,是在2023年被提出來的乙個技術挑戰

如何在一顆1ghzcpu、2g記憶體、1gbps網路環境下,讓單台伺服器同時為1萬個客戶端提供ftp服務

unix中的五種io模型:

io過程分兩個階段

1、資料準備階段,資料到達後被複製到核心的緩衝區中

2、程序從核心複製資料,將資料從核心空間複製到使用者空間

io多路復用就是通過一種機制,乙個程序或可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),就通知程式進行相應的讀寫操作。

但select、poll、epoll本質上都是同步io,因為在就緒後它們都需要自己負責進行讀寫,這個讀寫過程是阻塞的。

而非同步io無需自己負責進行讀寫,非同步io的實現會負責把資料從核心空間拷貝到使用者空間。

select幾乎所有作業系統平台都支援,poll是對的select的公升級。

epoll,linux系統核心2.6開始支援,對select和poll的增強,在監視的基礎上,增加**機制。bsd、mac平台有kqueue,windows有iocp。

select

select函式監視的檔案描述符分三類,分別是writefds、readfds、和exceptfds。

呼叫select()會阻塞,直到有描述符就緒、或者超時,函式才返回。

當select函式返回後,可以通過遍歷events來找到就緒的描述符。

select幾乎支援所有平台,其良好的跨平台支援也是它的乙個優點。

缺點在於單個程序能夠監視的檔案描述符的數量存在上限,在linux上一般為1024,可以通過修改修改這個限制,但是這樣也可能會造成效率降低,不建議修改。

poll

select使用三個點陣圖來表示三個fdset,不同於select,poll使用pollfd的乙個指標實現。

pollfd結構包含了要監視的event和發生了的event,不再使用select的'引數-值'傳遞方式。

pollfd使用鍊錶,沒有最大數量限制,同select一樣,poll返回後,需要遍歷pollfd來獲取就緒的描述符。

select和poll都需要在返回後通過遍歷來獲取已經就緒的socket。

實際上,同時連線的大量客戶端在同一時刻可能只有很少的處於就緒狀態,隨著監視的描述符數量的增長,其效率也會線性下降。

epoll

epoll出現在核心2.6之後,是select和poll的增強版本。

相對於select和poll來說,epoll更加靈活,沒有描述符數量限制,增加了**機制,使用事件通知,不需要遍歷,效率很高。

epoll使用乙個檔案描述符管理多個描述符,將使用者關係的檔案描述符的事件存放到核心的乙個事件表中,這樣,從核心空間到使用者空間的copy只需一次。

epoll的查詢使用了紅黑樹資料結構,效率很高,不過紅黑樹本身很複雜。

select/poll還要從核心空間複製資料到使用者空間,而epoll通過核心空間和使用者空間共享一塊記憶體來減少複製。

c10m問題

如何利用8核心cpu、64g記憶體,在10gbps的網路上保持1000w併發連線。

非同步io

程序發起非同步io請求,立即返回。核心完成io的兩個階段之後,即資料從核心空間複製到使用者空間之後,核心才給程序發乙個訊號。

linux的aio的系統呼叫,核心從版本2.6開始支援。

參考:

I O多路復用

一 五種i o模型 1 阻塞i o模型 最流行的i o模型是阻塞i o模型,預設情形下,所有套介面都是阻塞的。我們以資料報套介面為例來講解此模型 我們使用udp而不是tcp作為例子的原因在於就udp而言,資料準備好讀取的概念比較簡單 要麼整個資料報已經收到,要麼還沒有。然而對於tcp來說,諸如套介面...

i o多路復用

最常見的i o多路復用就是 select poll epoll了,下面說說他們的一些特點和區別吧。select 可讀 可寫 異常三種檔案描述符集的申明和初始化。fd set readfds,writefds,exceptionfds fd zero readfds fd zero writefds ...

I O多路復用

我們都知道unix like 世界裡,一切皆檔案,而檔案是什麼呢?檔案就是一串二進位製流而已,不管socket,還是fifo 管道 終端,對我們來說,一切都是檔案,一切都是流。在資訊 交換的過程中,我們都是對這些流進行資料的收發操作,簡稱為i o操作 input and output 往流中讀出資料...