java開發系統核心 自動化程序切換

2021-07-25 17:21:06 字數 2387 閱讀 3191

我們已經通過時鐘中斷完成了兩個程序間的相互切換。但當前實現有很大的缺陷,例如我們只能在兩個指定的程序間切換,如果要想增添新的程序,那麼,沒增加乙個程序,按照當前模式,我們只能再增加相應**,這顯然是不可接受的。因此,這節,我們希望完成程序的切換機制,使得有新程序時,我們無需改動**,程序的管理機制會自動把新進場新增進切換機制。

我們看看新修改的**,首先是multi_task.h:

struct task ;

#define max_tasks 2

#define task_gdt0 7

#define size_of_task 112

struct taskctl ;

struct task *task_init(struct memman *memman);

#define size_of_taskctl (4 + 4 + 4*max_tasks + size_of_task*max_tasks)

struct task *task_alloc(void);

task 結構體用來表示乙個程序,其中的sel表示該程序的tss32結構所對應的段描述符下標,flag用來表示當前任務狀態,例如是空閒還是占用。

taskctl 是任務控制器,它包含了task陣列,也就是taskctl是一組程序的集合,runnging表示當前有多少個正在執行的程序,now表示下乙個將被切換到前台的程序編號。

我們再看看對應函式的具體實現,在multi_task.c中:

static

struct timer *task_timer;

static

struct taskctl *taskctl;

struct task *task_init(struct memman *memman)

task = task_alloc();

task->flags = 2; //active

taskctl->running = 1;

taskctl->now = 0;

taskctl->tasks[0] = task;

load_tr(task->sel);

task_timer = timer_alloc();

timer_settime(task_timer, 100);

return

task;

}struct task *task_alloc(void)

}return0;}

void task_run(struct task *task)

void task_switch(void)

farjmp(0, taskctl->tasks[taskctl->now]->sel);

}return;

}

task_init主要是初始化任務控制器物件,同時建立乙個時鐘,用於程序排程,同時為每個任務分配乙個全域性描述符,這個描述符指向該任務所對應的tss32結構,並且將第乙個任務的tss32載入進cpu.

當有新的程序需要排程時,需要呼叫task_alloc為該程序建立乙個任務物件,有了任務物件才能加入排程佇列,與其他程序一起參與排程。

一旦為新程序分配任務物件後,需要呼叫task_run,將其加入排程佇列,這樣,新新增的任務會在排程佇列中等待,當排在前面的任務執行後,它才會被切換到前台。

task_switch 是由時鐘中斷呼叫的,目前我們的任務排程演算法很簡單,就是排隊處理,排在前面的先排程,執行1秒後,切換到下乙個,如果佇列中所有的任務都排程過了,那麼重新回到佇列頭,再開啟新一輪的排程。

我們看看中斷響應函式的更改,timer.c:

void inthandlerfortimer(char *esp) }}

if (ts != 0)

}return;

}

這個函式的邏輯跟以前是一樣的,只不過是用task_switch更換了原來的排程函式。

最後是主入口函式的更改,在write_vga_desktop.c中:

void cmain(void)
它先呼叫task_init 初始化任務排程器,啟動整個任務排程的流程,然後通過task_alloc分配乙個新的任務物件,並把該任務對應的程序初始化為task_b_main,其中對task物件中的tss,初始化的邏輯跟以前是一樣的,最後通過task_run, 把新分配的任務新增到任務排程流程中。

上面的**完成後,執行結果跟以前一樣,雖說結果變化不大,但我們程序排程的機制變了,由原來的手段機制轉變為自動機制,乙個程序排程模組的大體框架已經形成,以後如果我們想要實現更複雜的任務排程演算法打下了紮實的基礎。

自動化測試框架 自動化測試呼喚開發

週末參加了testage 測試時代 組織的乙個專家討論會。主要討論測試自動化。說是專家討論會,我參加實在是慚愧,我對測試的理解實在是太淺薄了。只是因為在部落格上發表了一些謬論才收到邀請。想著可以幫助公司去接受一些新的思想,而自己也可以結識一些朋友,便去了。對於測試時代的會議組織,我以為定位和思路還是...

自動化測試核心部分

1 使用selenium中的webdriver模組對瀏覽器進行操作 1 from selenium import webdriver 載入模組 2 b webdriver.friefox 開啟瀏覽器 5 ele b.find element by id name 定位元素 6 ele.clear e...

自動化儲存物流系統

專業的自動化儲存物流系統整合商應提供完整的物流網路方案規劃 物流系統設計與整合 物流裝置設計與製造 與erp 或mes 系統無縫銜接。具備諮詢規劃與工程實施相結合 資訊科技與現代管理技術相結合 自動化專有技術與行業特點相結合的強大系統整合能力。china racking針對物流行業特點,研究智慧型物...