?? sched.cpp
字號(hào):
#include <stdio.h>
#include <stdlib.h>
#define MaxProc 10//最大進(jìn)程數(shù)
#define INF 1000//無(wú)窮大
int COUNT;//實(shí)際里程數(shù)
struct _PCB
{//進(jìn)程控制塊
int ID;//進(jìn)程ID
int Time_server;//進(jìn)程的服務(wù)時(shí)間
int Time_arrive;//進(jìn)程的到達(dá)時(shí)間
int Time_start;//進(jìn)程的開始時(shí)間
int Time_over;//進(jìn)程的結(jié)速時(shí)間
};
typedef struct _PCB PCB;
void ReadProcess(PCB * head);
int SPF_sched(PCB * head);//最短進(jìn)程優(yōu)先調(diào)度
int RR_sched(PCB * head);//輪轉(zhuǎn)調(diào)度
int main()
{
int choose;
int i =0;
PCB process[MaxProc];//進(jìn)程運(yùn)行隊(duì)列
back:
ReadProcess( process );
//顯示選擇信息
printf("\t1. Shortest Process First(SPF)\n"
"\t2. Round Robin(RR)\n"
"\t3. Concel\n"
"\tPlease input your choose: ");
scanf("%d", &choose);
while(1)
{//根據(jù)選擇進(jìn)行相應(yīng)處理
switch(choose)
{
case 1:
printf("The shortest process first algorithm:\n");
SPF_sched( process );
goto back;
case 2:
printf("The round robin algorithm:\n");
RR_sched( process );
goto back;
case 3:
goto over;
default:
printf(" No that choice!!!\n");
goto over;
}
}
over:
printf("Over!\n");
return 0;
}
void ReadProcess( PCB * head )
{//從process.txt文件中讀取進(jìn)程數(shù)和進(jìn)程信息
int i =0;
FILE * fp;
if( !(fp = fopen("process.txt","r")))
{
printf("Read process fail!!!\n");
return ;
}
fscanf(fp,"%d",&COUNT);//讀取進(jìn)程數(shù)
for( ; i < COUNT; i++ )
{//從文件中讀取進(jìn)程
fscanf(fp,"%d %d %d", &head[i].ID, &head[i].Time_server, &head[i].Time_arrive);
head[i].Time_start = head[i].Time_arrive;//設(shè)置里程的運(yùn)行時(shí)間為到達(dá)時(shí)間
head[i].Time_over = 0;
}
}
int SPF_sched(PCB * head)
{//對(duì)不是同時(shí)到達(dá)的進(jìn)程也適用
PCB * ExecProc = head;
int i,j;
int startTime = 0;//記錄下一進(jìn)程的開始運(yùn)行時(shí)間
int overTime[MaxProc];//記錄運(yùn)行完成進(jìn)程的結(jié)束時(shí)間
for( i = 0; i < COUNT; i++)
{
for(j = 0; j < COUNT; j++ )
{//尋找最早最短的進(jìn)程
if( head[j].Time_server < ExecProc -> Time_server && head[j].Time_start <= ExecProc -> Time_start)
ExecProc = &head[j];
}
ExecProc -> Time_over = ExecProc -> Time_start + ExecProc -> Time_server;
ExecProc -> Time_server = INF;//結(jié)速進(jìn)程的服務(wù)時(shí)間和開始時(shí)間設(shè)為無(wú)窮大
ExecProc -> Time_start = INF;
startTime = ExecProc -> Time_over;
overTime[i] = startTime;
printf("%d\t", ExecProc -> ID);
for( j = 0; j < COUNT; j++)
{//設(shè)置在運(yùn)行過(guò)程中到達(dá)的進(jìn)程的開始運(yùn)行時(shí)間
if( head[j].Time_start < startTime )
head[j].Time_start = startTime;
}
}
printf("\n");
for( i = 0; i < COUNT; i++)
printf("%d\t", overTime[i]);
printf("\n");
return 1;
}
int RR_sched(PCB * head)
{//對(duì)不同時(shí)到達(dá)的進(jìn)程也適用
int timeSlice = 1;//時(shí)間片
int startTime = 0;//進(jìn)程開始運(yùn)行時(shí)間
int i = 0, flag = 0;
while( 1 )
{
if( i == COUNT ) i = 0;
if( head[i].Time_start <= startTime && head[i].Time_over < head[i].Time_server )
{
head[i].Time_start = startTime;
head[i].Time_over += timeSlice;
startTime += timeSlice;
printf("%d ", head[i].ID);//輸出運(yùn)行進(jìn)程的ID
if( head[i].Time_over == head[i].Time_server )
{
head[i].Time_over = startTime;//記錄完成進(jìn)程的結(jié)束時(shí)間
flag++;//記錄運(yùn)行完進(jìn)程數(shù)
}
}
i++;
if( flag == COUNT )
break;//進(jìn)程全部運(yùn)行完畢,退出循環(huán)
}
printf("\nthe process finished time:\n");
for( i = 0; i < COUNT; i++)//輸出進(jìn)程的ID
printf("%d\t", head[i].ID);
printf("\n");
for( i = 0; i < COUNT; i++)//輸出進(jìn)程的結(jié)束時(shí)間
printf("%d\t", head[i].Time_over);
printf("\n");
return 1;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -