国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

物聯(lián)網(wǎng)高并發(fā)編程之網(wǎng)絡(luò)編程中的I/O模型

hsluoyz / 2936人閱讀

摘要:缺點每個連接需要獨立的進(jìn)程線程多帶帶處理,當(dāng)并發(fā)請求量大時為了維護程序,內(nèi)存線程切換開銷較大,這種模型在實際生產(chǎn)中很少使用。而在系統(tǒng)下,才引入,目前并不完善,因此在下實現(xiàn)高并發(fā)網(wǎng)絡(luò)編程時都是以復(fù)用模型模式為主。

思維導(dǎo)圖

互聯(lián)網(wǎng)服務(wù)端處理網(wǎng)絡(luò)請求的原理

首先看看一個典型互聯(lián)網(wǎng)服務(wù)端處理網(wǎng)絡(luò)請求的典型過程:

由上圖可以看到,主要處理步驟包括:

獲取請求數(shù)據(jù),客戶端與服務(wù)器建立連接發(fā)出請求,服務(wù)器接受請求(1-3);

構(gòu)建響應(yīng),當(dāng)服務(wù)器接收完請求,并在用戶空間處理客戶端的請求,直到構(gòu)建響應(yīng)完成(4);

返回數(shù)據(jù),服務(wù)器將已構(gòu)建好的響應(yīng)再通過內(nèi)核空間的網(wǎng)絡(luò) I/O 發(fā)還給客戶端(5-7)。

設(shè)計服務(wù)端并發(fā)模型時,主要有如下兩個關(guān)鍵點:

服務(wù)器如何管理連接,獲取輸入數(shù)據(jù);

服務(wù)器如何處理請求。

以上兩個關(guān)鍵點最終都與操作系統(tǒng)的 I/O 模型以及線程(進(jìn)程)模型相關(guān)。下面先詳細(xì)介紹這I/O模型。

I/O 模型的基本認(rèn)識

介紹操作系統(tǒng)的 I/O 模型之前,先了解一下幾個概念:

阻塞調(diào)用與非阻塞調(diào)用;

阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會被掛起,調(diào)用線程只有在得到結(jié)果之后才會返回;

非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會阻塞當(dāng)前線程。

兩者的最大區(qū)別在于被調(diào)用方在收到請求到返回結(jié)果之前的這段時間內(nèi),調(diào)用方是否一直在等待。

阻塞是指調(diào)用方一直在等待而且別的事情什么都不做;非阻塞是指調(diào)用方先去忙別的事情。

同步處理與異步處理:同步處理是指被調(diào)用方得到最終結(jié)果之后才返回給調(diào)用方;異步處理是指被調(diào)用方先返回應(yīng)答,然后再計算調(diào)用結(jié)果,計算完最終結(jié)果后再通知并返回給調(diào)用方。

阻塞、非阻塞和同步、異步的區(qū)別(阻塞、非阻塞和同步、異步其實針對的對象是不一樣的):

阻塞、非阻塞的討論對象是調(diào)用者;

同步、異步的討論對象是被調(diào)用者。

recvfrom 函數(shù)

recvfrom 函數(shù)(經(jīng) Socket 接收數(shù)據(jù)),這里把它視為系統(tǒng)調(diào)用。

一個輸入操作通常包括兩個不同的階段

等待數(shù)據(jù)準(zhǔn)備好;

從內(nèi)核向進(jìn)程復(fù)制數(shù)據(jù)。

對于一個套接字上的輸入操作:

第一步通常涉及等待數(shù)據(jù)從網(wǎng)絡(luò)中到達(dá)。當(dāng)所等待分組到達(dá)時,它被復(fù)制到內(nèi)核中的某個緩沖區(qū)。

第二步就是把數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到應(yīng)用進(jìn)程緩沖區(qū)。

實際應(yīng)用程序在系統(tǒng)調(diào)用完成上面的 2 步操作時,調(diào)用方式的阻塞、非阻塞,操作系統(tǒng)在處理應(yīng)用程序請求時,處理方式的同步、異步處理的不同,可以分為 5 種 I/O 模型。

I/O模型 I/O模型1:阻塞式 I/O 模型(blocking I/O)

在阻塞式 I/O 模型中,應(yīng)用程序在從調(diào)用 recvfrom 開始到它返回有數(shù)據(jù)報準(zhǔn)備好這段時間是阻塞的,recvfrom 返回成功后,應(yīng)用進(jìn)程開始處理數(shù)據(jù)報。

比喻:一個人在釣魚,當(dāng)沒魚上鉤時,就坐在岸邊一直等。

