本文討論的背景是linux環境下的
網路io。
對於一次io訪問,資料會先被拷貝到作業系統核心的緩衝區中,然後
再從作業系統核心的緩衝區拷貝到應用程式的位址空間。
所以,當
發生乙個
io操作
時,它會經歷兩個階段:
1. 等待資料準備
2. 將資料從核心拷貝到程序中 對於
兩個階段,linux系統產生了下面五種網路模式的
io儲存
方案。
注:訊號驅動
io在實際中並不常用,所以我
們討論剩下的四種i
o模式,有興趣可以自行了解訊號驅動io。
在linux中,預設情況下所有的socket都是
阻塞io。
這個模式的特點在於,當使用者程序呼叫了io操作的時候,作業系統就開始準備資料,
當作業系統核心
一直等到資料準備好了,它就會將資料從
作業系統核心
中拷貝到使用者記憶體,然後返回結果,使用者程序才解除
鎖住的狀態,重新執行起來。
整個過程需要等待(不能立刻完成),
而使用者程序這邊,就相當於是卡著一直在等他完成返回結果。
所以,阻塞io的特點就是在io執行的兩個階段都被鎖住了
linux下,可以通過設定socket使其變為
非阻塞io。
非阻塞io的特點是,當使用者程序發出io操作時,在
第乙個階段
如果核心資料還沒準備好,並不會鎖住使用者程序,而是立刻返回乙個error。然後使用者程序收到error,就知道沒準備好,就會再去問核心有沒有準備好,直到核心準備好,並且收到了使用者程序的詢問,就會立刻拷貝資料,然後進行第二階段(第二階段依然會卡住,非阻塞io只是在第一階段非阻塞)
就像打**一樣,對方佔線,你就一直打,直到對方接通為止,但效率
不高。所以,nonblocking io的特點是使用者程序需要不斷的主動詢問kernel資料好了沒有。
io多路復用
就是我們
用的select,poll,epoll
。當使用者程序呼叫了select,那麼整個程序會被block
,而同時,kernel會「監視」所有select負責的socket,當任何乙個socket中的資料準備好了,select就會返回。這個時候使用者程序再呼叫read操作,將資料從kernel拷貝到使用者程序。
簡單的說,就是和阻塞io處理方式一樣,但不同的是,select可以一下把很多很多檔案描述符都傳過來,然後作業系統核心同時監視他們,只要其中乙個就緒,就及時處理那個,而不需要乙個個等待處理。
他的效能可能比阻塞io還要差,但他的優點在於能同時處理多個連線。所以,如果處理的連線數不是很高的話,使用io多路復用不一定比使用多執行緒+阻塞io的效能更好,可能延遲還更大。
linux下的非同步io其實用得很少。
非同步io的特點很簡單:當處理乙個io操作的時候,使用者程序把資料傳過來,
作業系統會立刻返回「收到」,使用者程序
就不用管了,可以幹別的事情了。等作業系統核心處理完2個階段,就自動告訴使用者程序我處理完了。
阻塞io:使用者一直等作業系統核心完成2個階段io操作,再繼續
非阻塞io:第一階段使用者一直問作業系統有沒有準備好,第二階段等作業系統完成。
io多路復用:使用者程序可以同時發多個網路連線io,作業系統實施監控,雖然使用者程序2個階段都卡住了,但可以處理多個連線。
非同步io:使用者程序完全把東西交給作業系統完成,自己不管了。
詳解unix5種IO模型
unix網路程式設計對io模型進行了分類,共分為5類,要在unix系統的前提下才有效。5種io模型 這些io模型的改動的目的是為了提高伺服器能夠並行處理的連線數,而不是提高程式的執行效能。前提 要搞懂阻塞 非阻塞 同步 非同步。阻塞 非阻塞 同步 非同步可以看徹底搞懂阻塞 非阻塞 同步 非同步 總得...
網路I O模型 5種常見的網路I O模型
阻塞與非阻塞 阻塞就是卡在那兒什麼也不做,雙方之間也沒有資訊溝通。非阻塞就是即使對方不能馬上完成請求,雙方之間也有資訊的溝通。同步與非同步 同步就是一件事件只由乙個過程處理完成,不論阻塞與非阻塞,最後完成這個事情的都是同乙個過程 非同步就是一件事由兩個過程完成,前面乙個過程通知,後面乙個過程接受返回...
IO概念 5種IO模型
io叫做輸入輸出,我們可以將io理解為兩步 等待io事件就緒 資料就緒後進行真正意義上的io 真正的資料搬遷 所以,io的過程一是等,然後才是輸入輸出。進而,我們可以得到評價io是否高效的標準 在io過程中 等 的比重越小的效能越好,越大的效能越低。io中有兩個重要的函式 read write 他們...