新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > uClinux進程調(diào)度器的實現(xiàn)分析

uClinux進程調(diào)度器的實現(xiàn)分析

作者: 時間:2012-03-24 來源:網(wǎng)絡(luò) 收藏

(4)當喚醒一個睡眠進程時,發(fā)現(xiàn)被喚醒的進程比當前進程優(yōu)先級更高。www.51kaifa.com

(5)一個進程通過執(zhí)行系統(tǒng)調(diào)用來改變或降低自身的優(yōu)先級,從而引起調(diào)度。

4 Schedule調(diào)度程序核心部分源代碼分析[3]

該調(diào)度程序的目標是選擇下一個要執(zhí)行的進程:首先對所有進程進行檢測,喚醒任何一個得到信號的進程,即改變進程的state屬性;然后根據(jù)時間片和優(yōu)先級調(diào)度機制來計算處于就緒隊列中每個進程的綜合優(yōu)先級,其計算方法由goodness( )函數(shù)實現(xiàn);接著選擇綜合優(yōu)先級最高的進程作為隨后要執(zhí)行的進程,若就緒隊列中沒有可調(diào)度的,則重新分配時間片,即改變進程的counter屬性值,并利用switch_to( )函數(shù)進行進程切換。


asmlinkage void schedule(void){

struct schedule_data * sched_data;

/*描述進程的數(shù)據(jù)結(jié)構(gòu),

包含指向所運行CPU的屬性。*/

struct task_struct *prev, *next, *p;

struct list_head *tmp;

int this_cpu, c;

spin_lock_prefetch(runqueue_lock);

need_resched_back:

prev = current;

this_cpu = prev->processor;

if (unlikely(in_interrupt())) {

/*判斷是否在中斷服務(wù)程序中*/

printk("Scheduling in interruptn"); www.51kaifa.com

/*是的話則打印錯誤提示,退出調(diào)度器*/

BUG();

}

release_kernel_lock(prev, this_cpu); /*釋放全局內(nèi)核鎖和全局中斷鎖*/

sched_data=aligned_data[this_cpu].schedule_data;

if (unlikely(prev->policy == SCHED_RR))

if (!prev->counter) {

prev->counter= NICE_TO_TICKS(prev->nice);

move_last_runqueue(prev);

}

switch (prev->state) {

case TASK_INTERRUPTIBLE:

/*此狀態(tài)表明進程可以被信號中斷*/

if (signal_pending(prev)) {

/*如果該進程有未處理的信號*/

prev->state= TASK_RUNNING; break;

}

default:

del_from_runqueue(prev);

case TASK_RUNNING:;

}

prev->need_resched = 0;

repeat_schedule: /*缺省選擇空閑進程*/

next = idle_task(this_cpu);

c = -1000;

list_for_each(tmp, runqueue_head) {

p = list_entry(tmp, struct task_struct, run_list);

if (can_schedule(p, this_cpu)) {

/*尋找優(yōu)先級最高的那個進程*/

int weight=

goodness(p, this_cpu, prev->active_mm);

if (weight > c)

c = weight, next = p;

}

}



評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