最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

UNIX中的五種I/O模型

2023-04-08 14:11 作者:gzqhero  | 我要投稿

前言

在Java網(wǎng)絡(luò)編程中,應(yīng)用的較多的主要有BIO,NIO倆種模型,前者為傳統(tǒng)的阻塞IO模型,后者為Java1.4后來(lái)新加入的非阻塞IO模型,由于后者的性能前者要高出很多,所以開(kāi)發(fā)高性能的應(yīng)用時(shí),基本都會(huì)選擇NIO模型。最典型的比如大名鼎鼎的Netty框架就是基于NIO開(kāi)發(fā)的(Netty框架幾乎無(wú)處不在,)。另外還有一種不太常用的Java1.7中新加入的AIO模型,是NIO的2.0版本,應(yīng)用較少,與NIO的主要區(qū)別在于AIO是基于事件回調(diào)的。

所有Java的這些IO模型都是基于底層來(lái)實(shí)現(xiàn)的,我們先來(lái)簡(jiǎn)單了解下操作系統(tǒng)層面上的IO模型,了解之后會(huì)對(duì)Java的實(shí)現(xiàn)理解有一定的幫助。在Unix網(wǎng)絡(luò)編程一書中定義了5種I/O模型。

正文

阻塞式I/O

這是最簡(jiǎn)單也是最早出現(xiàn)的I/O模型。來(lái)看一下該模型的流程圖

圖片

進(jìn)行IO操作時(shí),進(jìn)程調(diào)用recvfrom,該函數(shù)會(huì)一直阻塞直到數(shù)據(jù)到達(dá)或者報(bào)錯(cuò)才能返回,從調(diào)用recvfrom開(kāi)始到它返回的整段時(shí)間內(nèi)是被阻塞的。這意味著我們的程序在這段等待的時(shí)間內(nèi)做不了任何事情。

非阻塞I/O

當(dāng)調(diào)用recvfrom沒(méi)有數(shù)據(jù)可返回時(shí),內(nèi)核立即返回一個(gè)EWOULDBLOCK錯(cuò)誤,直至數(shù)據(jù)報(bào)準(zhǔn)備好時(shí),才正常返回。我們可以對(duì)它進(jìn)行輪詢,查看是否有數(shù)據(jù)到來(lái),但是這么做的缺點(diǎn)是比較耗費(fèi)CPU時(shí)間。

圖片

I/O復(fù)用模型

該模型由select與poll函數(shù)支持,這兩個(gè)函數(shù)作用是內(nèi)核一旦發(fā)現(xiàn)進(jìn)程指定的一個(gè)或多個(gè)I/O條件就緒時(shí),就會(huì)通知進(jìn)程。

調(diào)用select或者poll,使其不阻塞在I/O系統(tǒng)調(diào)用上。只阻塞在select或者poll調(diào)用,等待數(shù)據(jù)報(bào)套接字變?yōu)榭勺x。當(dāng)套接字返回可讀這一條件時(shí),則調(diào)用recvfrom把數(shù)據(jù)讀出。該模型的優(yōu)勢(shì)在于select可以同時(shí)等待多個(gè)描述符(一個(gè)socket的讀寫對(duì)應(yīng)一個(gè)描述符)就緒。

圖片

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

與I/O復(fù)用模式區(qū)別在于,它可以讓內(nèi)核在描述符就緒時(shí)發(fā)送SIGIO信號(hào)通知我們。這種模型優(yōu)勢(shì)在于等待數(shù)據(jù)報(bào)到達(dá)期間進(jìn)程不被阻塞。

圖片

異步I/O模型

進(jìn)程會(huì)告知內(nèi)核啟動(dòng)某個(gè)操作,并讓內(nèi)核在整個(gè)操作完成后通知我們,與信號(hào)驅(qū)動(dòng)模型區(qū)別在于,信號(hào)模型通知我們何時(shí)可以啟動(dòng)一個(gè)I/O操作,異步模型通知我們I/O操作何時(shí)完成。在等待I/O完成期間,我們的進(jìn)程不被阻塞。

圖片

比較

可以看出異步I/O模型的性能是最佳的,幾乎阻塞時(shí)間。

圖片


UNIX中的五種I/O模型的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
项城市| 博野县| 泽库县| 承德市| 宽甸| 赤城县| 乐业县| 垦利县| 灵武市| 新和县| 临泽县| 紫金县| 台北县| 平远县| 乐清市| 满洲里市| 泾阳县| 牟定县| 昭通市| 广宁县| 呼伦贝尔市| 霞浦县| 陵水| 建始县| 明星| 卫辉市| 治多县| 缙云县| 马关县| 辽阳县| 安乡县| 大同市| 兰溪市| 资阳市| 康平县| 衡南县| 陇南市| 沽源县| 工布江达县| 广饶县| 大宁县|