同步異步阻塞非阻塞
程序在運作的過程中不斷地改變其運作狀态
通常一個運作的程序必須具有三種狀态:就緒态, 運作态, 阻塞态
當程序已配置設定到除cpu以外的所有必要的資源後,隻要再獲得cpu, 便可執行程式, 程序這時的狀态就稱為就緒态,
在一個系統中處于就緒态的程序可能有多個, 通常将他們排成一個隊列, 這就叫就緒隊列
當程序已經獲得cpu操作權限, 其程式正在運作, 着就叫做運作态
在單核作業系統中, 隻有一個程序處于運作态, 多核作業系統有多個程序處于運作态
正在執行的程序, 由于等待某個事件而無法執行時, 便被作業系統剝奪了cpu的操作時間, 這是就是阻塞态
引起阻塞的原因多種, 例如: 等待i/o操作, 更高優先級的任務搶走了cpu權限等.
一個程序在運作期間, 會不斷地在一種狀态切換到另一隻種狀态
他可以是多次處于就緒态和運作态, 也可以多次處于阻塞态, 下圖是三種狀态的轉換圖
處于就緒态的程序, 當程序排程程式為之配置設定了cpu的時間片後, 該程序就會由就緒态轉變成運作态
處于運作态的程序在運作過程中, 因為配置設定的時間片用完了, 于是失去了cpu的使用權限, 運作态就會重新轉為就緒态
正在運作的程序由于遇到i/o操作或被更高優先級的任務搶走cpu使用權限而無法繼續執行, 便從運作态轉為阻塞态
處于阻塞态的程序, 若其等待的事情已經處理完畢, 于是程序從阻塞态轉為就緒态
同步是指發送方發送資料後, 等接收方發回響應後才發下一個資料報的通訊方式
同步是指兩個程式的運作是相關的, 其中一個線程在阻塞需要等待狀态, 那另一個線程才運作
異步是指發送方發出資料後, 不等接收方發回響應, 接着就發下個資料報的通訊方式
異步是指兩個線程毫無相關, 自己運作自己的
你叫我去吃飯, 我聽到了就立即和你去吃飯, 如果沒有聽到, 你就不停的叫, 直到我告訴你聽到了, 才一起去吃飯
打電話好比同步, 兩邊是同時進行不能再打給另一個人
你叫我去吃飯, 然後自己去吃飯了, 我得到消息後可能立即走, 也可能過會兒走
發消息好比異步, 和一個人發完消息就可能和另一個人發消息
效率最低。拿上面的例子來說,就是你專心排隊,什麼别的事都不做。
如果在銀行等待辦理業務的人采用的是異步的方式去等待消息被觸發(通知),也就是領了一張小紙條,假如在這段時間裡他不能離開銀行做其它的事情,那麼很顯然,這個人被阻塞在了這個等待的操作上面。
異步操作是可以被阻塞住的,隻不過它不是在處理消息時阻塞,而是在等待消息通知時被阻塞。
實際上是效率低下的。
想象一下你一邊打着電話一邊還需要擡頭看到底隊伍排到你了沒有,如果把打電話和觀察排隊的位置看成是程式的兩個操作的話,這個程式需要在這兩種不同的行為之間來回的切換,效率可想而知是低下的。
效率最高
因為打電話是你(等待者)的事情,而通知你則是櫃台(消息觸發機制)的事情,程式沒有在兩種不同的操作中來回切換。
比如說,這個人突然發覺自己煙瘾犯了,需要出去抽根煙,于是他告訴大堂經理說,排到我這個号碼的時候麻煩到外面通知我一下,那麼他就沒有被阻塞在這個等待的操作上面,自然這個就是異步+非阻塞的方式了。
很多人會把同步和阻塞混淆,是因為很多時候同步操作會以阻塞的形式表現出來,同樣的,很多人也會把異步和非阻塞混淆,因為異步操作一般都不會在真正的io操作處被阻塞。