C 執行緒排程演算法題

2021-07-11 21:48:12 字數 3044 閱讀 5566

前幾天做的一道執行緒排程的題目,題目本身的思路很簡單,主要是檢測資料裡面有超時的檢測資料。下面先貼一下題目要求:

程序排程是作業系統設計中非常重要的問題。每個程序都需要一定的資源才能執行,這些資源在程序結束時都會被釋放。不同的資源分配策略會對系統的執行效率產生很大的影響,甚至可能導致死鎖。

某系統中現有n個程序和m種資源。每個程序開始時得到部分資源,但不足以使得程序順利執行,還需要得到其它資源才能執行。現已知該系統中各類可用資源的總量,給定的若干程序及其資源分配和需求情況,請指出這些程序是否能夠順利執行?

輸入資料有若干組,每組包括四部分:

第一部分為一行,含兩個正整數 n(n<=50000) 和 m(m<=100) ,分別表示程序數量和資源的種類。 

第二部分為隨後的 m 行。每行含有 n 個整數,為各個程序得到的資源數。 

第三部分也是 m 行,緊隨第二部分之後。每行包含 n 個整數,代表程序還需要的資源數。 

第四部分為一行,緊隨第三部分之後。該行包含 m 個整數,為系統中當前各類可用資源的數量。 

所有的整數值小於或等於 10^9 。

輸出中只包含只"yes"或"no"。 

如果所有程序均能順利完成,輸出"yes", 否則輸出"no"。

4 31 6 2 0 

0 1 1 0

0 2 1 2 

2 0 1 4 

2 0 0 2 

2 1 3 0 

0 1 1 

4 3 

2 5 2 0 

0 1 1 0 

1 1 1 2 

1 1 1 4 

2 0 0 2 

1 2 3 0 

0 1 1

yesno

測試輸入

期待的輸出

時間限制

記憶體限制

額外程序

測試用例 1

以文字方式顯示

4 3↵

1 6 2 0 ↵

0 1 1 0↵

0 2 1 2 ↵

2 0 1 4 ↵

2 0 0 2 ↵

2 1 3 0 ↵

0 1 1 ↵

4 3 ↵

2 5 2 0 ↵

0 1 1 0 ↵

1 1 1 2 ↵

1 1 1 4 ↵

2 0 0 2 ↵

1 2 3 0 ↵

0 1 1 ↵

以文字方式顯示

yes↵

no↵

1秒 64m 0

我先說一下思路,其實很簡單,就是最開始初始化乙個執行緒池,然後把資料都存進去。這裡我用的是stl的vector容器。後面就遍歷掃,掃到可以滿足的執行緒就釋放,主要用了三個手段來減少時間。

1.移除出線程池不使用vector的earse操作,因為earse的效率很低,會很影響時間。改為使用乙個標記值來標記是否已被釋放。

2.每輪掃瞄到可以釋放的執行緒不結束迴圈,繼續掃到結尾。因為每次開始一輪新的迴圈都有一定開支。

3.增加乙個int值記錄最後一次釋放執行緒的位置。如果再次掃到釋放位置都沒有可以釋放的執行緒(這裡是使用了乙個flag來記錄有沒有發生改變),就不再進行後續的掃瞄直接退出返回「no」。

但是後來我又想了一下,其實還可以優化,比如迴圈可以改為開始位置隨機產生,迴圈結束條件不再是到達vector的尾部,而是掃瞄次數達到vector的大小。這樣理論上也能減少時間。有興趣的可以改寫一下,話不多說,下面給出**:

#include #include #define random(x) (rand()%x)

using namespace std;

class mythread

int* ownership;

int* demand;

bool overed;

};int main()

for (int sourceindex = 0; sourceindex < source_type; sourceindex++)

} for (int sourceindex = 0; sourceindex < source_type; sourceindex++)

} if (source_type < 0 && thread_num < 0)

break;

int* sources = new int[source_type];

for (int index = 0; index < source_type; ++index)

cin >> sources[index];

int last_index = threads.size();

while (thread_num > 0)

if (!changed && iter - threads.begin() > last_index)

int sourceindex;

for (sourceindex = 0; sourceindex < source_type; sourceindex++)

}if (sourceindex == source_type)

iter->overed = true;

last_index = iter - threads.begin();

thread_num--;

changed = true;}}

if (!changed)

} if (thread_num == 0)

} return 0;

}

演算法實驗題3 2 排程問題

演算法實驗題3.2 排程問題 問題描述 作業排程在電腦科學中是乙個經典問題並且已經研究了很長一段時間。不同的排程 問題往往滿足不同的約束條件和排程需求而顯得千差萬別。這裡我們考慮二機排程問題。實驗室裡有兩台機器a 和b。機器a 有n 種工作模式,分別為mode 0,mode 1,mode n 1,同...

電梯排程演算法 C

1.演算法解析 掃瞄演算法 scan 又稱電梯排程演算法,scan演算法是磁頭前進方向上的最短查詢時間優先演算法,它排除了磁頭在盤面區域性位置上的往復移動,scan演算法在很大程度上消除了sstf演算法的不公平性,但仍有利於對中間磁軌的請求。電梯排程演算法是從移動臂當前位置開始沿著臂的移動方向去選擇...

執行緒排程 執行緒池

1.每次new thread新建物件,效能查。2.執行緒缺乏統一管理,可能無限制的新建執行緒,相互競爭,有可能占用過多系統資源導致司機或oom out of memory 3.缺少更多的功能,如更多執行 定期執行 執行緒中斷。1.重用存在的執行緒,減少物件建立 消亡的開銷,效能好。2.可有效控制最大...