日韩av无码中文字幕,国产午夜亚洲精品国产成人小说,成人影院午夜男女爽爽爽,欧美 亚洲 中文 国产 综合

首頁(yè) 熱點(diǎn) 要聞 國(guó)內(nèi) 產(chǎn)業(yè) 財(cái)經(jīng) 滾動(dòng) 理財(cái) 股票

世界看熱訊:阻塞IO、非阻塞IO、IO復(fù)用的區(qū)別?

2023-06-22 03:00:45 來(lái)源 : 面包芯語(yǔ)

前言

在《Unix網(wǎng)絡(luò)編程》一書(shū)中提到了五種IO模型,分別是:阻塞IO、非阻塞IO、IO復(fù)用、信號(hào)驅(qū)動(dòng)IO以及異步IO。本篇文章主要介紹IO的基本概念以及阻塞IO、非阻塞IO、IO復(fù)用三種模型,供大家參考學(xué)習(xí)。


(資料圖片僅供參考)

一、什么是IO

計(jì)算機(jī)視角理解IO:

對(duì)于計(jì)算機(jī)而言,任何涉及到計(jì)算機(jī)核心(CPU和內(nèi)存)與其他設(shè)備間的數(shù)據(jù)轉(zhuǎn)移的過(guò)程就是IO。IO對(duì)于計(jì)算機(jī)而言有兩層意思:

程序視角理解IO:

現(xiàn)代操作系統(tǒng)將空間劃分為用戶(hù)空間和內(nèi)核空間。

操作系統(tǒng)為了能夠正常平穩(wěn)地運(yùn)行下去,它是不會(huì)允許應(yīng)用程序隨意訪(fǎng)問(wèn)計(jì)算機(jī)硬件部分,如內(nèi)存、硬盤(pán)、網(wǎng)卡,應(yīng)用程序必須通過(guò)操作系統(tǒng)提供的API來(lái)訪(fǎng)問(wèn),以達(dá)到安全的訪(fǎng)問(wèn)控制。

總結(jié):IO對(duì)于應(yīng)用程序而言,強(qiáng)調(diào)的是通過(guò)向內(nèi)核發(fā)起系統(tǒng)調(diào)用完成對(duì)I/O的間接訪(fǎng)問(wèn)。

應(yīng)用程序發(fā)起一次IO訪(fǎng)問(wèn)分為兩個(gè)階段:

二、阻塞IO模型

阻塞I/O模型是最常見(jiàn)的IO模型,其流程圖如下所示。

應(yīng)用程序發(fā)起一個(gè)系統(tǒng)調(diào)用(recvform),這個(gè)時(shí)候應(yīng)用程序會(huì)一直阻塞下去,直到內(nèi)核把數(shù)據(jù)準(zhǔn)備好,并將其從內(nèi)核復(fù)制到用戶(hù)空間,復(fù)制完成后返回成功提示,這個(gè)時(shí)候應(yīng)用程序才會(huì)繼續(xù)處理數(shù)據(jù)。

典型的阻塞I/0模型的例子為data=socket.read(),如果內(nèi)核數(shù)據(jù)沒(méi)有準(zhǔn)備就緒,Socket線(xiàn)程就會(huì)一直阻塞在read()中等待內(nèi)核數(shù)據(jù)就緒。

生活場(chǎng)景:某天,你跟你女朋友去奶茶店買(mǎi)奶茶,點(diǎn)完奶茶后后,由于你們不知道奶茶什么時(shí)候才能做好,所以你們就只能一直等著,其他什么事情也不能干。

三、非阻塞 IO模型

在非阻塞IO模型中,應(yīng)用進(jìn)程需要不斷詢(xún)問(wèn)內(nèi)核數(shù)據(jù)是否就緒,在內(nèi)核數(shù)據(jù)還未就緒時(shí),應(yīng)用進(jìn)程還可以做其他事情。

從上圖可以看出, 非阻塞IO模型需要應(yīng)用進(jìn)程不斷地主動(dòng)詢(xún)問(wèn)內(nèi)核數(shù)據(jù)是否已準(zhǔn)備好了。

生活場(chǎng)景:你和你女朋友去奶茶店買(mǎi)奶茶,吸取了上一次的教訓(xùn),點(diǎn)完奶茶后順便去逛了逛商場(chǎng)。由于你們擔(dān)心會(huì)錯(cuò)過(guò)取餐,所以你們就每隔一段時(shí)間就來(lái)問(wèn)下服務(wù)員,你們的奶茶做好了沒(méi)有,來(lái)來(lái)回回好多回,若干次后,終于問(wèn)到奶茶已經(jīng)準(zhǔn)備好了,然后你們就開(kāi)心的喝了起來(lái)。

