Lab6 程序的排程

2022-07-04 05:51:12 字數 2768 閱讀 2602

從就緒佇列中挑選下乙個占用cpu執行的程序,從多個可用cpu中挑選就緒程序可使用的cpu資源

比較排程演算法的準則

吞吐量與延遲

低延遲:喝水的時候想要一開啟水龍頭水就流出來

高頻寬:給游泳池充水時希望從水龍頭裡同時流出大量的水,並且不介意是否存在延遲

減少響應時間

減少平均響應時間的波動

增加吞吐量

減少等待時間

依據程序進入就緒狀態的先後順序排列,程序進入等待或結束狀態時,就緒佇列中的下乙個程序占用cpu

但是fcfs的平均等待時間波動較大,i/o資源和cpu資源的利用率較低

選擇就緒佇列中執行時間最短程序占用cpu進入執行狀態,用歷史的執行時間來預估未來的執行時間,短程序優先演算法具有最優平均周轉時間

但是連續的短程序流會使長程序無法獲得cpu資源

選擇就緒佇列中響應比r值最高的程序

r=(w+s)/s

w: 等待時間(waiting time)

s: 執行時間(service time)

利用時間片作為分配處理機資源的基本時間單元,時間片結束時,按fcfs演算法切換到下乙個就緒程序, 每隔(n – 1)個時間片程序執行乙個時間片q

但是時間片輪轉演算法需要選擇好時間片的大小,過大過小都會導致效率問題

就緒佇列被劃分成多個獨立的子佇列,如:前台–rr、後台–fcfs

程序可在不同佇列間移動的多級佇列演算法,時間片大小隨優先順序級別增加而增加,如程序在當前的時間片沒有完成,則降到下乙個優先順序

fss控制使用者對系統資源的訪問,一些使用者組比其他使用者組更重要,保證不重要的組無法壟斷資源,未使用的資源按比例分配,沒有達到資源使用率目標的組獲得更高的優先順序

這個實驗其實有兩個,乙個是實現round robin,乙個是stride scheduling,兩個都非常簡單。

round robin排程演算法的排程思想是讓所有 runnable 態的程序分時輪流使用 cpu 時間。round robin 排程器維護當前 runnable程序的有序執行佇列。當前程序的時間片用完之後,排程器將當前程序放置到執行佇列的尾部,再從其頭部取出程序進行排程。

具體看一下stride scheduling

1、為每個runnable的程序設定乙個當前狀態stride,表示該程序當前的排程權。另外定義其對應的pass值,表示對應程序在排程後,stride 需要進行的累加值。

2、每次需要排程時,從當前 runnable 態的程序中選擇 stride最小的程序排程。對於獲得排程的程序p,將對應的stride加上其對應的步長pass(只與程序的優先權有關係)。

3、在一段固定的時間之後,回到步驟2,重新排程當前stride最小的程序

static void  

stride_init(struct run_queue *rq)

首先是佇列初始化函式

static void

stride_enqueue(struct run_queue *rq, struct proc_struct *proc)

proc->rq = rq;

rq->proc_num ++;

}

然後是入隊函式stride_enqueue,根據之前對該排程演算法的分析,這裡函式主要是初始化剛進入執行佇列的程序 proc 的stride屬性,然後比較隊頭元素與當前程序的步數大小,選擇步數最小的執行,即將其插入放入執行佇列中去,這裡並未放置在佇列頭部。最後初始化時間片,然後將執行佇列程序數目加一。

static void

stride_enqueue(struct run_queue *rq, struct proc_struct *proc)

proc->rq = rq;

rq->proc_num ++;

}

static void

stride_dequeue(struct run_queue *rq, struct proc_struct *proc)

static struct proc_struct *

stride_pick_next(struct run_queue *rq)

#endif

//更新對應程序的stride值

if (p->lab6_priority == 0)

p->lab6_stride += big_stride;

else p->lab6_stride += big_stride / p->lab6_priority;

return p;

}

接下來就是程序的排程函式stride_pick_next,觀察**,它的核心是先掃瞄整個執行佇列,返回其中stride值最小的對應程序,然後更新對應程序的stride值,將步長設定為優先順序的倒數,如果為0則設定為最大的步長。

static void  

stride_proc_tick(struct run_queue *rq, struct proc_struct *proc)

if (proc->time_slice == 0)

}

最後是時間片函式stride_proc_tick,主要工作是檢測當前程序是否已用完分配的時間片。

相對於這兩個演算法我覺得更重要的是明白程序的排程時機

時鐘中斷處理函式檢測到時間片到期了

發生阻塞或者睡眠等情況

軟體構造 lab6吞吐率優化

為猴子選擇梯子時,其中的乙個策略是選擇距離起點最近的猴子速度最大的梯子。我以為這個方案吞吐率會很高,但實際執行時,在最後時刻經常出現這種情況 如圖,梯子1,2,3明明都是空的,但後上梯子的猴子還是只選擇梯子0.實際觀察會發現,在等待梯子1上所有猴子過河的過程中,吞吐率會有比較大的下降。gui上顯式的...

哈工大軟體構造實驗lab6

3.1 adt設計方案 設計了哪些adt 各自的作用 屬性 方法 給出每個adt的specification 可選 以類圖形式給出多個類之間的關係。梯子類 public class ladder public vectorgenerator int t,int k,int mv,int h 猴子產生...

(軟體構造)lab6遇到的問題以及相應的解決

程式設計前一定要先分析好問題 該選取什麼樣的資料結構,資料結構應該具有怎樣的型別 怎樣的許可權?不要上手就一頓操作猛如虎,一看傷害零點五。該實驗中,乙個猴子是乙個執行緒,而n架梯子是所有猴子共享的。所以梯子就定義為monkey類的靜態成員 private final static listladde...