同步與非同步、阻塞與非阻塞的理解

王滔發表於2015-10-11

 

 

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機制

 

相關文章