同步和非同步與阻塞和非阻塞的區別

2021-06-18 18:29:46 字數 1025 閱讀 8103

**:

發現我好像越來越喜歡糾纏於這些定義=_=。

同步和非同步與阻塞與非阻塞是在通訊和i/o中常用的字眼,之前在許多地方同步與阻塞,非同步與非阻塞常常被混為一談,帶來了許多混亂,其實同步、非同步和阻塞、非阻塞是兩個不同的概念。最近隨著非同步io(aio)越來越多的應用,對這兩個概念進行區分和解釋的文章也越來越多,但是問起身邊的同學,能說清楚的倒也不多,所以我就順便跟風寫一篇科普文吧(越來越水了=_=)。

同步(synchronous)和非同步(asynchronous)其實是針對訊息的傳送和接受的次序而言的(在通訊中就是訊息的傳送和接收,在io中就是資料的讀和寫)。同步的意思就是訊息的傳送和接收是有序的,即接收和傳送第二個包一定在第乙個包之後第三個包之前,而不是亂序。非同步的意思就是訊息的傳送和接收是可以亂序的,第乙個包沒發完可以直接發第二個包。

舉個例子,兩個人之間發簡訊,最簡單的就是同步阻塞的方式,乙個人發簡訊,然後啥也不幹地等在手機前面,直到對方回信,接下來才發第二條簡訊(這時也確認了第一條簡訊已發到)。而同步非阻塞方式也就是大家常用的方式,則是發出去訊息,然後去幹別的事,(體現了非阻塞)等對方回簡訊之後(相當於確認了第一條簡訊已收到,並且有後續資料過來),再發第二條簡訊(體現了同步)。非同步阻塞的方式,則是一口氣發出幾十條簡訊(由於中國移動並不保證發出簡訊的先後順序,可能導致對方收到簡訊的順序和發出去時不一致,這就體現了非同步的概念,而且理論上發信的順序也可以是亂的),發完之後就啥也不幹,等對方一條一條的回信(這體現了阻塞的概念)。而如果在一口氣發出幾十條簡訊後沒有傻傻的等待,而是去別的地方玩去了,對方的回信到一條讀一條,則就變成非同步非阻塞的方式了。

不知道通過上面的例子,大家是不是已經可以理解這兩組概念之間的區別了。這裡有篇相關的文章寫得不錯,如果還有些不理解的,可以再去閱讀一下。由於國內在it領域的起步落後國外(主要是美國)一些年份,再加上網際網路的迅速普及,導致許多以訛傳訛的現象時有發生。這兩組本來適用範圍並不相同的概念卻在很長一段時間內被混為一談,應該就是這方面的例子。這種錯誤增加了大家的學習成本,也不利於在某一些領域的進一步研究,所以個人以為搞清楚這些概念還是很有必要的(最後為自己的又一篇水文開脫一下=_=)

**於

同步 非同步 阻塞和非阻塞的區別

在進行網路程式設計時,我們常常見到同步 非同步 阻塞和非阻塞四種呼叫方式。這些方式彼此概念並不好理解。下面是我對這些術語的區別。所謂同步,就是在發出乙個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。按照這個定義,其實絕大多數函式都是同步呼叫 例如sin,isdigit等 但是一般而言,我們在說同步...

同步,非同步,阻塞和非阻塞的區別

一 概念 非同步 某個事情需要10s完成。而我只需要呼叫某個函式告訴 來幫我做 然後我再幹其他的事情 同步 某個事情需要10s完成,我需要一直等它完成 等10s 再能繼續後面的工作。阻塞 做某件事情,直到完成,除非超時 非阻塞 嘗試做,如果不能做,就不做 直接返回 如果能做,就做。前兩者和後兩者不容...

同步 非同步和阻塞 非阻塞的區別

一 阻塞 與 非阻塞 與 同步 與 非同步 不能簡單的從字面理解,提供乙個從分布式系統角度的回答。1.同步與非同步同步和非同步關注的是訊息通訊機制 synchronous communication asynchronous communication 所謂同步,就是在發出乙個 呼叫 時,在沒有得到...