成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux-I/O模型詳解

系統(tǒng) Linux
I/O通常有內(nèi)存IO、網(wǎng)絡(luò)I/O、磁盤I/O等,但我們通常說的是網(wǎng)絡(luò)I/O以及磁盤I/O。網(wǎng)絡(luò)I/O:本質(zhì)是socket讀取。

I/O介紹

I/O通常有內(nèi)存IO、網(wǎng)絡(luò)I/O、磁盤I/O等,但我們通常說的是網(wǎng)絡(luò)I/O以及磁盤I/O。網(wǎng)絡(luò)I/O:本質(zhì)是socket讀取

每次I/O請(qǐng)求,都會(huì)有兩個(gè)階段組成: 第一步:等待數(shù)據(jù),即數(shù)據(jù)從磁盤到內(nèi)核內(nèi)存;將數(shù)據(jù)從磁盤文件先加載到內(nèi)核內(nèi)存空間(緩沖區(qū)),等待數(shù)據(jù)準(zhǔn)備完成,時(shí)間較長(zhǎng)。第二步:復(fù)制數(shù)據(jù),即數(shù)據(jù)內(nèi)核內(nèi)存到進(jìn)程內(nèi)存;將數(shù)據(jù)從內(nèi)核緩沖復(fù)制到用戶空間的進(jìn)程內(nèi)存中,時(shí)間較短。

Web請(qǐng)求處理過程

1.客戶端發(fā)起情況到服務(wù)器網(wǎng)卡

2.服務(wù)器網(wǎng)卡接受到請(qǐng)求后轉(zhuǎn)交給內(nèi)核處理

3.內(nèi)核根據(jù)請(qǐng)求對(duì)應(yīng)的套接字,將請(qǐng)求交給工作在用戶空間的Web服務(wù)器進(jìn)程

4.Web服務(wù)器進(jìn)程根據(jù)用戶請(qǐng)求,向內(nèi)核進(jìn)行系統(tǒng)調(diào)用,申請(qǐng)獲取相應(yīng)資源(如:客戶端獲取圖片)

5.內(nèi)核發(fā)現(xiàn)Web服務(wù)器進(jìn)程請(qǐng)求的是一個(gè)存放在本地硬盤上的資源,因此通過驅(qū)動(dòng)程序連接磁盤

6.內(nèi)核調(diào)用磁盤,獲取需要的資源

7.內(nèi)核將資源存放在自己的緩存區(qū)中,并通知Web服務(wù)器進(jìn)程

8.Web服務(wù)器進(jìn)程通過系統(tǒng)調(diào)用取得資源,并將其復(fù)制到進(jìn)程自己的緩沖區(qū)中

9.Web服務(wù)器進(jìn)程形成響應(yīng),通過系統(tǒng)調(diào)用再次發(fā)給內(nèi)核以響應(yīng)請(qǐng)求

10.內(nèi)核將響應(yīng)發(fā)送至網(wǎng)卡

11.網(wǎng)卡發(fā)送響應(yīng)給用戶

通過這樣的一個(gè)復(fù)雜過程,一次請(qǐng)求就完成了

簡(jiǎn)單來說就是:

用戶請(qǐng)求——》送達(dá)用戶空間——〉系統(tǒng)調(diào)用——》內(nèi)核空間——〉內(nèi)核到磁盤上讀取圖片資源——》返回到用戶空間——〉響應(yīng)給用戶

上述簡(jiǎn)單的說明了一下,客戶端向Web服務(wù)器請(qǐng)求過程,在這個(gè)過程中,有兩個(gè)I/O過程:一是客戶端請(qǐng)求的網(wǎng)絡(luò)I/O,二個(gè)是Web服務(wù)器請(qǐng)求圖片磁盤I/O。

I/O模型名詞介紹

說到I/O模型,都會(huì)牽扯到同步、異步、阻塞、非阻塞這幾個(gè)詞,以下講解這幾個(gè)詞的概念。

阻塞和非阻塞

阻塞和非阻塞指的是執(zhí)行一個(gè)操作時(shí)等操作結(jié)束再返回結(jié)果,還是馬上返回結(jié)果。

