溫馨提示×

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

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

網(wǎng)絡(luò)編程之五種I/O模型

發(fā)布時(shí)間:2020-07-30 10:06:19 來(lái)源:網(wǎng)絡(luò) 閱讀:1431 作者:ye小灰灰 欄目:網(wǎng)絡(luò)安全


一.概述:

在網(wǎng)絡(luò)編程中,阻塞、非阻塞、同步、異步經(jīng)常被提到,下面我先談以下我所理解的在I/O中的阻塞、非阻塞、同步、異步。

五種I/O模型分別是阻塞式I/O,非阻塞式I/O,信號(hào)驅(qū)動(dòng),I/O復(fù)用(這四種是同步I/O),異步I/O。

我來(lái)舉一個(gè)例子來(lái)解釋這五種I/O模型:

有A,B,C,D,E五個(gè)人在釣魚(yú):
A用的是最老式的魚(yú)竿,所以呢,得一直守著,等到魚(yú)上鉤了再拉桿。(阻塞式I/O)


B呢,它的魚(yú)竿比較新,不怕魚(yú)上鉤后把魚(yú)竿拽走,所以他一邊看手機(jī),一邊時(shí)不時(shí)看一下魚(yú)竿是否有魚(yú)上鉤,有的話就迅速拉魚(yú)竿。(非阻塞式I/O)


C的魚(yú)竿有個(gè)功能,能夠顯示是否有魚(yú)上鉤,所以呢,B就和旁邊的MM聊天,隔會(huì)再看看有沒(méi)有魚(yú)上鉤,有的話就迅速拉桿。(信號(hào)驅(qū)動(dòng))


D用的魚(yú)竿和C差不多,但他想了一個(gè)好辦法,就是同時(shí)放好幾根魚(yú)竿,然后守在旁邊,一旦有顯示說(shuō)魚(yú)上鉤了,它就將對(duì)應(yīng)的魚(yú)竿拉起來(lái);(I/O復(fù)用)


E是個(gè)有錢人(有錢人了不起?。?,干脆雇了一個(gè)人幫他釣魚(yú),一旦那個(gè)人把魚(yú)釣上來(lái)了,就給E發(fā)個(gè)短信。(異步I/O)


下面我先談以下我所理解的在I/O中的阻塞、非阻塞、同步、異步。



二.I/O操作過(guò)程:

首先,進(jìn)行I/O操作涉及到了硬件,所以就會(huì)和操作系統(tǒng)打交道。(從網(wǎng)卡這兩個(gè)讀取/發(fā)送數(shù)據(jù)到網(wǎng)絡(luò)中是操作系統(tǒng)做的)所以,先解釋以下我理解的I/O過(guò)程(總的來(lái)說(shuō)是   等數(shù)據(jù) 和  數(shù)據(jù)搬遷   這兩個(gè)過(guò)程)


首先,通過(guò)系統(tǒng)給我們的API函數(shù)調(diào)用I/O操作(此時(shí)在用戶態(tài)),這個(gè)函數(shù)先等待I/O緩存中有數(shù)據(jù),操作系統(tǒng)會(huì)監(jiān)測(cè)I/O緩存(此時(shí)在內(nèi)核態(tài)),當(dāng)I/O緩存中接收到數(shù)據(jù)時(shí),操作系統(tǒng)先通知這個(gè)函數(shù)調(diào)用(進(jìn)入用戶態(tài)),然后這個(gè)函數(shù)的實(shí)現(xiàn)中會(huì)調(diào)用一些已經(jīng)包裝好的函數(shù),“ 這些 ”函數(shù)會(huì)把數(shù)據(jù)從內(nèi)核中拷貝到用戶緩存區(qū)(先到內(nèi)核態(tài),再到用戶態(tài)),然后這個(gè)函數(shù)就會(huì)返回。

具體如下圖:

網(wǎng)絡(luò)編程之五種I/O模型



三.I/O操作中的阻塞、非阻塞、同步、異步:

(1).同步:同步就是在一個(gè)功能調(diào)用時(shí),在這個(gè)調(diào)用沒(méi)有得到結(jié)果之前,這個(gè)調(diào)用不會(huì)返回。(在I/O操作中,如調(diào)用read函數(shù),這個(gè)函數(shù)會(huì)被阻塞在read函數(shù)調(diào)用處,但內(nèi)核一直在做與read相關(guān)的事情,也就是這個(gè)函數(shù)是激活的(會(huì)占用cpu),只是從表面上看函數(shù)還沒(méi)有返回而已)。


(2).阻塞:阻塞調(diào)用就是調(diào)用一個(gè)函數(shù),這個(gè)調(diào)用結(jié)果沒(méi)有得到結(jié)果之前,執(zhí)行這個(gè)函數(shù)的線程會(huì)被掛起(這個(gè)狀態(tài)下,cpu不會(huì)給該函數(shù)分配時(shí)間片),直到得到結(jié)果后才返回。


(3).非阻塞:是指如果一個(gè)函數(shù)不能立刻得到結(jié)果,這個(gè)函數(shù)不會(huì)阻塞該線程而立即返回。


(4).異步:是指在一個(gè)功能調(diào)用時(shí),這個(gè)調(diào)用不會(huì)立即得到結(jié)果,也不會(huì)阻塞該線程,這個(gè)調(diào)用所在的線程會(huì)繼續(xù)執(zhí)行其它事情,而這個(gè)功能是由其它執(zhí)行部件來(lái)完成,當(dāng)這個(gè)部件執(zhí)行完該功能時(shí),通過(guò)狀態(tài),通知來(lái)通知調(diào)用者,或通過(guò)回調(diào)函數(shù)處理這個(gè)調(diào)用。


執(zhí)行部件和調(diào)用者可以通過(guò)三種途徑返回結(jié)果:
a.   狀態(tài)、
b.   通知、
c.   回調(diào)函數(shù)。

使用哪一種依賴于執(zhí)行部件的實(shí)現(xiàn),除非執(zhí)行部件提供多種選擇,否則不受調(diào)用者控制。

a. 如果執(zhí)行部件用狀態(tài)來(lái)通知,
    那么調(diào)用者就需要每隔一定時(shí)間檢查一次,效率就很低

b. 如果是使用通知的方式,
    效率則很高,因?yàn)閳?zhí)行部件幾乎不需要做額外的操作。

