电竞比分网-中国电竞赛事及体育赛事平台

分享

深入淺出Unix IO模型

 太極混元天尊 2018-04-13

前言

在介紹Unix IO模型之前,我們先來說說什么是IO。根據(jù)維基百科的定義,IO 指的是輸入輸出,通常指數(shù)據(jù)在內(nèi)部存儲器和外部存儲器或其他周邊設(shè)備之間的輸入和輸出。簡而言之,從硬盤中讀寫數(shù)據(jù)或者從網(wǎng)絡(luò)上收發(fā)數(shù)據(jù),都屬于IO行為。

以數(shù)據(jù)輸入為例,一個(gè)輸入操作,通??梢苑譃?個(gè)階段:

  1. 等待操作系統(tǒng)內(nèi)核把數(shù)據(jù)準(zhǔn)備好

  2. 將數(shù)據(jù)從操作系統(tǒng)內(nèi)核復(fù)制到用戶進(jìn)程空間

這里有一個(gè)問題就是,假如操作系統(tǒng)內(nèi)核還沒把數(shù)據(jù)準(zhǔn)備好,這個(gè)時(shí)候用戶進(jìn)程要怎么處理?是一直等待直到數(shù)據(jù)準(zhǔn)備好,還是隔一段時(shí)間來詢問一次,又或者是操作系統(tǒng)把數(shù)據(jù)準(zhǔn)備好后去通知用戶進(jìn)程呢?雖然一個(gè)IO操作只有2個(gè)階段,但是根據(jù)IO是否阻塞、是否同步,卻可以把IO再細(xì)分成不同的模型。實(shí)際上,在Unix網(wǎng)絡(luò)編程中一共有5種不同的IO模型,下文將進(jìn)行詳細(xì)介紹。

Unix IO模型

阻塞式IO模型

阻塞式IO是所有IO模型中最簡單的一種,在這種模型下,所有IO操作都是阻塞的。以套接字接口為例,在進(jìn)程空間調(diào)用recvfrom,其系統(tǒng)調(diào)用直到數(shù)據(jù)包到達(dá)且被復(fù)制到應(yīng)用進(jìn)程的緩沖區(qū)或者發(fā)生錯(cuò)誤時(shí)才返回,在此期間會一直等待,因此被稱為阻塞式IO模型。

阻塞式IO就像是在排隊(duì)買火車票一樣,如果前面排隊(duì)的人很多,你是沒辦法抽身走開的,只能干等著,如果走開一會兒就得重新排隊(duì)了,因此阻塞式IO效率是十分低下的。

非阻塞式IO模型

非阻塞式IO模型跟阻塞式IO模型的主要區(qū)別是如果操作系統(tǒng)內(nèi)核沒有把數(shù)據(jù)準(zhǔn)備好,recvfrom會直接返回一個(gè)錯(cuò)誤,而不是一直阻塞。

非阻塞式IO就像是去小飯館吃飯一樣,你去的時(shí)候如果人很多,你可以先取號,取完號之后可以先在周圍逛逛,等時(shí)間差不多了再到飯館看看是否輪到自己就餐了。與阻塞式IO相比,非阻塞IO效率有所提升,因?yàn)椴挥靡恢贝谠亍芭抨?duì)”,不過還是有一個(gè)缺點(diǎn)就是,要不斷地去詢問操作系統(tǒng)內(nèi)核是否已經(jīng)把數(shù)據(jù)準(zhǔn)備好了。

IO復(fù)用模型

Unix中提供了select/poll來使用IO復(fù)用,這樣一來用戶進(jìn)程就可以阻塞在select/poll上,而不是阻塞在具體的IO操作上。當(dāng)操作系統(tǒng)內(nèi)核將數(shù)據(jù)準(zhǔn)備好之后,select/poll會返回可讀條件,然后用戶進(jìn)程再調(diào)用recvfrom來將數(shù)據(jù)復(fù)制到用戶進(jìn)程空間。使用多路復(fù)用的好處是,我們可以等待多個(gè)文件描述符就緒,即select/poll會幫我們偵測多個(gè)文件描述符是否就緒,從而使得用戶進(jìn)程不必阻塞于具體的IO操作。

IO復(fù)用模型就好像是一群好友到游樂園排隊(duì)玩兒過山車一樣,一群人里面推選出一人在原地排隊(duì),其他人先去玩兒其他項(xiàng)目,然后其他人在玩兒的過程中每隔一段時(shí)間就打電話問那個(gè)排隊(duì)的人排上號了沒,如果排上號了,就過來玩兒過山車,否則就繼續(xù)玩兒其他項(xiàng)目??梢钥吹絀O復(fù)用模型的好處是,用戶進(jìn)程不用阻塞于具體的IO操作,而且多路復(fù)用器可以監(jiān)聽多個(gè)IO文件描述符。

信號驅(qū)動式IO模型

信號驅(qū)動式IO是指讓操作系統(tǒng)內(nèi)核在文件描述符就緒時(shí)發(fā)送信號給用戶進(jìn)程,這樣一來用戶進(jìn)程只要調(diào)用sigaction后就能立即返回,不會被阻塞。當(dāng)操作系統(tǒng)的文件描述符就緒時(shí),會發(fā)送信號給用戶進(jìn)程,用戶進(jìn)程再調(diào)用recvfrom開始IO操作。

信號驅(qū)動式IO還是像上述一群好友到游樂園排隊(duì)玩兒過山車的例子一樣,這個(gè)時(shí)候還是派出一名代表在原地排隊(duì),其他人去玩兒其他項(xiàng)目,只是這個(gè)時(shí)候排隊(duì)的人如果排上號了會主動在微信群里呼叫(發(fā)送信號)其他好友過來玩兒,其他人不用再隔一段時(shí)間就打電話給那個(gè)排隊(duì)的人詢問排隊(duì)情況了,只要看微信群消息即可。這就是信號驅(qū)動式IO模型跟IO復(fù)用模型的區(qū)別,前者操作系統(tǒng)會主動發(fā)消息給用戶進(jìn)程,后者用戶進(jìn)程還是會阻塞在多路復(fù)用器上。

異步IO模型

異步IO模型指的是告訴操作系統(tǒng)內(nèi)核啟動某個(gè)操作,并讓操作系統(tǒng)內(nèi)核在完成整個(gè)操作后通知用戶進(jìn)程。其與信號驅(qū)動式IO的區(qū)別是信號驅(qū)動式IO模型是操作系統(tǒng)內(nèi)核通知我們何時(shí)開始一個(gè)IO操作,而異步IO模型是操作系統(tǒng)內(nèi)核通知我們該IO操作何時(shí)完成。

異步IO模型就像是委托別人去銀行辦理業(yè)務(wù)一樣,只要將要辦的業(yè)務(wù)以及相關(guān)的證件交給委托人,委托人就會幫你去辦理,期間你是不需要跑腿的,還是可以做自己的事情,當(dāng)委托人辦完業(yè)務(wù)后再通知你辦理的結(jié)果就行了。所以異步IO模型是效率最高的IO模型了,因?yàn)槟阕约翰恍枰芭芡取?,只要敬候佳音就行了?/p>


    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多