首先來一張大致了解一下這四個概念:
然後再來聽一聽鄙人的一些個人見解:
先解釋最基礎的概念, 之後用生活化的例子完成認知。
首先是blocking 和 non-blocking這兩個概念。
這兩個概念實質上是和io沒有關係的,他們是在說,比如讀資料, 如果沒有資料我該怎麼辦。
也就是說, 他是在io不存在的時候, 在語義上才是有效, 如果你要讀的資料始終是存在的, 那麼你還會考慮阻塞與非阻塞的問題嗎?
那你應該考慮什麼? 同步還是非同步io, 到底什麼是同步或者非同步呢?
英文synchronous是由syn 和chronous構成的, syn是在一起的意思,而chronous是時間的意思. 也就是說在乙個時間點上在一起, 那麼是誰和誰在意一起呢?
其中乙個是io可以肯定, 另外乙個就是執行io的發起者, 通常也就是程序. 簡單說來這個io是由程序執行的.。
那麼非同步io呢, asynchronous是a + synchronous,其中a表否定, 我們知道在io進行的過程中我們的程序是始終存在的, 也就是說io和程序共享著相同的時間進度, 但是卻不在一起。
也就是說, io不是由我們的程序完成的,而是別的程序完成的, 那到底是誰呢,沒錯,是核心執行緒.。
那麼我們就知道只有linux上的aio是符合非同步io的標準,而多路復用,如epoll返回時我們和io是在一起的,我們要呼叫read之類的完成他.。
下面用乙個生活化的例子,說明下linux下的io。比如你要買《演員的自我修養》這本書,還要買件襯衫,你會怎麼買?
你要先去書店,如果店家沒有貨,如果告訴你乙個小時後貨會補齊,這你可以等,但是時間稍微長點你就不願意等了。也就是阻塞和非阻塞。
之後你要去服裝店,也是同樣,假如都沒貨,你又等不下去,怎麼辦?你又不能一會兒去這家問下書什麼時候到貨? 一會兒又跑去服裝店詢問。這太累人了,最好的方式是,你去告訴店家我要什麼,到貨了給我打個**,我再過來。這就是io多路復用。
可是還有更高明的方法,沒錯就是京東自營了,我網上下訂單,第二天直接送到家了。京東,為什麼成功?這下你知道了吧。。。使用者省心啊!(舉個栗子便於理解,純屬個人喜好,不喜勿噴~)對應非同步io。
理解阻塞非阻塞與同步非同步
同步和非同步關注的是訊息通訊機制 synchronous communication asynchronous communication 所謂同步,就是在發出乙個 呼叫 時,在沒有得到結果之前,該 呼叫 就不返回。但是一旦呼叫返回,就得到返回值了。換句話說,就是由 呼叫者 主動等待這個 呼叫 的結...
阻塞與非阻塞 同步與非同步的理解
1 使用場景 1 阻塞與非阻塞的使用場景 i o 多執行緒。2 同步與非同步的使用場景 通訊,多執行緒。2 具體理解 在實際網路程式設計的環境中,一般是指執行緒的同步和非同步與io的阻塞與非阻塞,與系統底層的同步通訊與非同步通訊無關,多執行緒的阻塞即多執行緒的同步,多執行緒的非阻塞即多執行緒的非同步...
同步 非同步與阻塞 非阻塞的理解
在學習到python網路程式設計,socketserver.中,涉及到select的應用,由此了解到socket的setblocking模式,了解了socket有阻塞與非阻塞的區別,同時網上查詢了一下,感覺對非同步 同步的概念有些重疊,為此深入了解一下。在linux網路io中涉及到如下模型 1 阻塞...