socket阻塞與非阻塞 同步與非同步概念

2021-06-15 01:16:28 字數 1723 閱讀 7696

看了不少文章,發現socket阻塞、非阻塞、同步、非同步概念講的比較混亂,甚至混用比如非阻塞和非同步。

看了unix網路程式設計 五種i/o模型 感覺講的比較清晰,現總結下,方便自己記憶理解。本人菜鳥一枚,如果**說得有誤歡迎拍磚指正,在此謝過。

阻塞與非阻塞

阻塞與非阻塞io區別在於應用程序的呼叫是否立即返回。

對於阻塞io當應用程序呼叫io函式,如果資料沒有準備好,將一直等待(睡眠),直到資料準備好喚醒程序;

非阻塞io:程序會反覆呼叫(當然是程序根據是否返回ewouldblock while輪詢)io函式並馬上返回,但資料從核心拷貝到使用者程序空間程序是阻塞的。當請求的io操作無法完成時,程序不會睡眠,而是io操作函式返回乙個錯誤,這樣程序就可以據此不斷測試資料是否準備好了,直到準備好為止。這個不斷測試的過程中,會占用大量cpu時間,如圖6.2所示。非阻塞io類似於自旋鎖,不斷忙輪詢

同步非同步:

同步非同步的區別在於:資料從核心拷貝到使用者程序空間,程序是否阻塞。

真正的非同步只有aio,其他的都為同步,包括多路io復用

。資料拷貝到使用者程序後會通知程序,程序在拷貝期間無需阻塞可以繼續處理其他邏輯。

多路io復用:

多路io復用也是同步的,跟單個阻塞io比並沒有什麼優越性,但當io較多時就體現效果了,主要是它能同時對多個io進行監聽。

目前流行的伺服器開發模式是

one  thread per loop&non-blocking,之前一直有個疑問:既然select、poll等可以監測io是否可讀寫、異常,

那io還要設定為非阻塞幹嘛? 

select 只能說明 socket 可讀或者可寫,不能說明能讀入或者能寫出多少資料。比如,socket 的寫緩衝區有 10 個位元組的空閒空間,

這時監視的 select 返回,然後在該 socket 上進行寫操作。但是如果要寫入 100 位元組,如果 socket 沒有設定非阻塞,呼叫 write 就會阻塞在那裡。而更為要緊的是,

在多個 socket 的情況下,讀寫乙個socket 時阻塞,會影響到其他的 socket 。題外話:現在的網路庫libevent、muduo對io都是帶讀寫緩衝區的,使用者不會自己去read、write某個socket的,都交給網路庫事件迴圈處理了。

多路io復用:select、poll、epoll大致比較:

select模型是通過一種輪詢機制來實現的。需要注意:

poll模型與select類似,也是通過輪詢來實現,但它與select模型的區別在於socket數量沒有限制。

epoll模型在poll模型的基礎之上不使用輪詢,而使用基於核心提供的反射模式。

socket 阻塞與非阻塞 同步與非同步

阻塞與非阻塞。所謂阻塞方式的意思是指,當試圖對該檔案描述符進行讀寫時,如果當時沒有東西可讀,或者暫時不可寫,程式就進入等待狀態,直到有東西可讀或者可寫為止。而對於非阻塞狀態,如果沒有東西可讀,或者不可寫,讀寫函式馬上返回,而不會等待。預設情況下,三述符處於阻塞狀態。同步非同步與阻塞和非阻塞是兩種不同...

socket的阻塞與非阻塞,同步與非同步

同步 非同步主要針對c端 同步 所謂同步,就是在c端發出乙個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。例如普通b s模式 同步 提交請求 等待伺服器處理 處理完畢返回 這個期間客戶端瀏覽器不能幹任何事 非同步 非同步的概念和同步相對。當c端...

socket阻塞與非阻塞

何為阻塞?在以上過程中若連線還沒到來,那麼接受阻塞,程式執行到這裡不得不掛起,cpu轉而執行其他執行緒。在以上過程中若資料還沒準備好,請閱讀會一樣也會阻塞。阻塞式網路io的特點 多執行緒處理多個連線。每個執行緒擁有自己的棧空間並且占用一些cpu時間。每個執行緒遇到外部為準備好的時候,都會阻塞掉。阻塞...