阻塞(blocking):指IO操作需要徹底完成后才返回到用戶空間,調(diào)用結(jié)果返回之前,調(diào)用者被掛起(當(dāng)前線程進(jìn)入非可執(zhí)行狀態(tài),在這個(gè)狀態(tài),CPU不會(huì)分配時(shí)間片,線程暫停運(yùn)行)只有到到結(jié)果才進(jìn)入活動(dòng)狀態(tài);

阻塞例子:海底撈的服務(wù)器為你點(diǎn)菜,當(dāng)你點(diǎn)完菜后,服務(wù)員把消息傳到后廚,這時(shí)你就在餐桌上等待,直到廚師把湯鍋和配菜都準(zhǔn)備好以后送到你桌上,你才能開吃。在上菜的過程中你還不能離開,因?yàn)槟汶x開了之后服務(wù)員上菜了卻找不到你人,所以你就是能等待,這個(gè)時(shí)候你處于阻塞等待狀態(tài),就是前面說的,你是調(diào)用者,你被掛起了,進(jìn)入了非可執(zhí)行狀態(tài)。

非阻塞(nonblocking):指I/O操作被調(diào)用后立即返回給用戶一個(gè)狀態(tài)值,無需等到I/O操作徹底完成,最終的調(diào)用結(jié)果返回之前,調(diào)用者不會(huì)被掛起;

非阻塞例子:海底撈的服務(wù)器為你點(diǎn)菜,當(dāng)你點(diǎn)完菜后,服務(wù)員把消息傳到后廚,過了三分鐘,你跑到后廚問,我的鍋底或者肥牛卷好了沒有?后廚說沒好,然后你去處理其它事情,然后又過了五分鐘,你又跑到后廚問,我的某個(gè)菜好了沒有,如果沒有,你還是繼續(xù)做其他事情,然后等會(huì)再問一次,這個(gè)時(shí)候就是在I/O操作的同時(shí),你沒有被掛起,可以操作其他事情,但是如果I/O操作完成,你需要立馬接受。

同步和異步

同步/異步關(guān)注的是消息通信機(jī)制

同步(synchronous):調(diào)用者等待被調(diào)用者返回消息,才能繼續(xù)執(zhí)行。同步阻塞例子:去餐館吃飯,點(diǎn)了一個(gè)蓋澆飯,然后在餐桌上一直等到蓋澆飯做好,自己端到餐桌就餐。這就是典型的同步阻塞。當(dāng)廚師給你做飯的時(shí)候,你需要一直在那里等著。

同步非阻塞例子:去餐館吃飯,點(diǎn)了一個(gè)蓋澆飯,你點(diǎn)完飯之后,過了幾分鐘感覺時(shí)間差不多了,就去問老板飯做好了沒有,如果好了就去端,如果沒好等一會(huì)再去問,實(shí)時(shí)同步做飯進(jìn)度,依次循環(huán)去問直到飯做好,這就是同步非阻塞。 異步(asynchronous):被調(diào)用者通過狀態(tài)、通知或回調(diào)機(jī)制主動(dòng)通知調(diào)用者被調(diào)用者的運(yùn)行狀態(tài)。

I/O模型類型

IO模型分為以下五類

1.阻塞型:所有過程全阻塞

2.非阻塞型:如果沒有數(shù)據(jù)buffer,則立即返回EWOULDBLOCK

3.I/O復(fù)用型(select和poll):在wait和copy階段分別阻塞

4.信號(hào)驅(qū)動(dòng)型I/O(SIGIO):在wait階段不阻塞,但copy階段阻塞(信號(hào)驅(qū)動(dòng)I/O),即通知

5.異步I/O(AIO):完全無阻塞方式,當(dāng)I/O完成時(shí)提供信號(hào)

阻塞I/O