c. 至于回調(diào)函數(shù),
    和通知沒(méi)太多區(qū)別。




四.五種I/O模型:(理解了上面的知識(shí),下面應(yīng)該比較容易理解了)

(1).阻塞式I/O:

  應(yīng)用程序調(diào)用一個(gè)IO函數(shù),導(dǎo)致應(yīng)用程序阻塞,等待數(shù)據(jù)準(zhǔn)備好。 如果數(shù)據(jù)沒(méi)有準(zhǔn)備好,一直等待….數(shù)據(jù)準(zhǔn)備好了,從內(nèi)核拷貝到用戶空間,IO函數(shù)返回成功指示。

如下圖:

網(wǎng)絡(luò)編程之五種I/O模型


(2).非阻塞式I/O:

在非阻塞I/O中,一定要把一個(gè)I/O操作函數(shù)放在一個(gè)死循環(huán)中,直到這個(gè)I/O函數(shù)返回一個(gè)正確值時(shí)才跳出這個(gè)循環(huán)。

我們把一個(gè)SOCKET接口設(shè)置為非阻塞就是告訴內(nèi)核,當(dāng)所請(qǐng)求的I/O操作無(wú)法完成時(shí),不要將線程睡眠,而是返回一個(gè)錯(cuò)誤。這樣我們的I/O操作函數(shù)將不斷的測(cè)試數(shù)據(jù)是否已經(jīng)準(zhǔn)備好,如果沒(méi)有準(zhǔn)備好,繼續(xù)測(cè)試,直到數(shù)據(jù)準(zhǔn)備好為止。在這個(gè)不斷測(cè)試的過(guò)程中,會(huì)大量的占用CPU的時(shí)間。

如下圖:

網(wǎng)絡(luò)編程之五種I/O模型


(3).信號(hào)驅(qū)動(dòng):

 首先要允許接口進(jìn)行信號(hào)驅(qū)動(dòng)I/O,然后安裝一個(gè)信號(hào)處理函數(shù),線程繼續(xù)運(yùn)行并不阻塞。當(dāng)數(shù)據(jù)準(zhǔn)備好時(shí),線程會(huì)收到一個(gè)SIGIO信號(hào),可以在信號(hào)處理函數(shù)中調(diào)用I/O操作函數(shù)處理數(shù)據(jù)。

如下圖:

網(wǎng)絡(luò)編程之五種I/O模型


(4).I/O復(fù)用:

I/O 復(fù)用模型會(huì)用到select、poll、epoll函數(shù),這幾個(gè)函數(shù)也會(huì)使進(jìn)程阻塞,但是和阻塞I/O所不同的,這幾個(gè)函數(shù)可以同時(shí)阻塞多個(gè)I/O操 作。而且可以同時(shí)對(duì)多個(gè)讀操作,多個(gè)寫操作的I/O函數(shù)進(jìn)行檢測(cè),直到有數(shù)據(jù)可讀或可寫時(shí),才真正調(diào)用I/O操作函數(shù)。(比阻塞式I/O并沒(méi)有上面優(yōu)越性,但它實(shí)現(xiàn)了對(duì)多個(gè)I/O端口的監(jiān)聽(tīng))

如下圖:

網(wǎng)絡(luò)編程之五種I/O模型



(5).異步I/O:

當(dāng)一個(gè)異步過(guò)程調(diào)用發(fā)出后,調(diào)用者不能立刻得到結(jié)果。實(shí)際處理這個(gè)調(diào)用的部件在完成后,通過(guò)狀態(tài)、通知和回調(diào)來(lái)通知調(diào)用者的輸入輸出操作。

如下圖:

網(wǎng)絡(luò)編程之五種I/O模型




六.五種I/O模型比較:

網(wǎng)絡(luò)編程之五種I/O模型





七.總結(jié):

理解五種I/O模型應(yīng)該先理解I/O操作過(guò)程,并理解阻塞,非阻塞,同步,異步的一些知識(shí)。

I/O操作要和硬件打交道,所以會(huì)I/O操作過(guò)程會(huì)涉及到操作系統(tǒng)。

處理I/O操作分為兩個(gè)過(guò)程,一是等待數(shù)據(jù),二是把數(shù)據(jù)從內(nèi)核中搬到用戶空間。

這五中I/O模型的不同之處是在等待數(shù)據(jù)的方式上,在第二個(gè)過(guò)程中是一樣的,都是把數(shù)據(jù)從內(nèi)核中搬到用戶空間,然后進(jìn)行相關(guān)操作。


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

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

AI