java開發系統內核:實現進程優先級

更詳細的講解和代碼調試演示過程,請參看視頻
Linux kernel Hacker, 從零構建本身的內核vue

咱們有了進程調度,目前來看,全部進程一概平等。咱們的調度算法是遍歷每個進程,而後給每個進程必定的運行時間,而後再切換下一個進程。但實際運用上,進程間不會是平等的,有些進程承擔着比較重要的工做,所以,它有理由得到更多的運行時間,例如內核進程,一些進程不是很重要,同理,它就不該該佔用過分的CPU資源。本節,咱們要引入進程優先級的功能,讓優先級高的進程得到更多的運行機會。算法

首先咱們須要改動的是對TASK結構體的定義(multi_task.h):微信

struct TASK {
    int sel, flags;
    int priority;
    struct TSS32 tss;
};

咱們增長了一個變量叫priority, 這個變量表明着進程的優先級,同時也是進程運行的時間片,這個值越大,進程得到的CPU運行時間就越多。TASK對象的相關處理函數也須要作相應改動,在multi_task.c中:markdown

struct TASK  *task_init(struct MEMMAN *memman) {
....
    task = task_alloc();
    task->flags = 2;  //active
    task->priority = 100;
    taskctl->running = 1;
    taskctl->now = 0;
    taskctl->tasks[0] = task;
    load_tr(task->sel);
    task_timer = timer_alloc();
    timer_settime(task_timer, task->priority);
    return task;
....
}

void task_run(struct TASK *task, int priority) {
    if (priority > 0) {
        task->priority = priority;
    }

    task->flags = 2;
    taskctl->tasks[taskctl->running] = task;
    taskctl->running++;
    return;
} 

void task_switch(void) {
    struct TASK *task;

    if (taskctl->running >= 2) {
        taskctl->now++;
        if (taskctl->now == taskctl->running) {
            taskctl->now = 0;
        }

        task = taskctl->tasks[taskctl->now];
        timer_settime(task_timer, task->priority);        
        farjmp(0, taskctl->tasks[taskctl->now]->sel);
    }

    return;
}

每一個任務分配時,它的優先級會默認設置成100,也就是該任務能得到1秒的運行時間。task_run多增長了一個參數,也就是任務優先級,當一個任務準備加入調度隊列時,須要指定它的優先級,在task_switch中,任務切換時,咱們經過timer_settime來設置任務的運行時間,你們能夠看到,時鐘的長度設置爲task->priority, 也就是說,任務的優先級同時也是任務的CPU運行時間。app

任務激活的相關代碼也須要作改動,任務能夠對應一個數據隊列,當隊列有數據抵達時,隊列會把存儲在其中的任務加入調度隊列,這個功能的實現是在golobal_define.c中,所以,咱們也須要作相應改動:函數

int fifo8_put(struct FIFO8 *fifo, unsigned char data) {
....
    if (fifo->task != 0) {
        if (fifo->task->flags != 2) {
            task_run(fifo->task, 0);
        }
    }
....
}

當任務從新被激活時,咱們傳入的優先級數值是0,根據task_run的實現,當優先級數值爲0時,任務保持原有優先級不變。最後須要改動的是主入口函數,在write_vga_desktop.c中:ui

void CMain(void) {
....
for (i = 0; i < 2; i++) {
....
task_run(task_b[i], (i+1)*5);
...
}
....
}

咱們爲第一個任務分配的優先級是5,第二個任務的優先級是10,也就是第二個任務獲得的CPU時間是第一個任務的2倍。將上面代碼編譯運行時能夠獲得下面結果:url


咱們能夠看到,第二個窗口計數數值大概是第一個窗口的2倍,這是由於第二個窗口對應的進程得到的CPU運行時間是第一個窗口兩倍的緣故。spa

本節代碼比較簡單,這是爲了下一次實現更復雜的進程調度功能:優先級隊列作準備的,經過視頻能夠得到更加詳細的代碼講解和演示效果。.net

本文分享自微信公衆號 - Coding迪斯尼(gh_c9f933e7765d)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索