優(yōu)點:程序簡單,在阻塞等待數(shù)據(jù)期間進(jìn)程/線程掛起,基本不會占用 CPU 資源。

缺點:每個連接需要獨立的進(jìn)程/線程多帶帶處理,當(dāng)并發(fā)請求量大時為了維護程序,內(nèi)存、線程切換開銷較大,這種模型在實際生產(chǎn)中很少使用。

I/O模型2:非阻塞式 I/O 模型(non-blocking I/O)

在非阻塞式 I/O 模型中,應(yīng)用程序把一個套接口設(shè)置為非阻塞,就是告訴內(nèi)核,當(dāng)所請求的 I/O 操作無法完成時,不要將進(jìn)程睡眠。

而是返回一個錯誤,應(yīng)用程序基于 I/O 操作函數(shù)將不斷的輪詢數(shù)據(jù)是否已經(jīng)準(zhǔn)備好,如果沒有準(zhǔn)備好,繼續(xù)輪詢,直到數(shù)據(jù)準(zhǔn)備好為止。

比喻:邊釣魚邊玩手機,隔會再看看有沒有魚上鉤,有的話就迅速拉桿。

優(yōu)點:不會阻塞在內(nèi)核的等待數(shù)據(jù)過程,每次發(fā)起的 I/O 請求可以立即返回,不用阻塞等待,實時性較好

缺點:輪詢將會不斷地詢問內(nèi)核,這將占用大量的 CPU 時間,系統(tǒng)資源利用率較低,所以一般 Web 服務(wù)器不使用這種 I/O 模型。

I/O模型3:I/O 復(fù)用模型(I/O multiplexing)

在 I/O 復(fù)用模型中,會用到 Select 或 Poll 函數(shù)或 Epoll 函數(shù)(Linux 2.6 以后的內(nèi)核開始支持),這兩個函數(shù)也會使進(jìn)程阻塞,但是和阻塞 I/O 有所不同。

這兩個函數(shù)可以同時阻塞多個 I/O 操作,而且可以同時對多個讀操作,多個寫操作的 I/O 函數(shù)進(jìn)行檢測,直到有數(shù)據(jù)可讀或可寫時,才真正調(diào)用 I/O 操作函數(shù)。

比喻:放了一堆魚竿,在岸邊一直守著這堆魚竿,沒魚上鉤就玩手機。

優(yōu)點:可以基于一個阻塞對象,同時在多個描述符上等待就緒,而不是使用多個線程(每個文件描述符一個線程),這樣可以大大節(jié)省系統(tǒng)資源。

缺點:當(dāng)連接數(shù)較少時效率相比多線程+阻塞 I/O 模型效率較低,可能延遲更大,因為單個連接處理需要 2 次系統(tǒng)調(diào)用,占用時間會有增加。

眾所周之,Nginx這樣的高性能互聯(lián)網(wǎng)反向代理服務(wù)器大獲成功的關(guān)鍵就是得益于Epoll。

I/O模型4:信號驅(qū)動式 I/O 模型(signal-driven I/O)

在信號驅(qū)動式 I/O 模型中,應(yīng)用程序使用套接口進(jìn)行信號驅(qū)動 I/O,并安裝一個信號處理函數(shù),進(jìn)程繼續(xù)運行并不阻塞。

當(dāng)數(shù)據(jù)準(zhǔn)備好時,進(jìn)程會收到一個 SIGIO 信號,可以在信號處理函數(shù)中調(diào)用 I/O 操作函數(shù)處理數(shù)據(jù)。

比喻:魚竿上系了個鈴鐺,當(dāng)鈴鐺響,就知道魚上鉤,然后可以專心玩手機。

優(yōu)點:線程并沒有在等待數(shù)據(jù)時被阻塞,可以提高資源的利用率。

缺點:信號 I/O 在大量 IO 操作時可能會因為信號隊列溢出導(dǎo)致沒法通知。

信號驅(qū)動 I/O 盡管對于處理 UDP 套接字來說有用,即這種信號通知意味著到達(dá)一個數(shù)據(jù)報,或者返回一個異步錯誤。

但是,對于 TCP 而言,信號驅(qū)動的 I/O 方式近乎無用,因為導(dǎo)致這種通知的條件為數(shù)眾多,每一個來進(jìn)行判別會消耗很大資源,與前幾種方式相比優(yōu)勢盡失。

I/O模型5:異步 I/O 模型(即AIO,全稱asynchronous I/O)

由 POSIX 規(guī)范定義,應(yīng)用程序告知內(nèi)核啟動某個操作,并讓內(nèi)核在整個操作(包括將數(shù)據(jù)從內(nèi)核拷貝到應(yīng)用程序的緩沖區(qū))完成后通知應(yīng)用程序。