說明:應(yīng)用程序調(diào)用一個(gè)IO的recvfrom函數(shù),會(huì)導(dǎo)致應(yīng)用程序阻塞,進(jìn)入阻塞狀態(tài)后直到I/O操作結(jié)束才會(huì)返回;如果系統(tǒng)內(nèi)核數(shù)據(jù)沒有準(zhǔn)備好,那就一直等待數(shù)據(jù)準(zhǔn)備,因?yàn)槭钦{(diào)用了recvfrom函數(shù)導(dǎo)致了應(yīng)用程序阻塞,所以一直在等,做不了任何事情,內(nèi)核數(shù)據(jù)準(zhǔn)備好之后把數(shù)據(jù)從內(nèi)核拷貝到用戶空間,拷貝結(jié)束后,I/O函數(shù)返回成功指示。注:其阻塞時(shí)在I/O操作階段

非阻塞I/O

說明:用戶線程發(fā)起IO請(qǐng)求時(shí)立即返回。但并未讀取到任何數(shù)據(jù),則返回字段為“EWOULDBLOCK”,用戶線程需要不斷地發(fā)起IO請(qǐng)求,直到數(shù)據(jù)到達(dá)后,才真正讀取到數(shù)據(jù),繼續(xù)執(zhí)行。即“輪詢”機(jī)制。整個(gè)IO請(qǐng)求過程中,雖然用戶線程每次發(fā)起IO請(qǐng)求后可以立即返回,但是為了等到數(shù)據(jù)。仍需要不斷地輪詢、重復(fù)請(qǐng)求、消耗了大量的CPU資源;是比較浪費(fèi)CPU的方式,一般很少用這種模型,而是在其他模型中使用非阻塞IO這一特性。

I/O復(fù)用(select和poll)

說明:I/O復(fù)用模型會(huì)用到select或poll函數(shù),在I/O復(fù)用模型中,并不是阻塞到I/O操作過程中,而是阻塞到select或者poll函數(shù)中;以select為例:進(jìn)程在select處阻塞,等待幾個(gè)描述符中的一個(gè)變?yōu)榭刹僮鳎绻麤]等待到就繼續(xù)阻塞在第一階段,如果等到了一個(gè)描述符變?yōu)榱丝刹僮鳎瑒t調(diào)用recvfrom函數(shù)將數(shù)據(jù)拷貝到應(yīng)用緩沖區(qū)。

信號(hào)驅(qū)動(dòng)I/O(SIGIO)

說明:首先,我們?cè)试S套接口進(jìn)行信號(hào)驅(qū)動(dòng)I/O,并安裝一個(gè)信號(hào)處理函數(shù)SIGIO,如果數(shù)據(jù)沒有準(zhǔn)備好,則立即返回結(jié)果,進(jìn)程繼續(xù)工作并不阻塞。當(dāng)數(shù)據(jù)準(zhǔn)備好時(shí),系統(tǒng)內(nèi)核會(huì)主動(dòng)發(fā)送一個(gè)SIGIO信號(hào)給應(yīng)用程序,應(yīng)用程序收到信號(hào)后,可以在信號(hào)處理函數(shù)中調(diào)用I/O操作函數(shù)recvfrom進(jìn)行數(shù)據(jù)處理。信號(hào)驅(qū)動(dòng)I/O模型的優(yōu)點(diǎn)是當(dāng)數(shù)據(jù)報(bào)到達(dá)時(shí),可以不阻塞,主循環(huán)可以繼續(xù)執(zhí)行,只是等待處理程序的通知,或者數(shù)據(jù)已經(jīng)準(zhǔn)備好被處理,或者數(shù)據(jù)報(bào)已經(jīng)準(zhǔn)備好被讀了。

異步I/O(AIO)

說明:當(dāng)一個(gè)異步過程調(diào)用發(fā)出后,調(diào)用者不能立刻得到結(jié)果。實(shí)際處理這個(gè)調(diào)用的部件在完成后,通過狀態(tài)通知和回調(diào)通知來告訴調(diào)用者的輸入輸出操作。用戶可以直接對(duì)I/O執(zhí)行讀寫操作,這些操作告訴內(nèi)核用戶讀寫緩沖區(qū)的位置,以及I/O操作完成之后內(nèi)核通知應(yīng)用程序的方式,就是上面講的通過狀態(tài)通知或者回調(diào)通知來告訴調(diào)用者。異步I/O的讀寫操作總是立即返回,但沒有返回結(jié)果說是否阻塞,因?yàn)楫惒絀/O操作真正的讀寫操作已由內(nèi)核接管,內(nèi)核自己對(duì)數(shù)據(jù)處理完成后生成一個(gè)信號(hào),然后通知用戶剛才交給自己的事件已經(jīng)處理完成。

