您好,登錄后才能下訂單哦!
8.1、四種的I/O模型
在操作系統中,進程無法直接操作I/O設備,其必須通過系統調用請求kernel來協助完成I/O動作,而內核會為每個I/O設備維護一個buffer。進程與I/O之間的通信模型如圖所示。
對于輸入而言,等待(wait)數據輸入至buffer需要時間,而從buffer復制(copy)數據至進程也需要時間。根據調用者與被調用者的不同就有四種I/0模型。
調用者處理措施: 阻塞:進程發起 I/O 調用, 未完成之前,當前進程會被掛起; 非阻塞:進程發起 I/O 調用,被調用函數完成之前不會阻塞當前進程,而是立即返回; 被調用者響應: 同步:進程發起一個過程調用(功能、函數)調用后,在沒得到結果之前,該調用將不會返回;異步:進程發起一個過程調用后,即使調用者不能立即得結果,但調用卻會返回,返回是未未完成 狀態;當調用完成后,內核會自行通知調用者結果已經 OK; |
8.2、五種網絡服務I/0模型
根據等待模式不同,I/O動作可分為五種模式:
同步阻塞:進程會一直阻塞,直到數據拷貝完成。
同步非阻塞:非阻塞IO通過進程反復調用IO函數(多次系統調用,并馬上返回);在數據拷貝的過程中,進程是阻塞的。
I/O 復用:主要是select和epoll;對一個IO端口,兩次調用,兩次返回,比阻塞IO并沒有什么優越性;關鍵是能實現同時對多個IO端口進行監聽。
異步IO:數據拷貝的時候進程無需阻塞。
信號驅動:兩次調用,兩次返回。
五種IO模型的比較:
8.3、select/poll/epoll
select
本質上是通過設置或者檢查存放fd標志位的數據結構來進行下一步處理,但是單個進程可監視的fd數量被限制,即能監聽端口的大小有限。對socket進行掃描時是線性掃描,即采用輪詢的方法,效率較低,需要維護一個用來存放大量fd的數據結構,這樣會使得用戶空間和內核空間在傳遞該結構時復制開銷大。
# cat /proc/sys/fs/file-max #查看可監聽fd的數量
poll
本質上和select沒有區別,它將用戶傳入的數組拷貝到內核空間,然后查詢每個fd對應的設備狀態,其沒有最大連接數的限制,原因是它是基于鏈表來存儲的,但是同樣有一個缺點:大量的fd的數組被整體復制于用戶態和內核地址空間之間,而不管這樣的復制是不是有意。 poll還有一個特點是“水平觸發”,如果報告了fd后,沒有被處理,那么下次poll時會再次報告該fd。
epoll
支持水平觸發和邊緣觸發,最大的特點在于邊緣觸發,它只告訴進程哪些fd剛剛變為就需態,并且只會通知一次。 使用“事件”的就緒通知方式,通過epoll_ctl注冊fd,一旦該fd就緒,內核就會采用類似callback的回調機制來激活該fd,epoll_wait便可以收到通知。
其優點是沒有最大并發連接的限制:能打開的FD的上限遠大于1024(1G的內存上能監聽約10萬個端口)效率提升:非輪詢的方式,不會隨著FD數目的增加而效率下降;只有活躍可用的FD才會調用callback函數,即epoll最大的優點就在于它只管理“活躍”的連接,而跟連接總數無關。使用內存拷貝方式,利用mmap()文件映射內存加速與內核空間的消息傳遞;即epoll使用mmap減少復制開銷。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。