本週進行「Linux Device Drivers: Jollen 的 10 堂課」教育訓練,發現有些同學對於作業系統的「排程(scheduling)」觀念仍有些疑問,因此,在課程中以三段小程式來說明「什麼是排程」,以協助同學建立紮實的排程觀念。
以下是一段正常的 open system call 實作:
int card_open(struct inode *inode, struct file *filp) { return 0; }
當 process 開啟 device file 後,因為 kernel-space 的 open system call 實作會直接 return,因此 CPU 會切換至前景(foreground)、 process 繼續往下執行。
第二段是不正確的 open system call 實作:
int card_open(struct inode *inode, struct file *filp) { while (1); return 0; }
當 process 開啟 device file 後,因為 CPU 切換至後景(background),但是在 OS 裡頭的 open system call 實作是一個無窮迴圈,OS 並沒有做 system call 的返回,因此 CPU 並不會切換到前景,所以,電腦感覺起來呈現「當機」狀態。
因為 CPU 的時間無法切換到前景,因此任何的 process 都無法執行,電腦當然沒有任何反應。這裡,可沒有所謂的「time slice」與「context switch」的觀念與動作。請同學思考:作業系統是對 process 做排程。
最後一段程式,我們加入了呼叫排程器的動作:
int card_open(struct inode *inode, struct file *filp) { while (1) schedule(); return 0; }
schedule() 是排程器主函數,等於是主動呼叫 scheduler 做 re-scheduling。在這個情況下,雖然 OS 仍然沒有做 system call 返回,但因為我們以「手排」的方式做排程,因此 CPU 會換切到前景,前景程式就會被分配時間執行,因此,電腦仍然有反應。
唯一要注意的地方是,因為這一個 open system call 並沒有 return,所以原來的 process 並不會繼續往下執行。利用三段簡單的程式碼,對作業系統的排程觀念做了一次討論,對於建立「什麼是 scheduling」的觀念,是很有幫助的。
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw