計算機作業系統-多道程式設計的實現
阿新 • • 發佈:2021-11-17
設計例項
設在記憶體中有三道程式A、B和C,並按A、B、C的優先次序執行,其內部計算和I/O操作的時間如下所示:
A: [計算 30ms] -- [I/O 40ms] -- [計算 10ms]
B: [計算 60ms] -- [I/O 30ms] -- [計算 10ms]
B: [計算 20ms] -- [I/O 40ms] -- [計算 20ms]
程式環境
程式將在單CPU,雙通道的情況下執行,為搶佔式
程式碼設計
程式碼思路及重點分為以下幾點
- 使用佇列模擬CPU與兩個通道
- 自定義結構體儲存程式資訊
- 設定總時間變數和當前程式變數
- 計算函式runPro,處理當前程式(計算和轉通道)
- IO函式runIO,處理當前程式(IO和轉CPU)
- 列印資訊函式printStatus,以重新整理螢幕列印資訊的方式實現資訊動態顯示
- 主函式處理當前程式變數和CPU所需要執行的程式
詳細程式碼
#include <iostream> #include <cstdio> #include <queue> #include <Windows.h> using namespace std; struct program { int countOne,IO,countTwo; int level; }; program pro[100]={{30,40,10,0},{60,30,10,1},{20,40,20,2},{0,0,0,100}}; queue<program> CPU; queue<program> PassageOne; queue<program> PassageTwo; program temp; int nowTime,nowPro=0; void runPro() { if(CPU.front().level==100) return; if(!PassageOne.empty()) { if(PassageOne.front().level==CPU.front().level) { CPU.pop(); return; } } if(!PassageTwo.empty()) { if(PassageTwo.front().level==CPU.front().level) { CPU.pop(); return; } } if(CPU.front().countOne>0) { CPU.front().countOne--; if(CPU.front().countOne==0) { temp=CPU.front(); CPU.pop(); pro[temp.level]=temp; if(PassageOne.empty()) PassageOne.push(temp); else if(PassageTwo.empty()) PassageTwo.push(temp); } } else { if(CPU.front().countTwo>0) { CPU.front().countTwo--; if(CPU.front().countTwo==0) { temp=CPU.front(); CPU.pop(); pro[temp.level]=temp; } } } } void runIO() { if(!PassageOne.empty()) { PassageOne.front().IO--; if(PassageOne.front().IO==0) { temp=PassageOne.front(); PassageOne.pop(); pro[temp.level]=temp; if(temp.level<CPU.front().level) { CPU.push(temp); temp=CPU.front(); pro[temp.level]=temp; CPU.pop(); } if(CPU.empty()) { CPU.push(temp); } } } if(!PassageTwo.empty()) { PassageTwo.front().IO--; if(PassageTwo.front().IO==0) { temp=PassageTwo.front(); PassageTwo.pop(); pro[temp.level]=temp; if(temp.level<CPU.front().level) { CPU.push(temp); temp=CPU.front(); pro[temp.level]=temp; CPU.pop(); } if(CPU.empty()) { CPU.push(temp); } } } } void printStatus() { Sleep(500); system("cls"); if(!CPU.empty() && CPU.front().level!=100) { if(CPU.front().level!=100) { printf("\t\t\t\t\t\t-CPU 正在執行 程式%c-\n", 'A'+CPU.front().level); printf("\t\t\t\t\t\t------%2d %2d %2d------\n\n", CPU.front().countOne, CPU.front().IO, CPU.front().countTwo); } } else { printf("\t\t\t\t\t\t-CPU 處於空閒-\n"); printf("\t\t\t\t\t\t--------------------\n\n"); } if(!PassageOne.empty()) { printf("\t\t\t\t\t\t程式%c 正在使用通道1\n", 'A'+PassageOne.front().level); printf("\t\t\t\t\t\t------%2d %2d %2d------\n\n", PassageOne.front().countOne, PassageOne.front().IO, PassageOne.front().countTwo); } else { printf("\t\t\t\t\t\t通道1 正處在空閒狀態\n"); printf("\t\t\t\t\t\t--------------------\n\n"); } if(!PassageTwo.empty()) { printf("\t\t\t\t\t\t程式%c 正在使用通道2\n", 'A'+PassageTwo.front().level); printf("\t\t\t\t\t\t------%2d %2d %2d------\n\n", PassageTwo.front().countOne, PassageTwo.front().IO, PassageTwo.front().countTwo); } else { printf("\t\t\t\t\t\t通道2 正處在空閒狀態\n"); printf("\t\t\t\t\t\t--------------------\n\n"); } } int main() { // freopen("data.out","w",stdout); CPU.push(pro[0]); while(true) { nowTime++; runPro(); runIO(); printStatus(); while(CPU.empty()) { if(pro[nowPro].countOne!=0) CPU.push(pro[nowPro]); else if(pro[nowPro].countOne==0 && pro[nowPro].IO!=0) CPU.push(pro[nowPro+1]); else if(pro[nowPro].countOne==0 && pro[nowPro].countTwo==0) nowPro++; if(nowPro>2) break; } if(pro[2].countTwo==0) break; } cout<<"三道程式執行結束需要 "<<nowTime+1<<" MS"<<endl; return 0; }