四、IO復(fù)用模型

非阻塞IO模型需要進(jìn)程不斷地輪詢(xún)發(fā)起recvform系統(tǒng)調(diào)用,就會(huì)有很多的線(xiàn)程不斷調(diào)用recvfrom 請(qǐng)求數(shù)據(jù),先不說(shuō)服務(wù)器能不能扛得住這么多線(xiàn)程,就算扛得住那么很明顯這種方式是不是太浪費(fèi)資源了,線(xiàn)程是我們操作系統(tǒng)的寶貴資源,大量的線(xiàn)程用來(lái)去讀取數(shù)據(jù)了,那么就意味著能做其它事情的線(xiàn)程就會(huì)少。

例如:你是奶茶店的服務(wù)員,每個(gè)人點(diǎn)好奶茶后,每隔幾分鐘就來(lái)問(wèn)你一次好了沒(méi)有,隨著問(wèn)的人越來(lái)越多,你可能會(huì)開(kāi)始懷疑人生。那么有沒(méi)有什么好的解決辦法呢?

答案:不需要所有進(jìn)程輪詢(xún)來(lái)發(fā)起recvform來(lái)查詢(xún)數(shù)據(jù)是否已經(jīng)準(zhǔn)備好了,而是有人幫忙來(lái)詢(xún)問(wèn),這個(gè)幫忙的人就是select。

IO復(fù)用模型如下所示:

多個(gè)進(jìn)程的IO注冊(cè)到一個(gè)復(fù)用器(select)上,select 會(huì)監(jiān)聽(tīng)所有注冊(cè)進(jìn)來(lái)的IO。如果內(nèi)核的數(shù)據(jù)報(bào)沒(méi)有準(zhǔn)備好,調(diào)用select 的進(jìn)程將會(huì)被阻塞,而當(dāng)任一IO在內(nèi)核緩沖區(qū)中有數(shù)據(jù),select調(diào)用就會(huì)返回可讀條件,然后進(jìn)程再進(jìn)行recvform系統(tǒng)調(diào)用,內(nèi)核將數(shù)據(jù)拷貝到用戶(hù)空間,注意這個(gè)過(guò)程是阻塞的。

注意:IO 復(fù)用模型在第一個(gè)階段和第二個(gè)階段其實(shí)都有阻塞,第一個(gè)階段阻塞于 select 調(diào)用,第二個(gè)階段阻塞于數(shù)據(jù)復(fù)制。

生活場(chǎng)景:如果每個(gè)人都過(guò)一會(huì)就來(lái)問(wèn)一下奶茶好了沒(méi)有,奶茶店的壓力也太大了。于是奶茶店想到了一個(gè)辦法,找一個(gè)中間人(select)擋在奶茶店前面,顧客(應(yīng)用進(jìn)程)詢(xún)問(wèn)那個(gè)中間人奶茶好了沒(méi)有(對(duì)應(yīng)多個(gè)進(jìn)程的IO注冊(cè)到一個(gè)復(fù)用器(select)上),如果沒(méi)有好就讓顧客等待(應(yīng)用進(jìn)程阻塞于 select 調(diào)用)。中間人持續(xù)查看顧客的奶茶是否準(zhǔn)備好,如果有一個(gè)人的奶茶準(zhǔn)備好了就會(huì)去通知那個(gè)人可以取了(而當(dāng)任一IO在內(nèi)核緩沖區(qū)中有數(shù)據(jù),select調(diào)用就會(huì)返回可讀條件,然后進(jìn)程再進(jìn)行recvform系統(tǒng)調(diào)用)。

總結(jié)

學(xué)習(xí)IO模型時(shí),必須要把每個(gè)模型聯(lián)系起來(lái)看,比如阻塞IO模型會(huì)阻塞較長(zhǎng)時(shí)間,而非阻塞IO在等待數(shù)據(jù)報(bào)的過(guò)程中,進(jìn)程并沒(méi)有阻塞,它可以做其他的事情。IO復(fù)用模型可以很好的降低服務(wù)器的壓力,且在連接數(shù)眾多且消息體不大的情況下有很大的優(yōu)勢(shì)。

本文來(lái)源網(wǎng)絡(luò),免費(fèi)傳達(dá)知識(shí),版權(quán)歸原作者所有。如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系我進(jìn)行刪除。

注意

猜你喜歡:

談?wù)勄度胧杰浖募嫒菪裕?/p>

我是韋東山老師的忠實(shí)粉絲!

關(guān)鍵詞:
相關(guān)文章

最近更新
精彩推送
天天頭條:欠債不還 2023-06-22 03:14:50