i/o的概念
作業系統的分為socket的i/o還有使用者介面的輸入輸出,一般乙個輸入操作分為兩個不同的階段,1)等待資料準備好;2)從核心向程序複製資料
從理論上來講,阻塞i/o、非阻塞i/o、復用i/o、訊號驅動i/o都是同步io模型,非同步i/o就是非同步io,同步i/o向應用程式通知的是i/o就緒事件,非同步i/o向應用程式通知的是i/o完成事件。
同步和非同步:都是針對應用程式和作業系統之間互動而言的。同步的話,如果上層應用不主動詢問作業系統的話,作業系統是不會主動通知應用程式的。非同步的話,作業系統會主動通知應用程式。
阻塞:如果條件不滿足的話,作業系統將應用程式掛起或者休眠,此時應用程式處於阻塞狀態,只有當資料準備好之後或者資料已經從核心空間拷貝到使用者空間,作業系統通知執行緒,此時喚醒執行緒。
非阻塞:如果條件不滿足的話,該方法不會阻塞當前執行緒,而是立即返回乙個標誌資訊(資料還沒有準備好),或者timeou之後返回,此時應用執行緒還可以進行其他的操作。
在linux中並不存在真正的非同步i/o,而是通過多路復用i/o的方式去模擬非同步io
注意:同步並不等同於阻塞,同步呼叫的時候,即便呼叫不返回,但是應用執行緒還處於執行狀態,可以進行其他的操作,而阻塞呼叫時,應用執行緒處於阻塞狀態。
作業系統5種通訊模型
阻塞i/o
解釋:應用程式會呼叫乙個io函式,導致應用程式阻塞,程式會一直停留在此處,如果資料準備好了,核心會將資料拷貝至應用程式
偽**:
特點:當處理socket數量較少的時候,使用阻塞式i/o比較合適,當socket數量較大,為每乙個socket都分配乙個讀執行緒、處理執行緒以及同步的事件,那麼對作業系統的開銷會變得很大,並且不支援大資料量的socket鏈結
非阻塞i/o
解釋:非阻塞io就是通過反覆呼叫io函式,如果沒有資料,那麼會立即返回乙個錯誤的介面,不斷去呼叫,不斷去輪詢,檢視是否可以獲取資料,通常來說,這種比較耗費大量的cpu時間,在資料拷貝階段,還是阻塞的,原理就是應用程式在socket非阻塞的時候,告訴作業系統,不要在沒有資料的時候把我掛起或者休眠,而是返回乙個錯誤的訊號
偽**:
特點:不容易使用,需要編寫更多的**,如果非阻塞io在控制建立多個連線,在資料的收發量不均,時間不定的情況下,更具優勢
i/o復用模型
解釋:主要就是select、poll和epoll,有了i/o復用,我們可以使用select或者poll或者epoll,兩次呼叫,兩次返回,相對於阻塞i/o沒有什麼優越性,關鍵是能實現同時對多個io埠進行監聽,會使程序阻塞,可以同時阻塞多個i/o操作。
多路復用i/o模型是目前使用比較多的模型,所謂多路復用,可以理解為在乙個應用執行緒裡面可以處理多個socket連線,或者同乙個埠接受來自多個客戶端的請求(連線、讀、寫),多路復用i/o與傳統的非阻塞io的區別在於,在傳統的非阻塞i/o中,是由使用者去輪詢socket狀態,而在多路復用i/o中,由核心去輪詢向select註冊的socket的狀態,所以多路復用io需要作業系統的支援。
最大的優勢是,在同乙個執行緒中,可以同時處理多個socket的io請求,在同步阻塞模型中,必須通過多執行緒的方式才可以達到這個目的。while迴圈之前,將socket新增到select監視中,然後while迴圈一直呼叫select獲取被啟用的socket,一旦socket可讀,便呼叫read函式將socket中的資料讀取出來。但是每個io請求的過程還是阻塞的(在select函式上阻塞),平均時間甚至比同步阻塞io模型還要長。
偽**:
} } }
特點:使用場景:
1)當客戶處理多個描述符(通常是互動式輸入和socket)時,必須使用i/o復用
2)乙個客戶同時處理多個socket是可能的
3)如果乙個tcp伺服器既要處理監聽socket,又要處理已經連線的socket,一般就要使用i/o復用
4)如果乙個伺服器既要處理tcp,又要處理udp,一般就要使用i/o復用
訊號驅動i/o
解釋:首先我們允許socket進行訊號驅動i/o,並且安裝乙個訊號處理函式,進行繼續執行不阻塞,當資料準備好之後,程序收到乙個sigio訊號,可以在訊號處理函式中呼叫i/o操作函式處理資料
特點:這種模型的優勢在於等待資料報到達期間,程序不會被阻塞,只需要等待訊號處理函式的通知,既可以是資料準備好被處理,也可以是資料報已經準備好被讀取
非同步i/o模型
解釋:先非同步呼叫,但是不會立即返回資料,而是等待被呼叫部件完成後,通過狀態、通知和**來通知呼叫者的輸入輸出操作,這個與訊號驅動i/o的區別在於:1)訊號驅動i/o是由核心通知我們如何啟動乙個i/o操作;2)而非同步i/o模型是由核心通知我們i/o操作何時完成,非同步i/o模型才是最理想的i/o模型,在非同步i/o模型中,當使用者執行緒發起read操作之後,立刻就可以開始去做其他的事情。而另外一方面,從核心的角度,當它收到asynchronous read之後,它會立刻返回,說明read請求已經成功發起,因此不會對使用者執行緒產生任何block。然後核心會等待資料準備完成,然後將資料拷貝到使用者執行緒,當這一切都完成之後,核心就會給使用者執行緒發乙個訊號,告訴它read操作完成了。也就說使用者執行緒完全不需要實際的整個i/o操作是如何進行的,只需要先發起乙個請求,當接受核心返回成功的訊號時表示i/o操作已經完成,可以直接去使用資料了,非同步i/o模型中,由作業系統核心去等待資料就緒,copy資料到使用者空間,使用者執行緒始終沒有阻塞。
特點:我們呼叫aio_read函式,給核心傳遞描述符、緩衝區指標,緩衝區大小和檔案偏移,並告訴核心當整個操作完成的時候如何通知我們。該系統呼叫後就立即返回,而且在等待i/o完成期間,我們的程序不被阻塞
socket通訊模型
socket程式設計是一門技術,它主要是在網路通訊中經常用到。既然是一門技術,由於現在是物件導向的程式設計,一些計算機行業的大神通過抽象的理念,在現實中通過反覆的理論或者實際的推導,提出了抽象的一些通訊協議,基於tcp ip協議,提出大致的構想,一些泛型的程式大牛在這個協議的基礎上,將這些抽象化的理...
高效通訊模型之 非同步通訊模型
非同步模型 非同步和同步 同步,就是在發出乙個功能呼叫時,在沒有得到結果前,呼叫不返回 非同步,當乙個非同步過程呼叫發出後,呼叫者不能立即得到呼叫結果,而是通過狀態,通知和 來通知呼叫者。通過檢查狀態來判斷非同步呼叫結果,效率會很低,因為需要週期性檢查狀態 函式和通知差不多 同步呼叫與阻塞呼叫 對於...
C S通訊模型與B S通訊模型介紹
1 客戶端與伺服器之間的通訊模型 基於socket連線的客戶端與伺服器之間的通訊模型圖如上圖所示,整個通訊過程如下所示 1 伺服器端首先啟動監聽程式,對指定的埠進行監聽,等待接收客戶端的連線請求 2 客戶端程式啟動,請求連線伺服器的指定埠 3 伺服器收到客戶端的連線請求後與客戶端建立套接字 sock...