這種模型與信號驅(qū)動模型的主要區(qū)別在于:信號驅(qū)動 I/O 是由內(nèi)核通知應(yīng)用程序何時啟動一個 I/O 操作,而異步 I/O 模型是由內(nèi)核通知應(yīng)用程序 I/O 操作何時完成。

優(yōu)點:異步 I/O 能夠充分利用 DMA 特性,讓 I/O 操作與計算重疊。

缺點:要實現(xiàn)真正的異步 I/O,操作系統(tǒng)需要做大量的工作。目前 Windows 下通過 IOCP 實現(xiàn)了真正的異步 I/O。

而在 Linux 系統(tǒng)下,Linux 2.6才引入,目前 AIO 并不完善,因此在 Linux 下實現(xiàn)高并發(fā)網(wǎng)絡(luò)編程時都是以 IO 復(fù)用模型模式為主。

關(guān)于AOI的介紹,請見

5 種 I/O 模型總結(jié)

從上圖中我們可以看出,越往后,阻塞越少,理論上效率也是最優(yōu)。

這五種 I/O 模型中,前四種屬于同步 I/O,因為其中真正的 I/O 操作(recvfrom)將阻塞進(jìn)程/線程,只有異步 I/O 模型才與 POSIX 定義的異步 I/O 相匹配。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/72524.html

相關(guān)文章

  • 聯(lián)網(wǎng)并發(fā)編程網(wǎng)絡(luò)編程中的線程模型

    摘要:如需了解更多物聯(lián)網(wǎng)網(wǎng)絡(luò)編程知識請點擊物聯(lián)網(wǎng)云端開發(fā)武器庫物聯(lián)網(wǎng)高并發(fā)編程之網(wǎng)絡(luò)編程中的線程模型值得說明的是,具體選擇線程還是進(jìn)程,更多是與平臺及編程語言相關(guān)。 如需了解更多物聯(lián)網(wǎng)網(wǎng)絡(luò)編程知識請點擊:物聯(lián)網(wǎng)云端開發(fā)武器庫 物聯(lián)網(wǎng)高并發(fā)編程之網(wǎng)絡(luò)編程中的線程模型 值得說明的是,具體選擇線程還是進(jìn)程,更多是與平臺及編程語言相關(guān)。例如 C 語言使用線程和進(jìn)程都可以(例如 Nginx 使用進(jìn)程...

    ziwenxie 評論0 收藏0
  • 聯(lián)網(wǎng)并發(fā)編程C10K問題原理和解決方案

    摘要:問題任一文件句柄的不成功會阻塞住整個應(yīng)用。主要解決的前兩個問題通過一個數(shù)組向內(nèi)核傳遞需要關(guān)注的事件消除文件句柄上限,同時使用不同字段分別標(biāo)注關(guān)注事件和發(fā)生事件,來避免重復(fù)初始化。問題逐個排查所有文件句柄狀態(tài)效率不高。 C10K問題思維導(dǎo)圖 showImg(https://segmentfault.com/img/bVbkrKe?w=1818&h=1276); C10K問題出現(xiàn)前期 大家...

    dayday_up 評論0 收藏0
  • 并發(fā)

    摘要:表示的是兩個,當(dāng)其中任意一個計算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)常可見它的使用,在開始分析它的高并發(fā)實現(xiàn)機制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個比較典型的互聯(lián)網(wǎng)高并發(fā)場景。 干貨:深度剖析分布式搜索引擎設(shè)計 分布式,高可用,和機器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個名詞,今天我們首先來說說分布式。 探究...

    supernavy 評論0 收藏0
  • 并發(fā)

    摘要:表示的是兩個,當(dāng)其中任意一個計算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)常可見它的使用,在開始分析它的高并發(fā)實現(xiàn)機制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個比較典型的互聯(lián)網(wǎng)高并發(fā)場景。 干貨:深度剖析分布式搜索引擎設(shè)計 分布式,高可用,和機器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個名詞,今天我們首先來說說分布式。 探究...

    ddongjian0000 評論0 收藏0
  • 并發(fā)

    摘要:表示的是兩個,當(dāng)其中任意一個計算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)常可見它的使用,在開始分析它的高并發(fā)實現(xiàn)機制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個比較典型的互聯(lián)網(wǎng)高并發(fā)場景。 干貨:深度剖析分布式搜索引擎設(shè)計 分布式,高可用,和機器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個名詞,今天我們首先來說說分布式。 探究...

    wangdai 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<