溫馨提示×

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

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

Linux的I/O機(jī)制怎么理解

發(fā)布時(shí)間:2021-11-23 15:51:11 來(lái)源:億速云 閱讀:109 作者:iii 欄目:系統(tǒng)運(yùn)維

本篇內(nèi)容主要講解“Linux的I/O機(jī)制怎么理解”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Linux的I/O機(jī)制怎么理解”吧!

你真的了解多線程嗎?

如果問(wèn)你“為什么多線程可以提高程序運(yùn)行效率?”,想必你會(huì)說(shuō)“計(jì)算機(jī)并行執(zhí)行任務(wù)啊,當(dāng)然效率高!” 這顯然不是一個(gè)內(nèi)行該給出的答案。要知道,一個(gè) CPU  在任何時(shí)間點(diǎn)上只能干一件事情啊,如果執(zhí)行了指令 A,就不能執(zhí)行指令 B 了,何來(lái)并行呢?想要真正理解多線程,必須得先弄清 Linux 中的 I/O  機(jī)制。

什么是 Linux I/O ?

一般指文件讀取/寫(xiě)入、網(wǎng)卡讀取/寫(xiě)入。不管是文件 I/O,還是網(wǎng)卡 I/O,其準(zhǔn)備數(shù)據(jù)速度都遠(yuǎn)遠(yuǎn)低于 CPU 處理數(shù)據(jù)的速度  。磁盤(pán)讀數(shù)據(jù),毫秒級(jí)別,最慢。其次是網(wǎng)卡,微秒。再就是內(nèi)存,納秒,最快的是緩存。

下圖顯示了一個(gè) Linux 進(jìn)程(只有一個(gè)主線程)的執(zhí)行過(guò)程:

Linux的I/O機(jī)制怎么理解

用戶(hù)進(jìn)程向 CPU 發(fā)起 read 請(qǐng)求,CPU 向 DMA 發(fā)起 I/O 請(qǐng)求,DMA 再向磁盤(pán)發(fā)起 I/O 請(qǐng)求。這里的 DMA 全稱(chēng)為 Direct  Memory Access,你可以簡(jiǎn)單理解為 CPU 內(nèi)存和磁盤(pán)之間的代理。

磁盤(pán)向 CPU 發(fā)起 I/O 中斷,CPU 拷貝數(shù)據(jù),先是內(nèi)核態(tài) buffer,再到用戶(hù)態(tài) buffer。

用戶(hù)進(jìn)程從內(nèi)核態(tài)切回用戶(hù)態(tài),阻塞狀態(tài)結(jié)束,程序繼續(xù)執(zhí)行,直到結(jié)束。

上述流程中,用戶(hù)進(jìn)程在拿到磁盤(pán)數(shù)據(jù)之前,只能原地等待,也就是處于阻塞狀態(tài),這個(gè)時(shí)候 CPU 就空閑了,顯然造成了 CPU  資源的浪費(fèi)。這個(gè)時(shí)候如果在該進(jìn)程內(nèi)拉起另一個(gè)線程 T,那么 T 就可以見(jiàn)縫插針,在主線程等待數(shù)據(jù)的過(guò)程中, 把 CPU  的閑置資源利用起來(lái),豈不美哉!這就是多線程技術(shù)的由來(lái)。

總有一些概念把人繞暈 -- 同步/異步、阻塞/非阻塞

在學(xué)習(xí)多線程技術(shù)的過(guò)程中,總有一些概念時(shí)不時(shí)蹦出來(lái),比如同步/異步、阻塞/非阻塞,如果你是一位并發(fā)領(lǐng)域的高手,那么這些都是小兒科。如果你是一位初學(xué)者,那么你很可能陷入其中,不能自拔,從而最終放棄。接下來(lái),我們嘗試終結(jié)這個(gè)問(wèn)題,帶你爬出這個(gè)坑。

舉個(gè)例子:

假如某一天你要去銀行辦理某項(xiàng)業(yè)務(wù),到了銀行,首先要憑身份證取個(gè)號(hào)。取完號(hào)之后,你發(fā)現(xiàn)這天人特別多,于是你就要等,等著被叫號(hào)。在等待的過(guò)程中,你可以有以下幾個(gè)選擇:

選擇 1:  啥也不干,死盯著銀行的液晶顯示屏,等到出現(xiàn)你的號(hào)碼時(shí),你趕緊起身直奔柜臺(tái),銀行叫號(hào)系統(tǒng)甚至還沒(méi)來(lái)得及叫你的號(hào)。那么,在這段時(shí)間內(nèi),你就處于阻塞狀態(tài),而且你和銀行叫號(hào)系統(tǒng)之間的關(guān)系是同步的。“阻塞”好理解,因?yàn)槟闵兑矝](méi)干嘛!“同步”怎么理解呢?因?yàn)槟愫豌y行叫號(hào)系統(tǒng)的步調(diào)要保持一致,當(dāng)顯示屏上出現(xiàn)你的號(hào)時(shí),你就得立馬去柜臺(tái)辦業(yè)務(wù),而銀行自動(dòng)廣播喊你的功能對(duì)你來(lái)說(shuō),是沒(méi)必要的。

選擇  2:你還是啥也不干,但是你坐在座位上開(kāi)始冥想,做著白日夢(mèng)。因?yàn)槟阒?,輪到你的時(shí)候,銀行叫號(hào)系統(tǒng)會(huì)廣播叫你的。聽(tīng)到廣播后,你再起身去柜臺(tái)也不遲。那么在這段時(shí)間內(nèi),你還是處于阻塞狀態(tài)。而你和銀行叫號(hào)系統(tǒng)之間的關(guān)系是異步的,因?yàn)槟悴挥迷訇P(guān)注屏幕上滾動(dòng)的號(hào)碼,輪到你的時(shí)候,自然它會(huì)廣播告訴你。

選擇  3:對(duì)于一個(gè)聰明的人,顯然不會(huì)坐在那傻等或者胡思亂想了。這時(shí)候,你拿起手機(jī),決定打一把王者榮耀,打游戲的過(guò)程中,你還是時(shí)不時(shí)瞄一眼顯示屏,等看到你的號(hào)碼時(shí),立馬起身去柜臺(tái)。那么這段時(shí)間內(nèi),你就處于非阻塞狀態(tài),因?yàn)槟氵€干其他事了呀。但你和銀行叫號(hào)系統(tǒng)間的關(guān)系還是同步的。

選擇  4:如果你打算專(zhuān)心致志地玩一把王者榮耀,不想坑隊(duì)友。那么你就等著廣播叫你就可以了。那么這段時(shí)間內(nèi),你就處于非阻塞的狀態(tài),而且和銀行叫號(hào)系統(tǒng)之間的關(guān)系還是異步的。

好了,總結(jié)一下:

所謂阻塞就是請(qǐng)求者發(fā)起讀取數(shù)據(jù)的函數(shù)調(diào)用時(shí),當(dāng)數(shù)據(jù)還沒(méi)準(zhǔn)備好,這時(shí)如果函數(shù)一直在等待返回結(jié)果,就是阻塞;反之如果函數(shù)即刻返回,繼續(xù)執(zhí)行后面的動(dòng)作就是非阻塞。

在 I/O  模型里,如果請(qǐng)求方從發(fā)起請(qǐng)求到數(shù)據(jù)最后準(zhǔn)備好的這一段過(guò)程中都需要自己參與,那么這種我們稱(chēng)為同步請(qǐng)求;反之,如果應(yīng)用發(fā)送完指令后就不再參與過(guò)程了,只需要等待最終完成結(jié)果的通知,那么這就屬于異步。

哦,對(duì)了。上述選擇 2 你也可以認(rèn)為是 選擇 4,因?yàn)槟阒灰却y行廣播叫你就可以呀,做白日夢(mèng)也可以認(rèn)為是在干自己的事嘛!

Linux的I/O機(jī)制怎么理解

再談多線程

所謂多線程,就是多個(gè)線程在一個(gè)進(jìn)程里同時(shí)運(yùn)行,它們之間可以是協(xié)作的關(guān)系,一起完成某個(gè)共同的任務(wù),也可以各干各的事。不管協(xié)作,還是單干,總有一個(gè)問(wèn)題繞不開(kāi):“CPU  的資源怎么分配?”多線程之間爭(zhēng)奪資源的過(guò)程可以認(rèn)為是一種“零和博弈”,線程 A 搶奪的資源多,那么線程 B 得到的資源必然就少了嘛!一般來(lái)說(shuō),用戶(hù)只會(huì)關(guān)心  CPU 總的利用率,這個(gè)值越大越好,而不用關(guān)注具體每個(gè)線程得到的計(jì)算資源是多是少。

到此,相信大家對(duì)“Linux的I/O機(jī)制怎么理解”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向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