Linux 驅動程式的 scheduling 觀念, #1:

jollen 發表於 December 14, 2008 11:58 AM

本週進行「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」的觀念,是很有幫助的。

讀者留言 (1)

  • Jer-ming 於 December 14, 2008 21:44:

    請問 Jollen 在第二個 open system call 實作中, 作業系統是否會由 timer interrupt 驅動而執行 scheduler 做 process reschedule 而不會死當?

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。