為了讓多工的特性展示的更直觀,本節,我們基於多工的基礎上,為系統實現多個視窗特效,每個視窗都執行於乙個任務或程序。由於視窗基於各自不同的程序,因此視窗自身的變化更新不會影響到其他視窗。
void cmain(void) ;
int i = 0;
for (i = 0; i < 2; i++)
sheet_slide(shtctl,sht_win_b[0], 16, 28);
sheet_updown(shtctl, sht_win_b[0], 1);
sheet_slide(shtctl, sht_win_b[1], 160, 28);
sheet_updown(shtctl, sht_win_b[1], 1);
//switch task
....
}
在上面的主入口函式中,我們先定義乙個視窗陣列物件sht_win_b, 已經任務陣列物件task_b, 每乙個任務物件對應乙個視窗物件。接著在for迴圈中,啟動兩個程序,這兩個程序執行的函式都是task_b_main, 這裡需要特別注意的是,如何把視窗物件傳遞給程序:
task_b[i]->tss.esp -= 8;
((int)(task_b[i]->tss.esp + 4)) = (int)sht_win_b[i];
esp 對應程序的堆疊,要想把資料傳遞給程序,我們可以把資料壓到程序的堆疊上,我們像把esp 減8,這樣就可以空出8個位元組,從中拿出4個位元組用於儲存對應的視窗物件。
然後通過呼叫sheet_slide 和 sheet_updown 將視窗挪到桌面合適位置。
void task_b_main(struct sheet *sht_win_b) else }}
}
task_b_main函式跟以前不同的是,它多了乙個輸入引數,這個引數就是它需要處理的視窗物件。task_b_main執行時,在它的迴圈體中,它會初始化乙個計數器,然後把計數器的數值轉換成字串,然後再把字串顯示到視窗的內部,相關**就是下面這幾句:
showstring(shtctl, sht_back, pos, 192, col8_ffffff, "b");
// farjmp(0, 8
*8);
timer_settime(timer_b, 100);
pos += 8;
boxfill8(sht_win_b->buf, 144, col8_c6c6c6, 24, 28, 104, 44);
完成上面**後,編譯核心,將核心載入到虛擬機器後,運**況如下:
多工系統
多工系統的事件響應是在中斷中完成的,但事件的處理是在任務中完成的。在多工系統中,任務與中斷一樣,也具有優先順序,優先順序高的任務會被優先執行。當乙個緊急事件在中斷中被標記之後,如果事件對應的任務的優先順序足夠高,就會立刻得到響應。相比前後臺系統,多工系統的實時性又被提高了。int flag1 0 i...
python核心 多工 Linux
1.程序的建立 os.fork 建立乙個程序 import os ret os.fork 建立乙個新的程序 print haha 結果為haha hahaimport os import time ret os.fork 建立乙個返回值等於0的子程序,而父程序是乙個大於0的值 if ret 0 wh...
java開發作業系統 同時執行多視窗多工
在系統有了命令列視窗後,我們可以直接在視窗內輸入命令,啟動應用程式。當通過命令列載入執行使用者開發的程式時,命令行會被 冷凍 這是因為被啟動的程式與命令列屬於同一程序,cpu要把執行的許可權交給應用程式,命令列視窗得不到執行的機會,因此看上去像宕機一樣。這造成的乙個問題是,命令列視窗一次只能載入乙個...