提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、FCFS算法思路与代码部分
二、SJF算法思路与代码部分
三、全部代码
前言
本文用于记录我的操作系统实验一 只用了c++的cout cin语句 基本都是c。
文中定义进程为一结构体(已知条件为到达时间cometime与服务时间servetime):
typedef struct pcb
{
char id;//进程id
int cometime;//到达时间
int servetime;//服务时间
int starttime;//开始时间
int endtime;//结束时间
int cycletime;//周转时间
float powertime;//带权周转时间
};
一、FCFS算法思路与代码部分
FCFS(First come first serve)即先到先服务,以到达时间为基准,哪个进程的到达时间小就先服务,不过对于第i+1个进程的到达时间在第i个进程的完成时间之前还是之后要进行分类讨论。
首先是按到达时间排序(小的在前):
void sort_time(pcb p[], int n)//冒泡排序(按到达时间
{
int i, j;
pcb t;//中间变量
for (i = 0; i < n - 1; i++)
{
for (j = i + 1; j <= n-1; j++)
if (p[i].cometime > p[j].cometime)
{
t = p[i];
p[i] = p[j];
p[j] = t;
}
}
}
排完序后对于第一个到达的进程服务(即计算第一个进程的各种时间):
p[0].starttime = p[0].cometime;
p[0].endtime = p[0].starttime + p[0].servetime;
p[0].cycletime = p[0].endtime - p[0].cometime;
p[0].powertime = (p[0].cycletime * 1.0) / (p[0].servetime * 1.0);
接着就是遍历p[1]到p[n-1],进行分类讨论:
for (int i = 1; i <= n - 1; i++)
{
//若i-1还未完成时i就来了,则等待i-1完成
if (p[i].cometime < p[i - 1].endtime)
p[i].starttime = p[i - 1].endtime;
else
//i-1完成后经过一段空闲时间i来了,则直接服务
{