同步、异步、堵塞、非堵塞和函数调用及I/O之间的组合概念
? ? ? ? 在我們工作和學(xué)習(xí)中,經(jīng)常會接觸到“同步”、“異步”、“堵塞”和“非堵塞”這些概念,但是并不是每個人都能將它們的關(guān)系和區(qū)別說清楚。本文將對這些基本概念進行討論,以期讓大家有更清楚的認(rèn)識。(轉(zhuǎn)載請指明出于breaksoftware的csdn博客)
? ? ? ? IT技術(shù)和相關(guān)術(shù)語均為舶來品,于是其相關(guān)的問題也并非只有我們講中文的分不清。在一些外文網(wǎng)站上,我們可以發(fā)現(xiàn)外國人也會對這些概念進行區(qū)分和探討。于是,我覺得通過一些英文資料來解釋這些問題比較合適,畢竟從語言的角度說,它們更貼近問題的起源。
? ? ? ? 對于資料的選擇,我優(yōu)先選擇相信大家公認(rèn)的一些權(quán)威資料。比如RFC標(biāo)準(zhǔn)是最高的;其次是一些權(quán)威專家的論著,比如Addison Wesley的《UNIX Network Programming》;再其次是一些權(quán)威網(wǎng)站上的信息,比如百度百科、維基百科、IBM或者微軟官網(wǎng)上一些論述。
? ? ? ? 為了把問題說清楚,我決定先去探討意思相對的概念。比如“同步”和“異步”就是相對的概念,因為我們從來不會說這是一個“同步異步……”;同樣“堵塞”和“非堵塞”也是一對相對的概念,我們也不會說那是一個“堵塞非堵塞……”。然后我們將探討這兩對相對的概念的區(qū)別,比如“同步”和“堵塞”的區(qū)別,“異步”和“非堵塞”的區(qū)別。最后我們將結(jié)合“函數(shù)調(diào)用”和“I/O”來探討組合出的概念。
同步/異步
同步
? ? ? ??“同步”這個概念的探討將非常有意思,因為我們從這個詞可以感受下外語翻譯成中文后產(chǎn)生的偏差。
? ? ? ? 現(xiàn)在我們先“忘記”自己是IT從業(yè)人員,“同步”對我們來說可以按百度百科中的解釋為:
同步指兩個或兩個以上隨時間變化的量在變化過程中保持一定的相對關(guān)系。
? ? ? ??怎么具體化這個解釋呢?比如戰(zhàn)爭中,一個集團軍的統(tǒng)帥命令自己部下左、中、右三軍“同步”前進。于是我們補腦一下,可以想象出同在一個時間段內(nèi),三個不同的個體在同時做三件事,而這三個個體存在一定的關(guān)聯(lián)性——同時聽命于集團軍的統(tǒng)帥。于是這就產(chǎn)生了一種混亂,當(dāng)我們學(xué)習(xí)了IT技術(shù),特別是了解了“線程”概念后,可能馬上把集團軍的統(tǒng)帥想成一個“進程”,而三個“同步”前進的軍隊就是三個“線程”。那么此時“同步”是不是就是指若干個個體同時發(fā)生變化且存在一定關(guān)聯(lián)性呢?是不是更像“Asynchronous”的概念?其實這個問題并非我的臆測,之前在學(xué)校時,經(jīng)常有同學(xué)將“同步”的概念理解成“Asynchronous”的行為特點,而我也曾被它們弄混淆過。
? ? ? ? 雖然我沒有去考證過,但是我覺得上面對“同步”的解釋更加符合普通民眾的認(rèn)知。
? ? ? ??然后不知何時“Synchronization”也被翻譯成“同步”了。于是我們在百度百科里看到如下的解釋
同步(英語:Synchronization),指對在一個系統(tǒng)中所發(fā)生的事件(event)之間進行協(xié)調(diào),在時間上出現(xiàn)一致性與統(tǒng)一化的現(xiàn)象。在系統(tǒng)中進行同步,也被稱為及時(in time)、同步化的(synchronous、in sync)。
? ? ? ??其實這段解釋和維基百科中對“Synchronization”解釋是一致的
Synchronization?is the coordination of events to operate a?system?in unison. The familiar?conductor?of an orchestra serves to keep the orchestra?in time. Systems operating with all their parts in synchrony are said to be?synchronous?or?in sync; those which are not are?asynchronous.
? ? ? ??這個解釋并不是我們關(guān)注的重點,因為它和我們探討的重心沒太多關(guān)系。我引入它只是為了說明“Synchronization”也被翻譯成“同步”這樣一件事的存在。
? ? ? ? 然而,維基百科里還有一段關(guān)于計算機術(shù)語中“Synchronization”的解釋,它被拿到一個單獨的頁面中解釋——足以說明它和傳統(tǒng)意義上“Synchronization”的不同
In?computer science,?synchronization?refers to one of two distinct but related concepts: synchronization of?processes, and synchronization of?data.?Process synchronization?refers to the idea that multiple processes are to join up or?handshake?at a certain point, in order to reach an agreement or commit to a certain sequence of action.?Data synchronization?refers to the idea of keeping multiple copies of a dataset in coherence with one another, or to maintain?data integrity. Process synchronization primitives are commonly used to implement data synchronization.
? ? ? ??這段解釋將“同步”分為兩種:數(shù)據(jù)同步和過程同步。數(shù)據(jù)同步不是我們討論的重點,所以忽略。過程同步(至于此處翻譯成“進程”還是“過程”,我覺得“過程”所以可以更加寬泛些而且合理,所以選用“過程”一詞)是指多個過程通過一定組織方式達到某種協(xié)調(diào),這種協(xié)調(diào)包含“按一定順序執(zhí)行”。這種解釋就非常像我們IT民工理解中的“synchronous”了??上h語中“同步”至少在字面上是沒有這層意思的。
異步
? ? ? ?“異步”這個詞在漢語中應(yīng)該沒有歷史包袱,所以它的表意和英語中“asynchronous”一致。于是沒什么好討論的。唯一有意思的是這個詞是如何被選中來表示“asynchronous”的??赡苁且驗椤皊ynchronous”和“asynchronous”在英語中意思相反,而中文中已經(jīng)找到“同步”來翻譯“synchronous”,于是取“同”相反的修飾詞“異”來翻譯“asynchronous”為“異步”。
? ? ? ? 在維基百科上,我找到“Asynchrony”一詞的解釋,其含義可以解釋“asynchronous”
Asynchrony, in?computer programming, refers to the occurrence of events independently of the main?program flow?and ways to deal with such events. These may be "outside" events such as the arrival of?signals, or actions instigated by a program that take place?concurrently?with program execution, without the program?blocking?to wait for results
堵塞/非堵塞
堵塞
? ? ? ? 堵塞(Blocking)在維基百科中的解釋如下:
In?computing, a?process?is an instance of a computer program that is being executed. A process always exists in exactly one?process state. A process that is?blocked?is one that is waiting for some?event, such as a?resource?becoming available or the completion of an?I/O?operation.
? ? ? ??其意思是過程需要等待一個事件的變化而處于某個狀態(tài)中。這個事件可以是個資源,比如:內(nèi)存、CPU、網(wǎng)絡(luò)、磁盤等。
In a?multitasking?computer system, individual?tasks, or?threads of execution, must share the resources of the system. These resources might be:? the CPU? network? memory? disk?? ? ? ?
非堵塞
? ? ? ? 我在維基百科上沒有找到“非堵塞(Non-blocking)”的詞條,但是找到一個類似的“Non-blocking algorithm”
In?computer science, an?algorithm?is called?non-blocking?if failure or?suspension?of any?thread?cannot cause failure or suspension of another thread
同步/異步和堵塞/非堵塞
? ? ? ? 假如我們只有上述知識,還是很難將“同步”和“堵塞”分清楚,也不太能說清“異步”和“非堵塞”的區(qū)別。目前我看國內(nèi)很多論壇上關(guān)于這個問題的討論也顯得前后矛盾。
? ? ? ? 為了把概念區(qū)分開,我們可以借鑒下Addison Wesley的《UNIX Network Programming》中關(guān)于同步I/O和異步I/O的一個討論:
? ? ? ? Synchronous I/O versus Asynchronous I/O
? ? ? ? POSIX defines these two terms as follows:
? ? ? ? A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes.
? ? ? ? An asynchronous I/O operation does not cause the requesting process to be blocked.
? ? ? ? Using these definitions, the first four I/O modelsblocking, nonblocking, I/O multiplexing, and signal-driven I/Oare all synchronous because the actual I/O operation (recvfrom) blocks the process. Only the asynchronous I/O model matches the asynchronous I/O definition.
? ? ? ? 其大意是“同步I/O”要求過程堵塞直到I/O操作完成。后面我們會講到,即使使用O_NONBLOCK修飾的I/O,也會因為在調(diào)用read等函數(shù)時,需要等待內(nèi)核層把讀取的數(shù)據(jù)運輸?shù)接脩魧印S谑荌/O操作的完成(completes)與否要視數(shù)據(jù)是否全部進入用戶層。
? ? ? ? 也就是說“同步”強調(diào)的是操作最終完成了,而非中間狀態(tài)?!岸氯睆娬{(diào)的是對系統(tǒng)資源的等待。相應(yīng)的,“異步”強調(diào)的是操作沒有完成,處于中間狀態(tài)?!胺嵌氯睆娬{(diào)的是沒有對系統(tǒng)資源產(chǎn)生等待行為。之后我們將結(jié)合他們和“函數(shù)調(diào)用”及“I/O”的組合概念來加以區(qū)分。
同步/異步、堵塞/非堵塞和函數(shù)調(diào)用
? ? ? ? ?以下圖為例,1、2的操作我們可以認(rèn)為是“非堵塞的”,我們稱之為“非堵塞調(diào)用”或者“異步調(diào)用”;3操作需要把數(shù)據(jù)從內(nèi)核態(tài)運送到用戶態(tài),于是發(fā)生資源等待,從而發(fā)生堵塞,我們可以稱之為“堵塞調(diào)用”或者“同步調(diào)用”(整個操作完成)。以更高的視角來看,1、2和3這一組操作最終達到的是一個“同步調(diào)用”的結(jié)果。
? ? ? ? 可見“同步調(diào)用”是由“堵塞的調(diào)用”和“非堵塞的調(diào)用”組成,其過程可以沒有“非堵塞的調(diào)用”,但是必須至少有一個“堵塞的調(diào)用”。而“異步調(diào)用”和“非堵塞調(diào)用”則可以視為一個意思。
同步/異步、堵塞/非堵塞和I/O
? ? ? ? 這塊的討論我將結(jié)合Addison Wesley的《UNIX Network Programming》和IBM官網(wǎng)的《Boost application performance using asynchronous I/O》。
? ? ? ? 選用Addison的論著無可厚非,畢竟他是大牛,而且《UNIX Network Programming》還是經(jīng)典之作。選用《Boost application performance using asynchronous I/O》則是因為它在國內(nèi)被很多人翻譯成了中文,之后的示例圖也都源于這篇文章,而我對其解釋持保留看法。
?堵塞I/O ? ? ??
? ? ? ? 堵塞I/O是默認(rèn)的I/O類型,因為它不需要使用O_NONBLOCK去修飾。以I/O讀取為例,在用戶態(tài)read函數(shù)會一直等待內(nèi)核態(tài)返回結(jié)果。這種模型還可稱為“同步堵塞模型”。
非堵塞I/O
? ? ? ? 非堵塞I/O需要使用O_NONBLOCK去修飾。這樣在操作該I/O時,如果系統(tǒng)尚未將數(shù)據(jù)準(zhǔn)備好,則直接從內(nèi)核態(tài)返回一個錯誤。如果數(shù)據(jù)準(zhǔn)備好了,則用戶態(tài)會等待內(nèi)核將數(shù)據(jù)輸送到用戶態(tài)。這種模型可以稱之為“同步非堵塞模型”,因為從整個操作來看,這是個同步I/O。而從IO自身來看,因為被O_NONBLOCK修飾,所以是非堵塞的。
?
多路復(fù)用I/O
? ? ? ? 不管I/O是否被O_NONBLOCK修飾,遇到select/poll方法都會被堵塞。所以多路復(fù)用I/O可以是“同步堵塞模型”,也可以是“同步非堵塞模型”。
? ? ? ? 但是在《Boost application performance using asynchronous I/O》一文(后稱《Boo》文)中,將使用O_NONBLOCK修飾的多路復(fù)用模型稱之為“Asynchronous blocking I/O”,這個觀點我是不認(rèn)可的。
? ? ? ? 為什么呢?當(dāng)我們定義一個名稱時,前面的定語可能用于修飾不同的概念。如果按照《Boo》文描述,Asynchronous應(yīng)該是用于修飾I/O的,Blocking是用于修飾Select函數(shù)調(diào)用的。但是之前我們講過,Addison Wesley根據(jù)RFC對Synchronous I/O的定義,認(rèn)定多路復(fù)用I/O不屬于異步IO。同樣,如果Asynchronous不是修飾I/O,那么Blocking是用于修飾I/O的么?那當(dāng)然更不對,因為I/O被O_NONBLOCK修飾了。那如果Asynchronous和Blocking都不是修飾I/O的,那么Asynchronous?blocking I/O和Synchronous non-blocking I/O又有什么區(qū)別呢?
異步I/O
? ? ? ? 這種I/O在Linux系統(tǒng)上叫AIO,在windows系統(tǒng)上交IOCP(完成端口)。這種模型最大的特征執(zhí)行用戶態(tài)響應(yīng)前,數(shù)據(jù)已經(jīng)進入用戶態(tài),從而不會發(fā)生像同步I/O一樣,需要等待內(nèi)核態(tài)往用戶態(tài)輸送數(shù)據(jù)。這種模型也稱“異步非堵塞模型”。
? ? ? ??
參考鏈接:
http://library.tebyan.net/en/Viewer/Text/164873/92#ch06fig01
https://www.ibm.com/developerworks/library/l-async/
https://stackoverflow.com/questions/748175/asynchronous-vs-synchronous-execution-what-does-it-really-mean
?
http://www.programmr.com/blogs/difference-between-asynchronous-and-non-blocking
https://stackoverflow.com/questions/8416874/whats-the-differences-between-blocking-with-synchronous-nonblocking-and-asynch
https://blogs.msdn.microsoft.com/csliu/2009/08/27/io-concept-blockingnon-blocking-vs-syncasync/
http://www.cs.unc.edu/~dewan/242/s07/notes/ipc/node9.html
https://coelhorjc.wordpress.com/2014/12/18/using-non-blocking-and-asynchronous-io-ck10-problem-in-linux-and-windows-with-epool-iocp-aiolibaio-libeventlibevlibuv-boost-asio/
http://www.cnblogs.com/whyandinside/archive/2012/03/04/2379234.html
http://www.fsl.cs.sunysb.edu/~vass/linux-aio.txt
https://stackoverflow.com/questions/2625493/asynchronous-vs-non-blocking
http://blog.csdn.net/historyasamirror/article/details/5778378
http://www.dart.com/help/ptsslnet/UsingSynchronousVsAsynchronous.html
https://en.wikipedia.org/wiki/Asynchronous_method_invocation
總結(jié)
以上是生活随笔為你收集整理的同步、异步、堵塞、非堵塞和函数调用及I/O之间的组合概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 码农技术炒股之路——抓取日线数据、计算均
- 下一篇: 静态分析C语言生成函数调用关系的利器——