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