操作系统 FCFS先到先服务调度算法
//cpp文件
#include "stdafx.h"
void FCFS();//先到先服务调度算法
void SJF();//短进程优先算法
void printProc();//输出进程的计算结果
struct process_type //进程结构
{
int pid;
int ArrivalTime;//到达时间
int ServiceTime;//服务时间
int StartTime;//开始时间
int FinishTime;//完成时间
int RoundTime;//周转时间
double WeightRoundTime;//带权周转时间
};
struct process_type proc[20];//申请20个进程控制块,内存中进程数最大值为20
int PNum, NowTime;//PNum表示进程数,NowTime表示当前的时刻
int SumRT = 0; //总周转时间
double SumWRT = 0; //总带权周转时间
int AverageRT = 0; //平均周转时间
double AverageWRT = 0;//平均带权周转时间
void main()
{
int i, n;
char a;
n = 1;
cout << "请输入进程个数:";
cin >> PNum;
for (i = 0;i<PNum;i++)
{
cout << "请输入第" << i + 1 << "个进程的pid,到达时间和服务时间:" << endl;
cin >> proc[i].pid;
cin >> proc[i].ArrivalTime;
cin >> proc[i].ServiceTime;
}
while (n == 1)
{
cout << "\n********************************************";
cout << "\n* CPU调度演示系统 *";
cout << "\n********************************************";
cout << "\n 1.FCFS 2.SJF 3.退出";
cout << "\n********************************************";
cout << "\n请选择(~)";
cin >> a;
// a=getchar();
switch (a)
{
case'1':
FCFS();
printProc();
break;
case'2':
SJF();
printProc();
break;
case'3':
exit(0);
default:
n = 0;
}
}
}
void printProc()//输出进程的计算结果
{
cout << endl << "进程pid\t到达时间\t服务时间\t周转时间\t带权周转时间\n";//逐个输出每一个进程的相关数据
for (int i = 0;i<PNum;i++)
{
cout << endl << proc[i].pid << "\t" << proc[i].ArrivalTime << "\t\t" << proc[i].ServiceTime << "\t\t" << proc[i].RoundTime << "\t\t" << proc[i].WeightRoundTime;
SumRT += proc[i].RoundTime;
SumWRT += proc[i].WeightRoundTime;
}
/*计算平均周转时间*/
AverageRT = SumRT / PNum;
/*计算平均带权周转时间*/
AverageWRT = SumWRT / PNum;
cout << "\n平均周转时间:" << AverageRT << "\t" << "\t平均带权周转时间:" << AverageWRT << endl;//输出平均周转时间和平均带权周转时间
}
void FCFS()
{
int i, j;
for (i = 0;i<PNum;i++)//按进程到达时间的先后排序
{
for (j = 0;j<PNum - i - 1;j++)
{
if (proc[j].ArrivalTime>proc[j + 1].ArrivalTime)
{
/* 填写代码 */
int a = proc[j + 1].ArrivalTime;
int b = proc[j + 1].RoundTime;
int c = proc[j + 1].pid;
proc[j + 1].ArrivalTime = proc[j].ArrivalTime;
proc[j + 1].RoundTime = proc[j].RoundTime;
proc[j + 1].pid = proc[j].pid;
proc[j].ArrivalTime = a;
proc[j].RoundTime = b;
proc[j].pid = c;
}
}
}
for (i = 0;i<PNum;i++)
{
if (i == 0)
{
/*计算开始时间*/
proc[i].StartTime = 0;
/*计算结束时间*/
proc[i].FinishTime = proc[i].StartTime + proc[i].ServiceTime;
}
else
{
if (proc[i].ArrivalTime<proc[i - 1].FinishTime)
{
/*计算结束时间*/
proc[i].StartTime = proc[i - 1].FinishTime;//开始时间等于上一个进程的结束时间
proc[i].FinishTime = proc[i].StartTime + proc[i].ServiceTime;//结束时间等于开始时间加上服务时间
}
else
{
/*计算结束时间*/
proc[i].StartTime = proc[i].ArrivalTime;//如果在前一个进程结束之后到达,则开始时间等于到到达时间
proc[i].FinishTime = proc[i].StartTime + proc[i].ServiceTime;//结束时间等于开始时间加上服务时间
}
}
printf("进程%d从%d开始,在%d时刻结束\n", proc[i].pid, proc[i].StartTime, proc[i].FinishTime);
proc[i].RoundTime = proc[i].FinishTime - proc[i].ArrivalTime;//周转时间
proc[i].WeightRoundTime = proc[i].RoundTime / proc[i].ServiceTime;//带权周转时间
proc[i + 1].StartTime = proc[i].FinishTime;
}
// printProc();
}
void SJF()
{
}
//头文件
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
// TODO: 在此处引用程序需要的其他头文件
#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include "stdio.h"
#include "stdlib.h"
using namespace std;
鲜花会生锈,盐巴会腐烂