http://www.zhihu.com/question/19732473異步
本質都是爲了提升效率爲目的spa
我作一件事情,請求外部協助。外部還沒響應結果,我要怎麼辦,一種辦法是,我一直等着對方給我答覆結果。另一種是,對方主動通知我。這是同步和異步的區別。unix
好比水壺,有沒有主動報警(當水開了時)的機制。進程
而我那個時候在幹嗎,我能夠去幹別的工做,這種就是阻塞仍是非阻塞。get
阻塞指的是調用者。異步通常是非阻塞模式。同步
同步,關注的是調用者,調用者本身要不要按期去看返回結果(燒開水的人要不要定去看水壺裏的水是否開)。io
若是不須要看,那麼就是被調用者主動通知調用者(水壺自動報警通知人),這種狀況,永遠是異步。效率
同步,異步關注的是通訊狀態:調用者和被調用者相互如何通訊。是同步通知,仍是異步通知?select
阻塞,關注的是,等待時能不能幹別的事情:調用者此時沒有獲得調用結果前,能不能去幹別的事情。能去幹別的事情,就是非阻塞。請求
同步通常都是阻塞模式。由於要卡着等待結果嘛,不能幹其餘事情。
--------------------------------------地鐵上思考
現實生活中不少相似的例子。異步、非阻塞,都是對原來方式的提升效率。因此,應該是從現實生活中借鑑過來的
那有沒有,同步非阻塞模式呢?
有!
現實生活中,人等待水壺燒開水。
人能夠等着水燒開,什麼都不作,也能夠去幹其餘事情。
去幹其餘事情,就是非阻塞。
人本身按期去看開水開沒開,這個過程,須要本身去看,是同步。
發現這樣效率不高,看一次,水沒有開,再看一次,也沒開。因而人們想到,能不能這樣的思路:水壺的水開了後,水壺本身通知人(調用者)呢?安一個報警器,鳴叫的方式通知人。這種方式是異步。
異步與同步解決的問題:是按期去看調用結果,仍是有結果了自動通知去接受。
郵局的信件:我有沒有來信,郵政局的人打電話通知我。這是異步。我須要隔一天跑到郵政局看有沒有本身的信件。這是同步。
同步調用,異步調用,這樣的叫法可能誤導了咱們。是從調用的角度來講的。
我理解異步,每每是與非阻塞一塊兒使用的,不然異步沒多少實際意義,並不能達到提升效率的目的。
好比,我對比現實中,我等待郵局給我通知信件。我不用去郵局跑了,可是這個時間,咱們會去幹其餘事情(能夠幹其餘事情就是非阻塞)。而不是等在這裏,別的事情什麼都不幹,這樣提升不了效率(的確避免了人跑去看,人會疲勞,機器沒這個概念,因此忽略掉)
由於異步與非阻塞每每混在一塊兒了使用,因而很難去區別兩個的區別。實際要解決的問題不一樣。
概括
通俗地記憶:等待結果的過程當中,能不能幹別的事情。能,就是非阻塞,不能,就是阻塞。
是調用者本身按期去看調用結果,仍是被通知有結果。須要本身去看有沒有返回結果,是同步模式。是被通知,則是異步。
------------------------------------------
網 上摘錄:對 unix來說,阻塞式I/O(默認),非阻塞式I/O(nonblock),I/O複用(select/poll/epoll)都屬於同步I/O,由於它 們在數據由內核空間複製回進程緩衝區時,都是阻塞的(不能幹別的事)。只有異步I/O模型(AIO)是符合異步I/O操做的含義的,即在1數據準備完成、 2由內核空間拷貝回緩衝區後通知進程,在等待通知的這段時間裏能夠幹別的事。
下階段,研究select,poll,epoll機制