高效通訊模型之 非同步通訊模型

2022-04-09 22:58:01 字數 1169 閱讀 3130

#非同步模型

#非同步和同步

>同步,就是在發出乙個功能呼叫時,在沒有得到結果前,呼叫不返回

>非同步,當乙個非同步過程呼叫發出後,呼叫者不能立即得到呼叫結果,而是通過狀態,通知和**來通知呼叫者。

>通過檢查狀態來判斷非同步呼叫結果,效率會很低,因為需要週期性檢查狀態

>**函式和通知差不多

#同步呼叫與阻塞呼叫

>對於同步呼叫來說,當前執行緒還是啟用狀態的。例如csocket中呼叫receive函式,當緩衝區沒有資料時,雖然函式一直在等待而沒有返回,但同時執行緒仍然能繼續處理各種訊息。

>對於阻塞呼叫來說,當前執行緒會被掛起。例如 revc函式,當socket工作在阻塞模式的時候,如果在緩衝區沒有資料的情況下呼叫該函式,那麼執行緒將會被掛起,直到有資料為止。

#非阻塞

非阻塞,在不能得到結果前,函式不會阻塞當前執行緒,而是立即返回。

>物件是否處於阻塞模式和函式是不是阻塞呼叫有很強的想關心,但並不是一一對應

>阻塞物件可以有非阻塞的呼叫方式,可以通過api輪詢狀態,在適當的時候呼叫阻塞函式,就可以避免阻塞。

>對於非阻塞物件,特殊呼叫也可以進入阻塞呼叫,例如select

>csocket::receive 函式(同步)

>recv (阻塞)

由winsock提供的非同步通訊模型,應用程式可以在乙個套接字上接收以windows訊息為基礎的網路事件通知。

wsaasyncselect 模式與select模式最大的區別在於,select模式需要不停檢測socket,判斷有無訊息,而wsaasyncselect

會在接收到使用者定義的訊息後通知使用者,再對socket進行相應處理。

#wsaasyncselect  函式

wsaasyncselect (

socket s ,

hwnd hwnd , 

unsigned int umsg ,

long levent

)此函式在socket建立之後呼叫,以開啟訊息通知。levent為網路事件的組合,有如下值

呼叫wsaasyncselect

成功之後,hwnd對應的視窗就會以windows訊息的形式接收網路事件通知。

來自為知筆記(wiz)

Windows高效通訊模型之IOCP

今晚複習計網去了.然後思考了一下怎麼解決今天下午那份 客戶端被子執行緒阻塞的問題。就像之前說的,那份 是 one thread per client 的模型,對每個是客戶端的連線請求,都要臨時建立乙個socket來處理,這樣就造成了系統開銷比較大的問題,而且執行緒之間的互相阻塞也是影響效率的重要原因...

C S通訊模型與B S通訊模型介紹

1 客戶端與伺服器之間的通訊模型 基於socket連線的客戶端與伺服器之間的通訊模型圖如上圖所示,整個通訊過程如下所示 1 伺服器端首先啟動監聽程式,對指定的埠進行監聽,等待接收客戶端的連線請求 2 客戶端程式啟動,請求連線伺服器的指定埠 3 伺服器收到客戶端的連線請求後與客戶端建立套接字 sock...

C S通訊模型與B S通訊模型介紹

1 客戶端與伺服器之間的通訊模型 基於socket連線的客戶端與伺服器之間的通訊模型圖如上圖所示,整個通訊過程如下所示 1 伺服器端首先啟動監聽程式,對指定的埠進行監聽,等待接收客戶端的連線請求 2 客戶端程式啟動,請求連線伺服器的指定埠 3 伺服器收到客戶端的連線請求後與客戶端建立套接字 sock...