五種I/O模型的總結(jié)及比較

中文圖示如下:

英文圖示如下:

從兩張圖中我們可以看到,越往后,阻塞越少,理論上效率也是最優(yōu)。其中五種I/O模型中,前三種屬于同步I/O,后兩者屬于異步I/O。

同步I/O

阻塞I/O 非阻塞I/O I/O復(fù)用(select和poll)

異步I/O

信號(hào)驅(qū)動(dòng)I/O(SIGIO) 半異步 異步I/O(AIO) 全異步

異步I/O和信號(hào)驅(qū)動(dòng)I/O的區(qū)別

信號(hào)驅(qū)動(dòng)I/O模式下,內(nèi)核可以復(fù)制的時(shí)候通知給我們應(yīng)用程序發(fā)送SIGIO信號(hào)。異步I/O模式下,內(nèi)核在所有的操作由內(nèi)核操作完成后才會(huì)通知我們的應(yīng)用程序。 

 

責(zé)任編輯:龐桂玉 來源: 運(yùn)維派
相關(guān)推薦

2019-02-25 08:40:28

Linux磁盤IO

2020-12-01 07:08:23

Linux網(wǎng)絡(luò)I

2013-09-16 16:07:38

Java基礎(chǔ)IO

2011-01-14 09:25:28

LinuxIO機(jī)制

2017-01-19 19:14:20

Linux重定向命令

2019-09-12 08:58:26

LinuxUNIX操作系統(tǒng)

2021-02-22 17:06:58

Linux改動(dòng)代碼

2021-02-10 08:09:48

Netty網(wǎng)絡(luò)多路復(fù)用

2009-05-14 10:16:36

Oracle優(yōu)化磁盤

2021-11-08 17:03:13

IO模型

2017-03-25 21:33:33

Linux調(diào)度器

2017-03-01 12:36:15

Linux驅(qū)動(dòng)技術(shù)內(nèi)存

2017-01-19 19:24:29

Linux重定向

2010-06-25 09:47:29

Linux系統(tǒng)監(jiān)控

2022-04-23 16:30:22

Linux磁盤性能

2022-12-08 09:10:11

I/O模型Java

2014-07-28 16:47:41

linux性能

2018-03-28 08:52:53

阻塞非阻塞I

2013-05-28 10:08:41

IO輸出

2018-11-05 11:20:54

緩沖IO
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 毛片区 | 国产精品区一区二区三 | av在线影院 | 在线成人免费视频 | 精品亚洲永久免费精品 | 亚洲精品专区 | 久久久一区二区三区 | 精品欧美一区二区三区久久久 | 亚洲人免费视频 | 黄色欧美视频 | 一本一道久久a久久精品综合 | jizjizjiz中国护士18 | 一区二区中文字幕 | 国产成人精品一区二区三区在线 | 亚洲国产一区二区三区在线观看 | 中文字幕一区二区三区乱码在线 | 日韩欧美亚洲 | 国产专区在线 | 97精品一区二区 | 91精品久久久久久久久久入口 | 成人精品一区二区三区中文字幕 | 久久久成人一区二区免费影院 | 黄色毛片在线观看 | 一区二区三区亚洲视频 | 亚洲精品无 | 九九亚洲| 亚洲一区二区免费电影 | 久久99精品国产麻豆婷婷 | 欧美成人性生活 | 国产精品毛片一区二区在线看 | 91高清在线观看 | 国产a区 | 亚洲视频国产视频 | 亚洲视频一区在线播放 | 国产 日韩 欧美 在线 | 蜜桃一区二区三区 | 色在线视频网站 | 欧美在线天堂 | 亚洲欧美一区二区三区国产精品 | 自拍中文字幕 | 国产98色在线 | 日韩 |