併發:一段時間內,有幾個程式在同乙個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 往流中讀出資料...