回覆列表
  • 1 # 使用者7369236118082

    以linux下 tcp socket程式設計為例:阻塞就是 recv/read的時候 socket接收緩衝區要是有資料就讀, 沒資料我就一直睡覺賴著不走,直到有資料來了讀完我才走。send/write的時候,要是傳送緩衝區滿了,沒有空間繼續傳送了我也一直睡覺賴著不走,直到傳送緩衝區騰出足夠的空間讓我把資料全部塞到傳送緩衝區裡我才走。(當然如果你透過setsockopt設定了讀寫超時,超時時間到了還是會返回-1和EAGAIN,不再睡覺等待)非阻塞就是recv/read的時候,要是接收緩衝區有資料我就讀完,沒有資料我直接帶著返回的-1和EGAIN走人,絕不睡覺等待耽誤時間。write/send的時候, 要是傳送緩衝區有足夠的空間,就立刻把資料塞到傳送緩衝區去,然後走人,如果傳送快取區滿了,空間不足,那直接帶著返回的-1和EAGAIN走人。至於IO多路複用,首先要理解的是,作業系統為你提供了一個功能,當你的某個socket接收快取區有資料可讀,或者傳送緩衝區有空間可寫的時候,它可以給你一個通知。這樣當配合非阻塞的socket使用時,只有當系統通知我哪個描述符可讀了,我才去執行read操作,可以保證每次read都能讀到有效資料而不做純返回-1和EAGAIN的無用功。寫操作類似。作業系統的這個功能透過select/poll/epoll之類的系統呼叫函式來使用,這些函式都可以同時監視多個描述符的讀寫就緒狀況,這樣,多個描述符的I/O操作都能在一個執行緒內完成,這就叫I/O多路複用,這裡的“複用”指的是複用同一個執行緒。至於事件驅動,其實是I/O多路複用的一個另外的稱呼。至於非同步同步,我們常見的linux下的網路程式設計模型大部分都是同步io,以讀操作為例,本質上都是需要使用者呼叫read/recv去從核心緩衝區把資料讀完再處理業務邏輯。非同步io則是核心已經把資料讀好了,使用者直接處理邏輯。非同步IO在linux下一般是用aio庫。

  • 中秋節和大豐收的關聯?
  • 臨江仙送光州曾使君上片運用什麼手法?