linux0 11程序排程分析

2021-06-27 13:53:41 字數 716 閱讀 7202

10ms時鐘中斷 --> 時鐘中斷函式timer_interrupt,將jiffier加1 --> 呼叫do_timer函式,將當前程序counter計數減1,如果--counter大於0,則返回繼續執行該任務,否則 --> 呼叫schedule函式,**如下:

void schedule(void)

if (((*p)->signal & ~(_blockable & (*p)->blocked)) &&

(*p)->state==task_interruptible)

(*p)->state=task_running;

}/* this is the scheduler proper: */

while (1)

if (c) break; // 如果找到最大counter不為0的任務,則跳出while(1),切換到next任務,或者沒有找到state==0的任務,則也跳出while(1),切換到任務0。

for(p = &last_task ; p > &first_task ; --p)

if (*p)

(*p)->counter = ((*p)->counter >> 1) +

(*p)->priority;

} switch_to(next);

}

注意:任務0並沒有在任務結構指標陣列中,first_task 指向的是init_task。

linux0 11程序睡眠喚醒原理分析

程序的睡眠是通過呼叫sleep on函式,該函式修改了程序的狀態並且通過schedule函式切換到其他程序執行,從而實現程序的掛起,task uninterruptible狀態的程序只能被wake up函式喚醒。task interruptible狀態的程序可以被wake up和訊號喚醒。喚醒的時候...

Linux0,11 核心分析 硬碟篇

因為在保護模式下無法呼叫bios中斷,所以只好自己編寫 控制硬碟讀寫。對於硬體的控制,其實就是往對應的埠讀寫資料,硬碟也是如此。當硬碟控制器完成某項操作時,則會用中斷的方法提示cpu。我們所要做的,就是先根據需要往埠讀寫資料,然後設定相應的中斷呼叫函式。這樣就可以完成硬碟的讀寫工作。中斷呼叫函式的內...

Linux0 11核心 fork 函式建立程序

用fork建立程序 除了程序0,其它所有的程序都是fork產生的。子程序是通過複製父程序的資料和 產生的。建立結束後,子程序和父程序的 段 資料段共享。但是子程序有自己的程序控制塊 核心堆疊和頁表。我們知道乙個程序需要有如下3個結構 1 task陣列中的一項,即程序控制塊 task struct 2...