106 OS homework 2-2 成果報告書

組長:B10415031、廖晨竹
組員:B10415038、謝明軒
組員:B10415046、林崇恩
github: https://github.com/CurtLiao/xv6-public


🙂 使用情境說明(包含流程圖)

1. PRIORITY scheduling with starvation :

創建兩個結構為proc的variable,分別是p、p1接著進到無窮迴圈,在建立一個結構為proc的variable,並初始為NULL。之後用一個迴圈去跑整個ptable,搜尋process state為RUNNABLE的,找到後將它 assign 給highP,之後再用highP去跟每一個process比較優先度大小,如果有優先度高於highP的(priority值較小者),則把它assign給highP,找完後就把highP在assign回去給p,並開始執行swtch()。

2. PRIORITY scheduling without starvation :

作法同上,但是在執行完swtch()之後我們要在使用一次迴圈去跑所有process,找到state是RUNNABLE的就去判斷它的priority是否大於1(因為priority設的範圍是1~20),是的話就把它的priority-1,其他在別的狀態的process都去判斷是否小於20,是的話就把priorirty都+1。

3. FCFS scheduling :

創建一個結構為proc的variable : sP,再用迴圈去跑每個process的state,判斷是否是RUNNABLE,是RUNNABLE的話再去判斷sP是不是NULL,如果是NULL,就直接把p assign給它,如果不是的話就要再判斷它的ctime大小,如果p的ctime小於sP的ctime,表示它的時間比較早,所以就把p assin給它,跳出迴圈後,再用一個判斷式去判斷它是不是NULL,不是的話就把sP assign回p,然後開始執行swtch()。


😇 成功畫面

1. PRIORITY scheduling with starvation :

一開始先使用foo 指令創造出數個名為foo的process。(黃線處)
執行之後可以看到,parent process 和創造出的 child process。

使用ps(黃線處)指令print出ptable,可以看到所有process的name、pid、state以及priority,包含前面創的foo process。

註:priority值較大者,優先度較小,反之priority值較小者,優先度較大。

在來使用nice指令去修改process的priority(黃線處)。
可以看到我pid 9的process的prioriry改掉,把它的priority變成8。
再次按下ps,print出目前每個process的狀態,可以看到pid 9的process的priority已經變成8,而且state也從RUNNABLE變成RUNNING。

可以看到這種方法,如果不手動去更改priority的值,低優先度的process就會永遠做不到,所以此種priority scheduling會有starvation的產生。

2. PRIORITY scheduling without starvation :

第二個是做的是改善過後的PRIORITY scheduling,一樣是用foo創造process,因為整個過程很大,所以只截取一部分。

可以看到pid 9的process的state是在RUNNABLE,priority是19,pid 5的process的及pid 7的process的state 都不是在RUNNABLE,且他們的priority較小,優先度較高,所以每過一次,在RUNNABLE的process的priority會減一,而不是在RUNNABLE的process的priority則會加一。

3. FCFS scheduling:

一樣是用foo指令創造process,也是因為過程瑣碎,所以只擷取片段。

從FCFS可以看到先進的process先做,做完之後才換下一個process。
例如一開始pid 8的process在run,而pid 9的process在RUNNABLE,直到process 8的狀態變成sleep之後,process 9就開始run了,可以看到process 9的狀態變成run,而process 10的狀態是RUNNABLE,所以當process 9 做完之後,就換process 10做了。


🏃 實作過程(修改哪些檔案[含圖片])

Part A —實作過程概述 :

1.新增所需system call。

2.新增所需檔案 : foo.c、nice.c…等。

3.在proc.c的scheduler裡面實作priority scheduler。

4.修改priority scheduler,解決starvation的問題。

5.實作FCFS scheduler。


Part B —修改到的檔案 :

新增system call修改到的檔案包含 : syscall.h , syscall.c , sysproc.c , user.h , Usys.S

新增的檔案包含 : parent.c , nice.c , shutdown.c , foo.c , ps.c

寫排程改到的檔案包含 : proc.c , proc.h

1.新增的System Call :

Syscall : shutdown(結束執行QEMU的指令)

Syscall : getppid(取得parent的資訊) , getAllpids(print出所有process)

Syscall : cps(print ptable的指令), chpr(用來改變priority的值)

Syscall : getprocs

2.新增的檔案 :

nice.c :

foo.c :

ps.c :

parent.c :

shutdown.c :

stddef.h :

3.排程更動到的檔案 :

proc.h :(定義priority 以及 ctime變數)


proc.c :(scheduler function裡面修改排程方法)




😎 結論

作業系統的排程方法有很多種,像是xv6原來的RR、SJF、FCFS等等。這次選擇做其中兩種排程,FCFS和 PRIORITY,一開始做好了最原始的PRIORITY scheduler,但是在implement的時候發現說要自己手動去更改process的priority才能使優先度低的process不會starvartion,但這不是一個很好的成品,畢竟一個OS必須避免這種情況發生,所以就把它改得更完善一點,捨棄掉手動的change priority(nice function),使用Aging technique的概念,將一直等待的process優先度慢慢提高,一直在執行的process則慢慢減少,以此解決starvation的問題。

而FCFS不會有starvartion的問題,相對來說比較好實作,但這就不是一個很好的排程方法,畢竟process不能插隊,如果有個process佔在cpu的時間很久,這樣其他process就要等待很長的時間,效率非常差。

經過這次project的練習,更熟悉了scheduler的整個流程,也更加深其他排程方法的概念,透過更改kernel也有機會去trace OS的程式,了解如何增加System call的方式。


📅 組員分工

廖晨竹 :

1.寫PRIORITY、FCFS排程,改善PRIORITY原有的starvation。
2.新增system call : chpr , cps。
3.新增檔案 : nice.c , foo.c ,ps.c
4.Implement排程。
5.成果報告書製作、上台報告。
6.Debug、程式彙整。

謝明軒 :

1.新增檔案 : stddef.h(定義NULL為0)
2.修改listPid.c檔中的bug
3.新增system call : getAllPids , shutdown

林崇恩 :

1.新增system call : getprocs , getppid
2.Implement getprocs
3.校閱成果報告書