調度小程序的實現

進程調度

進程調度的作用是為了組織系統中的進程能夠合理的去使用CPU,使得進程的運行時間以及運行效率得到很大的提升。

進程調度的代碼看過,但是裡面的結構體,以及鏈表的使用太多,所以有時看著看著不知道鏈表中出現的結構體是什麼了。

然後就看了《深入理解linux內核》中的進程調度,看了調度的概述,調度的原理,以及方法,自己模擬了一個調度程序。

調度的算法有三種,自己用的是輪片法,這兒 的時間片是根據靜態優先級算出來的。公式為:

時間片=(140-優先級)*20 (優先級<120)

時間片=(140-優先級)*5 (優先級>=120)

優先級的取值範圍為(100~139)

初步理解是下一個進程的調度是根據前一個進程的運行時間、優先級,以及運行時有無阻塞來完成的。

時間片定了,就得定優先級了。優先級除了靜態優先級還有動態優先級,動態的公式為:

動態優先級=max(100,min(靜態優先級-bonus+5,139))

這裡的bonus是根據進程的休眠時間結合算法得到的,算法不知道是什麼,所以自己採用的靜態的優先級。

接下來就是模擬有無阻塞現象,應該是用匯編寫一個軟中斷,去模擬阻塞,但是寫到彙編保護現場的時候就懵了,所以最後用的是隨機數,判斷是否>=3,若是,則有阻塞現象。

以上3個條件確定之後,做了一個task結構體:

調度小程序的實現

以及兩個隊列:

調度小程序的實現

這塊採用了循環雙鏈表的結構,剛開始為了方便,用數組,發現查找方便,刪除和插入麻煩,後來用單鏈表和循環單鏈表,發現插入都是很麻煩的,所以,使用循環雙鏈表。另外隊列使用哈希鏈地址法,關鍵字是優先級,因為如果按鏈表的形式鏈下去,對優先級相同的進程不好操作。

在這,也明白為什麼內核中會有個list.h,真是方便的很。

進程的基本狀態有三種:運行、就緒、阻塞。轉換關係為:就緒到運行,運行到阻塞,阻塞到就緒。所以創建了上邊兩個隊列。

接下來就是對兩個隊列的操作,刪除和添加:

調度小程序的實現

調度小程序的實現

最主要的就是對進程運行時的處理,寫了個run()函數。

調度小程序的實現

調度小程序的實現

剛一開時,先是檢測有沒有從阻塞態轉到就緒態的進程,有,則先轉移,然後在運行,停止運行的條件是以進程的時間來做的,每次循環都會減一,知道為0。如果,循環中產生的隨機數>=3,則說明有阻塞產生,停止運行,並且切換狀態。

以上就是自己做的一個調度小程序。帶的代碼,是在VC下實現的,如果在linux下,把windows.h改成unistd.h,Sleep()改成sleep()。


分享到:


相關文章: