前言 在介紹Unix IO模型之前,我們先來說說什么是IO。根據(jù)維基百科的定義,IO 指的是輸入輸出,通常指數(shù)據(jù)在內(nèi)部存儲器和外部存儲器或其他周邊設(shè)備之間的輸入和輸出。簡而言之,從硬盤中讀寫數(shù)據(jù)或者從網(wǎng)絡(luò)上收發(fā)數(shù)據(jù),都屬于IO行為。 以數(shù)據(jù)輸入為例,一個輸入操作,通??梢苑譃?個階段:
這里有一個問題就是,假如操作系統(tǒng)內(nèi)核還沒把數(shù)據(jù)準(zhǔn)備好,這個時候用戶進程要怎么處理?是一直等待直到數(shù)據(jù)準(zhǔn)備好,還是隔一段時間來詢問一次,又或者是操作系統(tǒng)把數(shù)據(jù)準(zhǔn)備好后去通知用戶進程呢?雖然一個IO操作只有2個階段,但是根據(jù)IO是否阻塞、是否同步,卻可以把IO再細分成不同的模型。實際上,在Unix網(wǎng)絡(luò)編程中一共有5種不同的IO模型,下文將進行詳細介紹。 Unix IO模型 阻塞式IO模型 阻塞式IO是所有IO模型中最簡單的一種,在這種模型下,所有IO操作都是阻塞的。以套接字接口為例,在進程空間調(diào)用recvfrom,其系統(tǒng)調(diào)用直到數(shù)據(jù)包到達且被復(fù)制到應(yīng)用進程的緩沖區(qū)或者發(fā)生錯誤時才返回,在此期間會一直等待,因此被稱為阻塞式IO模型。 阻塞式IO就像是在排隊買火車票一樣,如果前面排隊的人很多,你是沒辦法抽身走開的,只能干等著,如果走開一會兒就得重新排隊了,因此阻塞式IO效率是十分低下的。 非阻塞式IO模型 非阻塞式IO模型跟阻塞式IO模型的主要區(qū)別是如果操作系統(tǒng)內(nèi)核沒有把數(shù)據(jù)準(zhǔn)備好,recvfrom會直接返回一個錯誤,而不是一直阻塞。 非阻塞式IO就像是去小飯館吃飯一樣,你去的時候如果人很多,你可以先取號,取完號之后可以先在周圍逛逛,等時間差不多了再到飯館看看是否輪到自己就餐了。與阻塞式IO相比,非阻塞IO效率有所提升,因為不用一直待在原地“排隊”,不過還是有一個缺點就是,要不斷地去詢問操作系統(tǒng)內(nèi)核是否已經(jīng)把數(shù)據(jù)準(zhǔn)備好了。 IO復(fù)用模型 Unix中提供了select/poll來使用IO復(fù)用,這樣一來用戶進程就可以阻塞在select/poll上,而不是阻塞在具體的IO操作上。當(dāng)操作系統(tǒng)內(nèi)核將數(shù)據(jù)準(zhǔn)備好之后,select/poll會返回可讀條件,然后用戶進程再調(diào)用recvfrom來將數(shù)據(jù)復(fù)制到用戶進程空間。使用多路復(fù)用的好處是,我們可以等待多個文件描述符就緒,即select/poll會幫我們偵測多個文件描述符是否就緒,從而使得用戶進程不必阻塞于具體的IO操作。 IO復(fù)用模型就好像是一群好友到游樂園排隊玩兒過山車一樣,一群人里面推選出一人在原地排隊,其他人先去玩兒其他項目,然后其他人在玩兒的過程中每隔一段時間就打電話問那個排隊的人排上號了沒,如果排上號了,就過來玩兒過山車,否則就繼續(xù)玩兒其他項目??梢钥吹絀O復(fù)用模型的好處是,用戶進程不用阻塞于具體的IO操作,而且多路復(fù)用器可以監(jiān)聽多個IO文件描述符。 信號驅(qū)動式IO模型 信號驅(qū)動式IO是指讓操作系統(tǒng)內(nèi)核在文件描述符就緒時發(fā)送信號給用戶進程,這樣一來用戶進程只要調(diào)用sigaction后就能立即返回,不會被阻塞。當(dāng)操作系統(tǒng)的文件描述符就緒時,會發(fā)送信號給用戶進程,用戶進程再調(diào)用recvfrom開始IO操作。 信號驅(qū)動式IO還是像上述一群好友到游樂園排隊玩兒過山車的例子一樣,這個時候還是派出一名代表在原地排隊,其他人去玩兒其他項目,只是這個時候排隊的人如果排上號了會主動在微信群里呼叫(發(fā)送信號)其他好友過來玩兒,其他人不用再隔一段時間就打電話給那個排隊的人詢問排隊情況了,只要看微信群消息即可。這就是信號驅(qū)動式IO模型跟IO復(fù)用模型的區(qū)別,前者操作系統(tǒng)會主動發(fā)消息給用戶進程,后者用戶進程還是會阻塞在多路復(fù)用器上。 異步IO模型 異步IO模型指的是告訴操作系統(tǒng)內(nèi)核啟動某個操作,并讓操作系統(tǒng)內(nèi)核在完成整個操作后通知用戶進程。其與信號驅(qū)動式IO的區(qū)別是信號驅(qū)動式IO模型是操作系統(tǒng)內(nèi)核通知我們何時開始一個IO操作,而異步IO模型是操作系統(tǒng)內(nèi)核通知我們該IO操作何時完成。 異步IO模型就像是委托別人去銀行辦理業(yè)務(wù)一樣,只要將要辦的業(yè)務(wù)以及相關(guān)的證件交給委托人,委托人就會幫你去辦理,期間你是不需要跑腿的,還是可以做自己的事情,當(dāng)委托人辦完業(yè)務(wù)后再通知你辦理的結(jié)果就行了。所以異步IO模型是效率最高的IO模型了,因為你自己不需要“跑腿”,只要敬候佳音就行了。 |
|
來自: 太極混元天尊 > 《學(xué)習(xí)資料》