您好,登錄后才能下訂單哦!
這篇文章主要講解了“服務器網絡編程的IO模型是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“服務器網絡編程的IO模型是什么”吧!
??這張圖比較簡單,但是很多人在沒看到這張圖之前肯定都以為每次網絡讀(recvfrom())或者寫(sendto())都是在網卡與用戶進程之間進行操作,其實不是。從上圖可以看出,數據無論從網卡到用戶空間還是從用戶空間到網卡都需要經過內核。從磁盤上讀寫數據也是如此。所以就有了 mmap 技術,感興趣的可以自行百度。應用進程(Web 服務器也屬于應用進程,這里需要再統一幾個概念:用戶進程、應用程序、Web 服務器程序,它們相對于內核來說都是應用進程,所以后面文章中統一成應用進程)需要通過系統調用(例如recvfrom/sendto)向內核讀寫數據,內核再進一步操作網卡。
??根據應用進程系統調用方式的阻塞、非阻塞,操作系統在處理應用程序請求時處理方式的同步、異步處理的不同,可以分為 5 種 IO 模型:
??
描述:應用程序進行 recvfrom 系統調用時將阻塞在此調用,直到該套接字上有數據并且復制到用戶空間緩沖區。該模式一般配合多線程使用,應用進程每接收一個連接,為此連接創建一個線程來處理該連接上的讀寫以及業務處理。
??優點:編程簡單,適合教學。《UNIX網絡編程卷I》上很多例子都是基于這種模式。 ??缺點:如果套接字上沒有數據,進程將一直阻塞。這時其他套接字上有數據也不能進行及時處理。如果是多線程方式,除非連接關閉否則線程會一直存在,而線程的創建、維護和銷毀非常消耗資源,所以能建立的連接數量非常有限。
??
描述:應用進程每次調用 recvfrom 即使沒有數據準備好也不會阻塞,會繼續往下執行,避免了進程阻塞在某個連接上的弊端。
??優點:代碼編寫相對簡單,進程不會阻塞,可以在同一線程中處理所有連接。
??缺點:需要頻繁的輪詢,比較耗CPU,在并發量很大的時候將花費大量時間在沒有任何數據的連接上輪詢。所以該模型只在專門提供某種功能的系統中才會出現。
??
描述:應用進程阻塞于 select/poll/epoll 等系統函數等待某個連接變成可讀(有數據過來),再調用 recvfrom 從連接上讀取數據。雖然此模式也會阻塞在 select/poll/epoll 上,但與阻塞IO 模型不同它阻塞在等待多個連接上有讀(寫)事件的發生,明顯提高了效率且增加了單線程/單進程中并行處理多連接的可能。
??優點:統一管理連接,不一定采用多線程的方式,同時也不需要輪詢。只需要阻塞于 select 即可,可以同時管理多個連接。
??缺點:當 select/poll/epoll 管理的連接數過少時,這種模型將退化成阻塞 IO 模型。并且還多了一次系統調用:一次 select/poll/epoll 一次 recvfrom。
??
描述:應用進程創建 SIGIO 信號處理程序,此程序可處理連接上數據的讀寫和業務處理。并向操作系統安裝此信號,進程可以往下執行。當內核數據準備好會向應用進程發送信號,觸發信號處理程序的執行。再在信號處理程序中進行 recvfrom 和業務處理。
??優點:非阻塞
??缺點:在前一個通知信號沒被處理的情況下,后一個信號來了也不能被處理。所以在信號量大的時候會導致后面的信號不能被及時感知。
??
描述:應用進程通過 aio_read 告知內核啟動某個操作,并且在整個操作完成之后再通知應用進程,包括把數據從內核空間拷貝到用戶空間。信號驅動 IO 是內核通知我們何時可以啟動一個 IO 操作,而異步 IO 模型是由內核通知我們 IO 操作何時完成。
注:前 4 種模型都是帶有阻塞部分的,有的阻塞在等待數據準備好,有的阻塞在從內核空間拷貝數據到用戶空間。而這種模型應用進程從調用 aio_read 到數據被拷貝到用戶空間,不用任何阻塞,所以該種模式叫異步 IO 模型。這五種模型的取名和并列方式我是保留意見的,感覺容易迷惑讀者。
??優點:沒有任何阻塞,充分利用系統內核將 IO 操作與計算邏輯并行。
??缺點:編程復雜、操作系統支持不好。目前只有 windows 下的 iocp 實現了真正的 AIO。linux 下在 2.6 版本中才引入,目前并不完善,所以 Linux 下一般采用多路復用模型。
??前四種模型的主要區別于第一階段,因為他們的第二階段都是一樣的:在數據從內核拷貝到應用進程的緩沖區期間,進程阻塞于 recvfrom 調用。相反,異步 IO 模型在這兩個階段都需要處理,從而不同于其他四種模型。
??
感謝各位的閱讀,以上就是“服務器網絡編程的IO模型是什么”的內容了,經過本文的學習后,相信大家對服務器網絡編程的IO模型是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。