進程同步(synchronous)
?通俗理解:
就像在排隊買飯,一個一個來,前面的人不走,后面的人就不能干事。
進程同步就是:多個進程之間需要協調,有先后順序,一個進程要等另一個進程完成某件事后才能繼續。
🎯舉個例子:
你和朋友一起搭積木:
-
你負責搭第一層,
-
他負責搭第二層,
-
他必須等你第一層搭好后,才能開始。
這就是同步:有依賴,有先后,誰先做完誰后做都講究順序。
進程異步(asynchronous)
?通俗理解:
就像在食堂里點餐,你點好餐以后可以找座位坐著等,后廚在忙著做菜,你不用一直站著等,等做好了再通知你來取。
進程異步就是:大家互不等候,各干各的,有結果了再通知或交接。
🎯舉個例子:
你和朋友寫一篇報告:
-
你寫前言和總結,他寫正文部分,
-
寫的順序沒有依賴,
-
寫完后合并就行。
這就是異步:不講順序,各自完成自己的部分即可。
進程互斥
為了實現對臨界資源的互斥訪問,同時保證系統整體性能,需要遵循以下原則:
-
空閑讓進。臨界區空閑時,可以允許一個請求進入臨界區的進程立即進入臨界區;
-
忙則等待。當已有進程進入臨界區時,其他試圖進入臨界區的進程必須等待;
-
有限等待。對請求訪問的進程,應保證能在有限時間內進入臨界區(保證不會饑餓);
-
讓權等待。當進程不能進入臨界區時,應立即釋放處理機,防止進程忙等待。
為什么要進程互斥
假設有兩個進程 A 和 B,都要向同一個打印機發送任務:
-
A 發送打印內容“學生成績”
-
B 發送打印內容“工資單”
如果沒有互斥控制,它們可能會同時操作打印機,結果打印出的內容可能是:
學生工分資單
內容完全錯亂!同樣的問題也可能發生在共享內存、全局變量、數據庫記錄等任何“共享資源”上。