溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

八、網(wǎng)絡(luò)服務(wù)I/O模型

發(fā)布時間:2020-07-07 20:04:03 來源:網(wǎng)絡(luò) 閱讀:529 作者:少年不在了 欄目:建站服務(wù)器

8.1、四種的I/O模型

  在操作系統(tǒng)中,進(jìn)程無法直接操作I/O設(shè)備,其必須通過系統(tǒng)調(diào)用請求kernel來協(xié)助完成I/O動作,而內(nèi)核會為每個I/O設(shè)備維護(hù)一個buffer。進(jìn)程與I/O之間的通信模型如圖所示。

八、網(wǎng)絡(luò)服務(wù)I/O模型

  對于輸入而言,等待(wait)數(shù)據(jù)輸入至buffer需要時間,而從buffer復(fù)制(copy)數(shù)據(jù)至進(jìn)程也需要時間。根據(jù)調(diào)用者與被調(diào)用者的不同就有四種I/0模型。

調(diào)用者處理措施:
  阻塞:進(jìn)程發(fā)起 I/O 調(diào)用, 未完成之前,當(dāng)前進(jìn)程會被掛起;

  非阻塞:進(jìn)程發(fā)起 I/O 調(diào)用,被調(diào)用函數(shù)完成之前不會阻塞當(dāng)前進(jìn)程,而是立即返回;

被調(diào)用者響應(yīng):

  同步:進(jìn)程發(fā)起一個過程調(diào)用(功能、函數(shù))調(diào)用后,在沒得到結(jié)果之前,該調(diào)用將不會返回;
  異步:進(jìn)程發(fā)起一個過程調(diào)用后,即使調(diào)用者不能立即得結(jié)果,但調(diào)用卻會返回,返回是未未完成     狀態(tài);當(dāng)調(diào)用完成后,內(nèi)核會自行通知調(diào)用者結(jié)果已經(jīng) OK;

八、網(wǎng)絡(luò)服務(wù)I/O模型

8.2、五種網(wǎng)絡(luò)服務(wù)I/0模型

 根據(jù)等待模式不同,I/O動作可分為五種模式:

同步阻塞進(jìn)程會一直阻塞,直到數(shù)據(jù)拷貝完成

八、網(wǎng)絡(luò)服務(wù)I/O模型

同步非阻塞非阻塞IO通過進(jìn)程反復(fù)調(diào)用IO函數(shù)(多次系統(tǒng)調(diào)用,并馬上返回);在數(shù)據(jù)拷貝的過程中,進(jìn)程是阻塞的。

八、網(wǎng)絡(luò)服務(wù)I/O模型

I/O 復(fù)用:主要是select和epoll;對一個IO端口,兩次調(diào)用,兩次返回,比阻塞IO并沒有什么優(yōu)越性;關(guān)鍵是能實現(xiàn)同時對多個IO端口進(jìn)行監(jiān)聽。

八、網(wǎng)絡(luò)服務(wù)I/O模型

異步IO:數(shù)據(jù)拷貝的時候進(jìn)程無需阻塞。

八、網(wǎng)絡(luò)服務(wù)I/O模型

信號驅(qū)動:兩次調(diào)用,兩次返回。

八、網(wǎng)絡(luò)服務(wù)I/O模型

五種IO模型的比較:

八、網(wǎng)絡(luò)服務(wù)I/O模型

8.3、select/poll/epoll

select

  本質(zhì)上是通過設(shè)置或者檢查存放fd標(biāo)志位的數(shù)據(jù)結(jié)構(gòu)來進(jìn)行下一步處理,但是單個進(jìn)程可監(jiān)視的fd數(shù)量被限制,即能監(jiān)聽端口的大小有限。對socket進(jìn)行掃描時是線性掃描,即采用輪詢的方法,效率較低,需要維護(hù)一個用來存放大量fd的數(shù)據(jù)結(jié)構(gòu),這樣會使得用戶空間和內(nèi)核空間在傳遞該結(jié)構(gòu)時復(fù)制開銷大。 

# cat /proc/sys/fs/file-max    #查看可監(jiān)聽fd的數(shù)量

poll

  本質(zhì)上和select沒有區(qū)別,它將用戶傳入的數(shù)組拷貝到內(nèi)核空間,然后查詢每個fd對應(yīng)的設(shè)備狀態(tài),其沒有最大連接數(shù)的限制,原因是它是基于鏈表來存儲的,但是同樣有一個缺點(diǎn):大量的fd的數(shù)組被整體復(fù)制于用戶態(tài)和內(nèi)核地址空間之間,而不管這樣的復(fù)制是不是有意。 poll還有一個特點(diǎn)是“水平觸發(fā)”,如果報告了fd后,沒有被處理,那么下次poll時會再次報告該fd。

epoll

  支持水平觸發(fā)和邊緣觸發(fā),最大的特點(diǎn)在于邊緣觸發(fā),它只告訴進(jìn)程哪些fd剛剛變?yōu)榫托钁B(tài),并且只會通知一次。 使用“事件”的就緒通知方式,通過epoll_ctl注冊fd,一旦該fd就緒,內(nèi)核就會采用類似callback的回調(diào)機(jī)制來激活該fd,epoll_wait便可以收到通知。

  其優(yōu)點(diǎn)是沒有最大并發(fā)連接的限制:能打開的FD的上限遠(yuǎn)大于1024(1G的內(nèi)存上能監(jiān)聽約10萬個端口)效率提升:非輪詢的方式,不會隨著FD數(shù)目的增加而效率下降;只有活躍可用的FD才會調(diào)用callback函數(shù),即epoll最大的優(yōu)點(diǎn)就在于它只管理“活躍”的連接,而跟連接總數(shù)無關(guān)。使用內(nèi)存拷貝方式,利用mmap()文件映射內(nèi)存加速與內(nèi)核空間的消息傳遞;即epoll使用mmap減少復(fù)制開銷。 

  


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI