當前位置:編程學習大全網 - 編程語言 - 求進程調度先來先服務算法,短進程優先算法完整c語言代碼

求進程調度先來先服務算法,短進程優先算法完整c語言代碼

/*(壹)進程調度

進程調度算法有FIFO,優先數調度算法,時間片輪轉調度算法,分級調度算法,

輸入:進程流文件,其中存儲的是壹系列要執行的進程,

每個作業包括三個數據項:

進程名 所需時間 優先數(0級最高)

輸出:

進程執行流 等待時間 平均等待時間

本程序包括:FIFO,優先數調度算法,時間片輪轉調度算法

進程流文件process_stream.txt

測試數據:

p0 16 2

p1 5 1

p2 4 3

p3 8 0

p4 9 4

p5 7 6

VC++調試通過

*/

#include <stdio.h>

#include <string.h>

#include <iostream.h>

#include <stdlib.h>

const int Quatum=2;//定義時間片的長度為2秒

const int MAXPCB=100;//定義最大進程數

//定義進程結構體

typedef struct node

{

char name[20];//進程名

int time; //進程運行時間

int privilege;//進程優先級(靜態)

int finished;//進程完成標誌,0-未完成,1-已完成

int wait_time;//進程等待時間

}pcb;

pcb pcbs[MAXPCB];

int quantiry;//進程流文件中的進程總數

void initial()

{

int i;

for (i=0;i<MAXPCB;i++)

{

strcpy(pcbs[i].name,"");

pcbs[i].time=0;

pcbs[i].privilege=0;

pcbs[i].finished=0;

pcbs[i].wait_time=0;

}

quantiry=0;

}

int readData()

{

FILE *fp;

char fname[20];

int i;

cout<<"請輸入進程流文件名:"<<endl;

cin>>fname;

if ((fp=fopen(fname,"r"))==NULL)

{

cout<<"錯誤,文件打不開,請檢查文件名"<<endl;

}

else

{

while (!feof(fp))

{

fscanf(fp,"%s %d %d %d",pcbs[quantiry].name,

&pcbs[quantiry].time,&pcbs[quantiry].privilege);

quantiry++;

}

//輸出所讀入得數據

cout<<"輸出所讀入的數據"<<endl;

cout<<"進程流文件中的進程總數="<<quantiry<<endl;

cout<<"進程名 所需時間 優先數"<<endl;

for (i=0;i<quantiry;i++)

{

cout<<" "<<pcbs[i].name<<" "<<pcbs[i].time<<" "<<pcbs[i].privilege<<endl;

}

return 1;

}

return 0;

}

//重置數據,以供另壹個算法使用

void init()

{

int i;

for (i=0;i<MAXPCB;i++)

{

pcbs[i].finished=0;

pcbs[i].wait_time=0;

}

}

void FIFO()

{

int i,j;

int total;

//輸出FIFO算法執行流

cout<<endl<<"---------------------------------------------------------------"<<endl;

cout<<"FIFO算法執行流:"<<endl;

cout<<"進程名 等待時間"<<endl;

for (i=0;i<quantiry;i++)

{

cout<<" "<<pcbs[i].name<<" "<<pcbs[i].wait_time<<endl;

for (j=i+1;j<quantiry;j++)

{

pcbs[j].wait_time+=pcbs[i].time;

}

}

total=0;

for (i=0;i<quantiry;i++)

{

total+=pcbs[i].wait_time;

}

cout<<"總等待時間:"<<total<<" "<<"平均等待時間:"<<total/quantiry<<endl;

}

//優先度調度算法

void privilege()

{

int i,j,p;

int passed_time=0;

int total;

int queue[MAXPCB];

int current_privielege=1000;

for (i=0;i<quantiry;i++)

{

current_privielege=1000;

for (j=0;j<quantiry;j++)

{

if ((pcbs[j].finished==0)&&(pcbs[j].privilege<current_privielege))

{

p=j;

current_privielege=pcbs[j].privilege;

}

}

queue[i]=p;

pcbs[p].finished=1;

pcbs[p].wait_time+=passed_time;

passed_time+=pcbs[p].time;

}

//輸出優先數調度執行流

cout<<endl<<"-----------------------------------------"<<endl;

cout<<"優先數調度執行流:"<<endl;

cout<<"進程名 等待時間"<<endl;

for (i=0;i<quantiry;i++)

{

cout<<" "<<pcbs[queue[i]].name<<" "<<pcbs[queue[i]].wait_time<<"--"<<queue[i]<<endl;

}

total=0;

for (i=0;i<quantiry;i++)

{

total+=pcbs[i].wait_time;

}

cout<<"總等待時間:"<<total<<" 平均等待時間:"<<total/quantiry<<endl;

}

//時間片輪轉調度算法

void timer()

{

int i,j,sum,flag=1;

int passed_time=0;

int max_time=0;

int round=0;

int queue[1000];

int total=0;

while(flag==1)

{

flag=0;

for (i=0;i<quantiry;i++)

{

if (pcbs[i].finished==0)

{

flag=1;

queue[total]=i;

total++;

if (pcbs[i].time<=Quatum*(round+1))

pcbs[i].finished=1;

}

}

round++;

}

cout<<endl<<"---------------------------------------------------------------"<<endl;

cout<<"時間片輪轉調度執行流:";

for(i=0;i<total;i++)

{

cout<<pcbs[queue[i]].name<<" ";

}

cout<<endl;

cout<<"進程名 結束時間 運行時間 等待時間"<<endl;

sum=0;

for (i=0;i<quantiry;i++)

{

for(j=total-1;j>=0;j--)//從輪轉調度執行流序列由後往前比較,找到同名進程即可計算其完成時間

{

if (strcmp(pcbs[queue[j]].name,pcbs[i].name)==0)

{

cout<<" "<<pcbs[i].name<<" "<<(j+1)*Quatum<<" ";

cout<<pcbs[i].time<<" "<<(j+1)*Quatum-pcbs[i].time<<endl;

sum+=(j+1)*Quatum-pcbs[i].time;

break;

}

}

}

cout<<"總等待時間:"<<sum<<" "<<"平均等待時間:"<<sum/quantiry<<endl;

}

//顯示版權信息函數

void version()

{

cout<<endl<<endl;

cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;

cout<<" ┃       進程調度模擬系統       ┃"<<endl;

cout<<" ┠───────────────────────┨"<<endl;

cout<<" ┃     version 2011 ┃"<<endl;

cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;

cout<<endl<<endl;

}

//主函數

int main()

{

int flag;

version();

initial();

flag=readData();

if(flag==1){

FIFO();

init();

privilege();

init();

timer();

}

cout<<endl;

system("pause");

return 0;

}

  • 上一篇:對沒有煙花爆竹流向條碼的處罰
  • 下一篇:大壹明天就要c語言考試了,可是什麽都不會,我怎麽預習才能效率最高!
  • copyright 2024編程學習大全網