白話操作系統筆記4——進程調度與通信

當進程創建完之後,我們知道他會經歷等待,就緒,運行狀態,最終終止
那麼進程在哪裏經歷這些狀態呢?

還記得我們的汽車類比嗎?
不同狀態的車就被放到不同的道路上排隊,進程進入系統時,就會被加入到作業隊列中
這個作業隊列是一種統稱,包括就緒隊列,阻塞隊列,以及I/O隊列等

下圖來自《操作系統概念》

這裏寫圖片描述

長方形表示隊列,原型表示爲隊列服務的資源,箭頭表示系統內進程的流向

我們可以看到,當一個進程在就緒隊列中,一旦分到CPU將會發生以下時間之一

1發出一個I/O請求,並被放到I/O隊列中
(簡單來說就是必須要輸入輸出某些東西才能計算,就像一個C程序中的邊輸入邊計算,很重要,因爲此時該隊列就會失去CPU資源,然後被其他進程佔有,這裏會經常出題,往往需畫圖計算)

2創建一個新的子進程,並等待其結束
3等待中斷,由於中斷而被強制釋放CPU,並被放回到就緒隊列中

剛剛我們從進程的角度來解釋進程調度,就是在這個過程中進程經歷了什麼,現在,我們從操作系統的角度看,他是如何做到這些的

首先理解三個概念
長期調度:從作業池中選擇進程,裝入內存中準備執行
短期調度:從準備執行的進程中選擇進程,併爲之分配CPU
中期調度:比較奇葩,將進程從內存中移出,之後再重新進來,目的是爲了降低多道程序的程度,以免CPU切換頻率過高(這會導致CPU利用率的問題)

他們之間的區別很簡單,就是使用的頻率,短期最高,中期次之,長期最慢
而且長期調度是中期和短期的前提

(爲了顯示逼格,來英文版的圖)

這裏寫圖片描述
增加了中期調度的隊列圖

以上是進程的隊列情況和操作系統的三種調度,單個進程的經歷就是如此,接下來,我們來看看進程間的通信

再看一遍進程定義:進程是進程映像的運行過程,是系統進程資源分配和調度的一個獨立單位
重點看後半句,這意味着進程都是像分子般的獨立個體,別的分子是不允許進入我的體內的。
也就是說進程之間無法相互訪問,所以需要有第三方——共享內存

就像雖然兩個人不能直接交換東西,但是兩個人擁有同一個包,一個人放東西,一個人取東西
不過此時要注意的是,避免甲在放的時候乙又在取,同時還有包已經滿了,甲不知道還在放或者包空了,乙還在去等等情況,這需要雙方有交流機制(我們稱爲信號量),也是後面的一大知識點,(到這其實我明白一個道理,操作系統的知識都是伴隨着解決問題而一點一點出現的,所以帶着解決問題的心態去學就不會覺得空了)

那除了共享空間還有其他方法嗎?當然有,消息傳遞
因爲進程之間的通信本質上是數據交換,有兩種方式
直接通信方式:直接將消息發給接受進程
間接通信方式:先發給某個中間實體,然後接受進程從中間實體取得信息,這個中間實體稱爲信箱

簡單吧?那我問你,間接通信和共享空間的區別是什麼?

——————————我是分割線——————————

又盜一個圖

這裏寫圖片描述

圖中表示消息message,a圖是消息傳遞(注意中間實體在內核中),b圖爲共享內存

當然了消息傳遞也會帶來問題,不用想就知道——延遲,就像qq一樣你不上網我發給你的消息你永遠看不到。所以會存在同步和異步問題,解決方案在後面又是一堆方法(o(╯□╰)o)

值得一提的是,除了以上兩種,還有一種特殊的方法——管道通信
他是消息傳遞的一種特殊方式

管道就是連接一個讀進程和寫進程以實現他們之間通信的一個共享文件
具體方法是:像管道提供輸入的發送進程(寫進程),以字符流形式將數據送入寫管道
然後接收進程接收管道輸出的數據

就像雙方建立了長期戰略伙伴關係,約好了特殊的消息傳遞方式,速度當然比一般的消息傳遞快

但是也會有問題,就是此時必須要確定雙方都在,同步,所以要求比較高。

筆記3和4其實埋下了後面關於進程管理的學習的主要內容,包括死鎖,信號量,同步和異步,進程調度的算法等,瞭解這些纔算真正開始深入操作系統,加油!