新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > uClinux進程調度器的實現分析

        uClinux進程調度器的實現分析

        作者: 時間:2012-03-24 來源:網絡 收藏

        (4)當喚醒一個睡眠進程時,發現被喚醒的進程比當前進程優先級更高。www.51kaifa.com

        (5)一個進程通過執行系統調用來改變或降低自身的優先級,從而引起調度。

        4 Schedule調度程序核心部分源代碼分析[3]

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


        asmlinkage void schedule(void){

        struct schedule_data * sched_data;

        /*描述進程的數據結構,

        包含指向所運行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())) {

        /*判斷是否在中斷服務程序中*/

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

        /*是的話則打印錯誤提示,退出調度器*/

        BUG();

        }

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

        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:

        /*此狀態表明進程可以被信號中斷*/

        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)) {

        /*尋找優先級最高的那個進程*/

        int weight=

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

        if (weight > c)

        c = weight, next = p;

        }

        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 广河县| 朝阳区| 高密市| 八宿县| 博白县| 新巴尔虎右旗| 高邮市| 大邑县| 体育| 深州市| 肇州县| 蛟河市| 靖安县| 江永县| 吉安县| 海口市| 永川市| 京山县| 南阳市| 正阳县| 甘南县| 乌拉特前旗| 大丰市| 观塘区| 吉木乃县| 龙陵县| 九江市| 上饶县| 大关县| 平阳县| 通山县| 宜君县| 涟水县| 宜章县| 通海县| 顺义区| 邯郸市| 二连浩特市| 阿拉善右旗| 南雄市| 安陆市|