jollen.org

Jollen 的 Blog
Jollen's email: jollen # jollen.org
more:  Jollen's Training

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」的觀念,是很有幫助的。

Tags:

純手工打造說明:技術專欄文章為 Jollen 原創,內容皆為人工撰寫,無 AI 生成。轉載請註明出處與作者,並全文引用。轉載時請在文章開頭或結尾明顯處註明「本文出處:https://www.jollen.org,已取得原作者同意並授權使用。」
訂閱電子報:不定期 Jollen's Blog 精選文章隨 Moko365 電子報寄送;請透過 Moko365 電子報訂閱(可隨時取消)。

Copyright(c) 2001–2008 www.jollen.org. All rights reserved.
Last update: 2026-07-22