2014-02-28 75 views
1

我必須用內核級線程編寫CPU調度模擬。我必須能夠使用先來先服務(FCFS)或循環(RR)算法。進程及其線程的數據以文本文件的形式給出。目前我的程序將文本文件數據讀入鏈表中。我真的不知道如何開始模擬(我以前從未編程模擬過)。理解CPU調度概念時遇到的問題

這是我如何在FCFS的情況下繼續?當我到達第一個進程的第一個線程時,我將cpu時間添加到時鐘時間。那麼我是否只需在CPU閒置時將io時間添加到時鐘?或者我應該把它放回等待隊列並允許下一個線程開始在cpu中運行?如果是這樣,我如何跟蹤每個線程已經被執行了多少?

這裏有一個例子測試文件:

2 4 6 // number_of_processes thread_switch process_switch 
1 5 // process_number(1) number_of_threads(1) 
1 0 4 // thread_number(1) arrival_time(1) number_of_CPU(1) 
1 15 100 // 1 cpu_time io_time 
2 18 120 // 2 cpu_time io_time 
3 12 100 // 3 cpu_time io_time 
4 16 // 4 cpu_time 
2 4 4 // thread_number(2) arrival_time(2) number_of_CPU(2) 
1 18 110 
2 15 80 
3 20 75 
4 15 
3 6 5 //thread(3) 
1 40 100 
2 20 70 
3 15 80 
4 18 90 
5 50 
4 8 4 //thread(4) 
1 25 60 
2 15 50 
3 20 80 
4 18 
5 18 4 //thread(5) 
1 8 60 
2 15 120 
3 12 80 
4 10 

回答

0

的I/O時間似乎曖昧根據提供的信息。你有沒有一個規範/指令去配合這個?

一般來說,我認爲I/O時間爲您提供了一個窗口,當前正在執行的線程可以在等待I/O請求完成時被換出。儘管似乎沒有任何跡象表明I/O時間是在CPU時間之前,之後還是混合在一起。這可能是您在實現模擬器時預計會做出的設計決策。

關於'number_of_CPU'選項有什麼影響,也存在不明確之處。你模擬了多少CPU核心?或者這僅僅是線程對CPU的請求數量的計數(它看起來就是這樣,因爲不能同時在多個CPU上運行單個線程)?

在任何情況下,您對處理FCFS算法的一般方法都是正確的。基本上你會想要維護一個請求隊列,並且只要CPU處於空閒狀態,你只需將下一個事情從隊列中拉出來並執行。假設單核CPU並忽略I/O時間,結果應該如下所示:

time=0 
    Thread 1 arrives, and wants to do 15 time-units of work 
     Thread 1 starts executing 15 time-units of work 

time=4 
    Thread 2 arrives, and wants to do 18 time-units of work 
     Thread 2 is blocked because Thread 1 is executing 

time=6 
    Thread 3 arrives, and wants to do 40 time-units of work 
     Thread 3 is blocked because Thread 1 is Executing 

time=8 
    Thread 4 arrives and wants to do 25 time-units of work 
     Thread 4 is blocked because Thread 1 is Executing 

time=15 
    Thread 1 completes its initial set of work 
    Thread 2 is next in the queue, and begins executing 
    Thread 1 wants to do 18 time-units of work 
     Thread 1 is blocked because Thread 2 is executing 

time=18 
    Thread 5 arrives and wants to do 8 time-units of work 
     Thread 5 is blocked because Thread 2 is executing 

time=33 
    Thread 2 completes its initial set of work 
    Thread 3 is next in the queue, and begins executing 
    Thread 2 wants to do 15 time-units of work 
     Thread 2 is blocked because Thread 3 is executing 

... 
+0

謝謝!我應該指定number_of_CPU是該線程的CPU突發數。假設我應該交換等待I/O的線程(而不是忽略io時間),那麼這將如何改變您發佈的輸出? –

+0

很難說,但如果I/O時間是前置加載的,比線程1會在時間= 0時立即阻塞/等待100個時間單元。線程2會在時間= 4時做類似的事情,等等。所以在那種情況下,第一個線程實際開始執行將是線程4(因爲它具有最少的I/O),在時間= 68。然後在時間= 93時,線程5將會去,因爲它的I/O也應該在那時完成。假設I/O請求可以並行/並行執行。否則,誰知道? – aroth