2011-03-29 99 views
1

我被要求編寫一個代碼來計算Cpu算法的平均等待時間和平均轉換時間。 FIFO,SJF,RR和基於優先級的調度。我應該從一個看起來像這樣的文本文件中讀取......除了它在2100年左右的流程中有很長的歷史。先進先出C++算法

Process Arrival Burst Priority 
p1  31  9  41 
p2  35  21  36 
p3  6  55  61 
p4  42  50  13 
p5  36  85  58 

香港專業教育學院設法從文件到一個二維數組讀..但我不知道應該如何IM使用數組做這些計算..我不是徹底與整個指針的東西。所以..有沒有辦法做這些計算而不使用指針?這是迄今爲止編寫的代碼IVE ..

int main() 
{ 
    string text[15][4]; 
    string f_comp[15][4]; 

    ifstream stream1("D:\\College\\OS\\OSassignment_sol\\idiot.txt"); 
    if(!stream1) 
    { 
     cout<<"Cannot read file\n"; 
     exit(1); 
    } 

    while(!stream1.eof())    
    { 
     for(int i=0; i<15; i++) 
     { 
      for(int j=0; j<4; j++) 
      { 
       stream1>>text[i][j];  
      } 

     } 

    } 


    //Checking if the stream has been assigned into the array correctly. 
    for(int i=0; i<15; i++) 
    { 
     for(int j=0; j<4; j++) 
     { 
      cout<<text[i][j]<<"\t"; 

     } 
     cout<<endl; 
    } 

    int z; 
    cin>>z; 
} 
+0

是。不要求代碼。只需引導線:p coz im卡住了。 – Tsar 2011-03-29 05:51:10

+2

你應該在你的空閒時間真的做更多的編程。如果這個簡單的編程任務妨礙了您的操作系統課程,那麼您每次新課程都會陷入困境。關於你的問題的話題也許,但對你的未來很有意義...... – 2011-03-29 09:00:12

回答

0

您可能會需要執行這些調度算法各一個,寫某種模擬器。

而不是使用數組,因爲我總是發現很難記住什麼地方,考慮使用一個結構。

struct Process { 
    std::string name; 
    int arrival; 
    int burst; 
    int priority; 
}; 

然後你可以選擇不管什麼調度算法您使用的是合適的數據結構。模擬器或許應該做這樣的事情......

  1. 地點應該在這個時候,如果有什麼需要發生開始到可運行隊列
  2. 附表(由於定時器中斷或當前任何進程過程等待)
  3. 遞減當前運行的進程突發時間(因爲它運行額外打勾)
  4. 添加一個到當前的時間
  5. 重複直到完成

如果你可以用你想要的任何語言來做到這一點,使用腳本語言可能會更容易,因爲這可能不是性能關鍵(真正的調度程序)。

我建議你不要使用數組,雖然他們可能會變得非常混亂。即使這是C,我仍然會建議使用一個結構來代替數組。

特別是,FIFO是一個非常容易的。您只需將活動進程保留在列表/向量結構中並保持運行,直到突發爲0。然後,彈出容器的前端並執行相同的操作,直到用完進程。

爲了保持等待時間,您可以統計當前在等待隊列中當前有多少進程每次打勾並將其平均在一起。對於週轉時間,您可以保留添加過程的時間點和完成時的時間,計算過程完成需要多長時間。然後把這個時間加到你保持的平均水平上。

+1

好的,很高興我在打字之前檢查了新的答案,因爲我只是想說同樣的話。我將添加這麼多:爲文件中的每一行分配一個新的進程結構,並將它們全部放入一個std :: list集合中。然後根據到達時間對列表進行排序。從這裏你可以將事件提供給你的模擬調度算法。 – Vagrant 2011-03-29 05:50:28

0

如果您創建一個結構來表示的過程你會發現這更容易:

struct Process 
{ 
    std::string name_; 
    int arrival_, burst_, priority_; 
}; 

然後,您應該創建一個std::vector<Process> processespush_back()從您的輸入添加新值:

Process process; 
while (std::cin >> process.name_ >> process.arrival_ >> process.burst_ >> process.priority_) 
    processes.push_back(process); 

然後您需要使用這些數字來模擬每個調度策略,在到達時間和完成時間之間收集有關時間單位(arrival_和burst_看似以任意時間單位)的統計信息:也就是,當burs這一過程已經完成了單位的工作。

例如,對於FIFO,您可以按到達時間對過程向量進行有效排序,然後按照上升到達時間的順序對它們進行迭代。具有最低到達_的過程開始而不等待,並在burst_之後完成。因此,下一個工作的開始時間不能在第一個工作的完成時間之前:arrival_ + burst_:如果第二個工作提前到達,那麼你的結果等待時間將累積,否則第二個工作不必等待。不斷重複所有工作。

其他一些算法會更復雜:例如,對於SJF,您需要跟蹤每次調度模擬完成前一個作業時哪些作業正在等待,因爲它會從該組中選擇最短的burst_值的工作成爲下一個執行的過程。