1. 程式人生 > >同步、非同步、阻塞與非阻塞的理解與使用場景

同步、非同步、阻塞與非阻塞的理解與使用場景

首先來一張圖片大致瞭解一下這四個概念:
111

然後再來聽一聽鄙人的一些個人見解:

先解釋最基礎的概念, 之後用生活化的例子完成認知。

首先是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。