?? 1.cpp
字號:
#include<stdio.h>
#include <dos.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#include<iostream.h>
const int MAX=100; //定義最大進程數
struct PCB //定義進程結構體
{
char name[20];//進程名
int stime;//進程啟動時間
int ltime;//進程cpu時間
int IOstime;//I/O的開始時間
int IOltime;//I/O的持續時間
int right;//優先級
char state;//進程狀態
}pcbs[MAX];
int round=2;
int t=0;//計時器
int count=0;//記錄進程總數
int complete=0;//已完成的進程數
int time=0;//系統時間
int unstarthead=0;//未開始隊列的隊頭
int ready[MAX];//就緒隊列
int readynum=0;//就緒隊列中的進程個數
int wait[MAX];//等待隊列
int waitnum;//等待隊列中的進程個數
int run=-1;//沒有進程在運行
//讀數據函數
int readData()
{
FILE *fp;
char fname[20];
cout<<"請輸入進程流文件名:";
cin>>fname;
if((fp=fopen(fname,"r"))==NULL)
{cout<<"錯誤,文件打不開,請檢查文件名."<<endl;}
else
{while(!feof(fp))
{fscanf(fp,"%s %d,%d,%d,%d,%d",pcbs[count].name,&pcbs[count].stime,&pcbs[count].ltime,&pcbs[count].IOstime,&pcbs[count].IOltime,&pcbs[count].right);
count++;
}
cout<<endl<<"*******************************************************"<<endl;
cout<<"輸出所讀入的數據:"<<endl;
cout<<" name stime ltime IOstime IOltime right"<<endl;
for(int i=0;i<count;i++)
{cout<<" "<<pcbs[i].name<<" "<<pcbs[i].stime<<" "<<pcbs[i].ltime<<" "<<pcbs[i].IOstime<<" "<<pcbs[i].IOltime<<" "<<pcbs[i].right<<endl;}
return(1);
}
return(0);
}
//初始化函數,讓進程按開始時間先后排列
void init()
{
int i,j;
for(i=0;i<count;i++)
{
for(j=0;j<count-i-1;j++)
{
if(pcbs[j].stime>pcbs[j+1].stime)
{
pcbs[-1]=pcbs[j];
pcbs[j]=pcbs[j+1];
pcbs[j+1]=pcbs[-1];
}
}
}
}
//將進程投入就緒態
void inready(int i)
{
ready[readynum]=i;
readynum++;
}
//檢查未開始隊列中是否有進程可進入就緒態
void checkstart()
{
while(unstarthead<count&&pcbs[unstarthead].stime==time)//未開始隊列不空且進程的開始時間與系統時間一致
{
inready(unstarthead);//將進程調入就緒態
unstarthead++;//隊頭后移
}
}
//檢查等待隊列中是否有進程可進入就緒態
void checkwait()
{
for(int i=0;i<waitnum;i++)
{
if(--pcbs[wait[i]].IOltime==0)//隊列中I/O等待時間為零時
{
inready(wait[i]);//該進程調入就緒隊列
waitnum--;
for(int j=i;j<waitnum;j++)
{
wait[j]=wait[j+1];
}
i--;
}
}
}
//從就緒隊列中調出進程
void outready()
{
if(readynum>0)//如果就緒隊列不空,將第一個進程投入運行
{
run=ready[0];
readynum--;
for(int i=0;i<readynum;i++)
{
ready[i]=ready[i+1];//隊列向前移一個單位
}
}
else if(readynum<=0)
run=-1;
}
//FIFO進程調度算法
void checkrun1()//檢查運行中的進程是否發生狀態轉換
{
if(run==-1)//沒有進程正在運行,則從就緒隊列中調入
{
outready();
}
else//有進程運行中
{
if(--pcbs[run].ltime==0)//進程運行完調入完成隊列
{
complete++;
run=-1;//沒有進程運行
outready();//從就緒隊列調入
}
else if(--pcbs[run].IOstime==0)//I/O時間到調入等待隊列
{
wait[waitnum]=run;
waitnum++;
outready();//沒有進程正在運行,則從就緒隊列中調入
}
}
}
//優先級算法
void init2()//初始化就緒隊列并按優先級從高到低排列
{ if(readynum>0)
{int k,j,temp;
for(k=0;k<readynum;k++)
{
for(j=0;j<readynum-k-1;j++)
{
if(pcbs[ready[j]].right<pcbs[ready[j+1]].right)
{
temp=ready[j];
ready[j]=ready[j+1];
ready[j+1]=temp;
}
}
}
}
}
void checkrun2()//檢查運行中的進程是否發生狀態轉換
{
if(run==-1)//沒有進程正在運行,則從就緒隊列中調入
{
outready();
}
else//有進程運行中
{
if(--pcbs[run].ltime==0)//進程運行完調入完成隊列
{
complete++;
run=-1;//沒有進程運行
outready();//從就緒隊列調入
}
else if(--pcbs[run].IOstime==0)//I/O時間到調入等待隊列
{ pcbs[run].right--;
wait[waitnum]=run;
waitnum++;
outready();//沒有進程正在運行,則從就緒隊列中調入
}
else if(readynum!=0)
{if(--pcbs[run].right<pcbs[ready[0]].right)//如果當前進程的優先級比就緒隊首的低
{
inready(run);//將運行的進程調入就緒隊列
run=-1;//沒有進程運行
outready();//從就緒隊列調入
}
}
}
}
//時間片輪轉算
void checkrun3() //檢查運行中的進程是否發生狀態轉換
{if(run==-1)//沒有進程正在運行,則從就緒隊列中調入
{
outready();
}
else
{
if(--pcbs[run].ltime==0)//進程運行完調入完成隊列
{ t=0;
complete++;
run=-1;//沒有進程運行
outready();//從就緒隊列調入
}
if(--pcbs[run].IOstime==0)//I/O時間到調入等待隊列
{ t=0;
wait[waitnum]=run;
waitnum++;
outready();//沒有進程正在運行,則從就緒隊列中調入
}
else if(++t==round)
{ t=0;
inready(run);
outready();
}
}
}
//顯示提示函數
void version1()
{
cout<<" 進 程 調 度 課 程 設 計"<<endl;
cout<<" ++++++++++++++++++++++++++++++"<<endl;
cout<<" (FIFO,優先數,時間片輪轉)"<<endl;
cout<<" ------------------------"<<endl;
}
//顯示輸出結果
void version2()
{
printf("\n*********** time: %d ************\n",time);
if(run!=-1)
printf("On running: %s",pcbs[run].name);
printf("\nOn ready: ");
for(int i=0;i<readynum;i++)
{
printf("%s ",pcbs[ready[i]].name);
}
printf("\nOn waiting: ");
for(int j=0;j<waitnum;j++)
{
printf("%s ",pcbs[wait[j]].name);
}
}
//顯示版權信息函數
void version3()
{
cout<<endl<<endl;
cout<<" * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
cout<<" * 辛苦工作人員名單 *"<<endl;
cout<<" * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
cout<<" * *"<<endl;
cout<<" * *"<<endl;
cout<<" * *"<<endl;
cout<<" * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
cout<<endl<<endl;
}
void FIFO()//先級先出調度算法
{
init();//初始化,按開始時間排序
while(complete!=count)
{
checkstart();//檢查是否有進程要開始
checkwait();//檢查等待隊列中的進程是否進入就緒隊列
checkrun1();//檢查運行中的進程是否發生狀態轉換
version2();
time++;
}
version3();
}
void privilege()//優先級調度算法
{ init();//初始化,按開始時間排序
while(complete!=count)
{
checkstart();//檢查是否有進程要開始
checkwait();//檢查等待隊列中的進程是否進入就緒隊列
init2();//初始化就緒隊列,按優先級高低排列
checkrun2();//檢查運行中的進程是否發生狀態轉換
version2();
time++;
}
version3();
}
void roundrun()//時間片輪轉調度算法
{
init();//初始化,按時間開始先后排序
while(complete!=count)
{
checkstart();//檢查是否有進程要開始
checkwait();//檢查等待隊列中的進程是否進入就緒隊列
checkrun3();//檢查運行中的進程是否發生狀態轉換
version2();
time++;
}
version3();
}
void main()//主函數
{
int flag;
version1();
init();
flag=readData();
cout<<""<<endl;
cout<<"(F-FIFO算法,P-優先數算法,R-時間片輪轉),請選擇(F/P/R):"<<endl;
if(flag==1)
{
char c;
scanf("%c",&c);
switch(c)
{ case 'F':FIFO();break;
case 'P':privilege();break;
case 'R':roundrun();break;
default:printf("error");
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -