同步、异步、堵塞、非堵塞和函数调用及I/O之间的组合概念
? ? ? ? 在我們工作和學(xué)習(xí)中,經(jīng)常會(huì)接觸到“同步”、“異步”、“堵塞”和“非堵塞”這些概念,但是并不是每個(gè)人都能將它們的關(guān)系和區(qū)別說(shuō)清楚。本文將對(duì)這些基本概念進(jìn)行討論,以期讓大家有更清楚的認(rèn)識(shí)。(轉(zhuǎn)載請(qǐng)指明出于breaksoftware的csdn博客)
? ? ? ? IT技術(shù)和相關(guān)術(shù)語(yǔ)均為舶來(lái)品,于是其相關(guān)的問(wèn)題也并非只有我們講中文的分不清。在一些外文網(wǎng)站上,我們可以發(fā)現(xiàn)外國(guó)人也會(huì)對(duì)這些概念進(jìn)行區(qū)分和探討。于是,我覺(jué)得通過(guò)一些英文資料來(lái)解釋這些問(wèn)題比較合適,畢竟從語(yǔ)言的角度說(shuō),它們更貼近問(wèn)題的起源。
? ? ? ? 對(duì)于資料的選擇,我優(yōu)先選擇相信大家公認(rèn)的一些權(quán)威資料。比如RFC標(biāo)準(zhǔn)是最高的;其次是一些權(quán)威專(zhuān)家的論著,比如Addison Wesley的《UNIX Network Programming》;再其次是一些權(quán)威網(wǎng)站上的信息,比如百度百科、維基百科、IBM或者微軟官網(wǎng)上一些論述。
? ? ? ? 為了把問(wèn)題說(shuō)清楚,我決定先去探討意思相對(duì)的概念。比如“同步”和“異步”就是相對(duì)的概念,因?yàn)槲覀儚膩?lái)不會(huì)說(shuō)這是一個(gè)“同步異步……”;同樣“堵塞”和“非堵塞”也是一對(duì)相對(duì)的概念,我們也不會(huì)說(shuō)那是一個(gè)“堵塞非堵塞……”。然后我們將探討這兩對(duì)相對(duì)的概念的區(qū)別,比如“同步”和“堵塞”的區(qū)別,“異步”和“非堵塞”的區(qū)別。最后我們將結(jié)合“函數(shù)調(diào)用”和“I/O”來(lái)探討組合出的概念。
同步/異步
同步
? ? ? ??“同步”這個(gè)概念的探討將非常有意思,因?yàn)槲覀儚倪@個(gè)詞可以感受下外語(yǔ)翻譯成中文后產(chǎn)生的偏差。
? ? ? ? 現(xiàn)在我們先“忘記”自己是IT從業(yè)人員,“同步”對(duì)我們來(lái)說(shuō)可以按百度百科中的解釋為:
同步指兩個(gè)或兩個(gè)以上隨時(shí)間變化的量在變化過(guò)程中保持一定的相對(duì)關(guān)系。
? ? ? ??怎么具體化這個(gè)解釋呢?比如戰(zhàn)爭(zhēng)中,一個(gè)集團(tuán)軍的統(tǒng)帥命令自己部下左、中、右三軍“同步”前進(jìn)。于是我們補(bǔ)腦一下,可以想象出同在一個(gè)時(shí)間段內(nèi),三個(gè)不同的個(gè)體在同時(shí)做三件事,而這三個(gè)個(gè)體存在一定的關(guān)聯(lián)性——同時(shí)聽(tīng)命于集團(tuán)軍的統(tǒng)帥。于是這就產(chǎn)生了一種混亂,當(dāng)我們學(xué)習(xí)了IT技術(shù),特別是了解了“線程”概念后,可能馬上把集團(tuán)軍的統(tǒng)帥想成一個(gè)“進(jìn)程”,而三個(gè)“同步”前進(jìn)的軍隊(duì)就是三個(gè)“線程”。那么此時(shí)“同步”是不是就是指若干個(gè)個(gè)體同時(shí)發(fā)生變化且存在一定關(guān)聯(lián)性呢?是不是更像“Asynchronous”的概念?其實(shí)這個(gè)問(wèn)題并非我的臆測(cè),之前在學(xué)校時(shí),經(jīng)常有同學(xué)將“同步”的概念理解成“Asynchronous”的行為特點(diǎn),而我也曾被它們弄混淆過(guò)。
? ? ? ? 雖然我沒(méi)有去考證過(guò),但是我覺(jué)得上面對(duì)“同步”的解釋更加符合普通民眾的認(rèn)知。
? ? ? ??然后不知何時(shí)“Synchronization”也被翻譯成“同步”了。于是我們?cè)诎俣劝倏评锟吹饺缦碌慕忉?/p>
同步(英語(yǔ):Synchronization),指對(duì)在一個(gè)系統(tǒng)中所發(fā)生的事件(event)之間進(jìn)行協(xié)調(diào),在時(shí)間上出現(xiàn)一致性與統(tǒng)一化的現(xiàn)象。在系統(tǒng)中進(jìn)行同步,也被稱(chēng)為及時(shí)(in time)、同步化的(synchronous、in sync)。
? ? ? ??其實(shí)這段解釋和維基百科中對(duì)“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.
? ? ? ??這個(gè)解釋并不是我們關(guān)注的重點(diǎn),因?yàn)樗臀覀兲接懙闹匦臎](méi)太多關(guān)系。我引入它只是為了說(shuō)明“Synchronization”也被翻譯成“同步”這樣一件事的存在。
? ? ? ? 然而,維基百科里還有一段關(guān)于計(jì)算機(jī)術(shù)語(yǔ)中“Synchronization”的解釋,它被拿到一個(gè)單獨(dú)的頁(yè)面中解釋——足以說(shuō)明它和傳統(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ù)同步和過(guò)程同步。數(shù)據(jù)同步不是我們討論的重點(diǎn),所以忽略。過(guò)程同步(至于此處翻譯成“進(jìn)程”還是“過(guò)程”,我覺(jué)得“過(guò)程”所以可以更加寬泛些而且合理,所以選用“過(guò)程”一詞)是指多個(gè)過(guò)程通過(guò)一定組織方式達(dá)到某種協(xié)調(diào),這種協(xié)調(diào)包含“按一定順序執(zhí)行”。這種解釋就非常像我們IT民工理解中的“synchronous”了。可惜漢語(yǔ)中“同步”至少在字面上是沒(méi)有這層意思的。
異步
? ? ? ?“異步”這個(gè)詞在漢語(yǔ)中應(yīng)該沒(méi)有歷史包袱,所以它的表意和英語(yǔ)中“asynchronous”一致。于是沒(méi)什么好討論的。唯一有意思的是這個(gè)詞是如何被選中來(lái)表示“asynchronous”的。可能是因?yàn)椤皊ynchronous”和“asynchronous”在英語(yǔ)中意思相反,而中文中已經(jīng)找到“同步”來(lái)翻譯“synchronous”,于是取“同”相反的修飾詞“異”來(lái)翻譯“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.
? ? ? ??其意思是過(guò)程需要等待一個(gè)事件的變化而處于某個(gè)狀態(tài)中。這個(gè)事件可以是個(gè)資源,比如:內(nèi)存、CPU、網(wǎng)絡(luò)、磁盤(pán)等。
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?? ? ? ?
非堵塞
? ? ? ? 我在維基百科上沒(méi)有找到“非堵塞(Non-blocking)”的詞條,但是找到一個(gè)類(lèi)似的“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
同步/異步和堵塞/非堵塞
? ? ? ? 假如我們只有上述知識(shí),還是很難將“同步”和“堵塞”分清楚,也不太能說(shuō)清“異步”和“非堵塞”的區(qū)別。目前我看國(guó)內(nèi)很多論壇上關(guān)于這個(gè)問(wèn)題的討論也顯得前后矛盾。
? ? ? ? 為了把概念區(qū)分開(kāi),我們可以借鑒下Addison Wesley的《UNIX Network Programming》中關(guān)于同步I/O和異步I/O的一個(gè)討論:
? ? ? ? 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”要求過(guò)程堵塞直到I/O操作完成。后面我們會(huì)講到,即使使用O_NONBLOCK修飾的I/O,也會(huì)因?yàn)樵谡{(diào)用read等函數(shù)時(shí),需要等待內(nèi)核層把讀取的數(shù)據(jù)運(yùn)輸?shù)接脩魧印S谑荌/O操作的完成(completes)與否要視數(shù)據(jù)是否全部進(jìn)入用戶層。
? ? ? ? 也就是說(shuō)“同步”強(qiáng)調(diào)的是操作最終完成了,而非中間狀態(tài)。“堵塞”強(qiáng)調(diào)的是對(duì)系統(tǒng)資源的等待。相應(yīng)的,“異步”強(qiáng)調(diào)的是操作沒(méi)有完成,處于中間狀態(tài)。“非堵塞”強(qiáng)調(diào)的是沒(méi)有對(duì)系統(tǒng)資源產(chǎn)生等待行為。之后我們將結(jié)合他們和“函數(shù)調(diào)用”及“I/O”的組合概念來(lái)加以區(qū)分。
同步/異步、堵塞/非堵塞和函數(shù)調(diào)用
? ? ? ? ?以下圖為例,1、2的操作我們可以認(rèn)為是“非堵塞的”,我們稱(chēng)之為“非堵塞調(diào)用”或者“異步調(diào)用”;3操作需要把數(shù)據(jù)從內(nèi)核態(tài)運(yùn)送到用戶態(tài),于是發(fā)生資源等待,從而發(fā)生堵塞,我們可以稱(chēng)之為“堵塞調(diào)用”或者“同步調(diào)用”(整個(gè)操作完成)。以更高的視角來(lái)看,1、2和3這一組操作最終達(dá)到的是一個(gè)“同步調(diào)用”的結(jié)果。
? ? ? ? 可見(jiàn)“同步調(diào)用”是由“堵塞的調(diào)用”和“非堵塞的調(diào)用”組成,其過(guò)程可以沒(méi)有“非堵塞的調(diào)用”,但是必須至少有一個(gè)“堵塞的調(diào)用”。而“異步調(diào)用”和“非堵塞調(diào)用”則可以視為一個(gè)意思。
同步/異步、堵塞/非堵塞和I/O
? ? ? ? 這塊的討論我將結(jié)合Addison Wesley的《UNIX Network Programming》和IBM官網(wǎng)的《Boost application performance using asynchronous I/O》。
? ? ? ? 選用Addison的論著無(wú)可厚非,畢竟他是大牛,而且《UNIX Network Programming》還是經(jīng)典之作。選用《Boost application performance using asynchronous I/O》則是因?yàn)樗趪?guó)內(nèi)被很多人翻譯成了中文,之后的示例圖也都源于這篇文章,而我對(duì)其解釋持保留看法。
?堵塞I/O ? ? ??
? ? ? ? 堵塞I/O是默認(rèn)的I/O類(lèi)型,因?yàn)樗恍枰褂肙_NONBLOCK去修飾。以I/O讀取為例,在用戶態(tài)read函數(shù)會(huì)一直等待內(nèi)核態(tài)返回結(jié)果。這種模型還可稱(chēng)為“同步堵塞模型”。
非堵塞I/O
? ? ? ? 非堵塞I/O需要使用O_NONBLOCK去修飾。這樣在操作該I/O時(shí),如果系統(tǒng)尚未將數(shù)據(jù)準(zhǔn)備好,則直接從內(nèi)核態(tài)返回一個(gè)錯(cuò)誤。如果數(shù)據(jù)準(zhǔn)備好了,則用戶態(tài)會(huì)等待內(nèi)核將數(shù)據(jù)輸送到用戶態(tài)。這種模型可以稱(chēng)之為“同步非堵塞模型”,因?yàn)閺恼麄€(gè)操作來(lái)看,這是個(gè)同步I/O。而從IO自身來(lái)看,因?yàn)楸籓_NONBLOCK修飾,所以是非堵塞的。
?
多路復(fù)用I/O
? ? ? ? 不管I/O是否被O_NONBLOCK修飾,遇到select/poll方法都會(huì)被堵塞。所以多路復(fù)用I/O可以是“同步堵塞模型”,也可以是“同步非堵塞模型”。
? ? ? ? 但是在《Boost application performance using asynchronous I/O》一文(后稱(chēng)《Boo》文)中,將使用O_NONBLOCK修飾的多路復(fù)用模型稱(chēng)之為“Asynchronous blocking I/O”,這個(gè)觀點(diǎn)我是不認(rèn)可的。
? ? ? ? 為什么呢?當(dāng)我們定義一個(gè)名稱(chēng)時(shí),前面的定語(yǔ)可能用于修飾不同的概念。如果按照《Boo》文描述,Asynchronous應(yīng)該是用于修飾I/O的,Blocking是用于修飾Select函數(shù)調(diào)用的。但是之前我們講過(guò),Addison Wesley根據(jù)RFC對(duì)Synchronous I/O的定義,認(rèn)定多路復(fù)用I/O不屬于異步IO。同樣,如果Asynchronous不是修飾I/O,那么Blocking是用于修飾I/O的么?那當(dāng)然更不對(duì),因?yàn)镮/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)進(jìn)入用戶態(tài),從而不會(huì)發(fā)生像同步I/O一樣,需要等待內(nèi)核態(tài)往用戶態(tài)輸送數(shù)據(jù)。這種模型也稱(chēng)“異步非堵塞模型”。
? ? ? ??
參考鏈接:
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之间的组合概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 码农技术炒股之路——抓取日线数据、计算均
- 下一篇: 静态分析C语言生成函数调用关系的利器——