模拟在单处理器多进程操作系统的CPU调度。本实验为模拟实验,不要求实现真正的进程创建与进程调度。主要实现各种调度算法。
进程PCB结构:标识符、进程名称、到达时间、服务时间、剩余运行时间、已使用时间、进程状态。其中进程状态有三种:就绪R,运行E,结束F。
剩余运行时间和已使用时间两个属性用于时间片轮转算法和多级反馈队列算法。进程每使用完一个时间片,已使用时间就会增加一个时间片的长度,剩余运行时间=服务时间 – 已使用时间。
仅完成了先来先服务算法的调度和短作业优先算法:
在linux中因缺少conio包无法运行,可自行修改后 就能运行。我在VC++软件中运行如下代码:
#include "stdio.h"
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<string.h>
#include <iostream.h>
#define getpch(type) (type*)malloc(sizeof(type))
typedef struct pcb PCB;
//定义进程控制块的PDB
struct pcb{
int id; //标识符
char name[10]; //名称
int time_start; //到达时间
int time_need; //服务时间
int time_left;//剩余运行时间
int time_used; //已使用的CPU时间
char state; //进程状态
};
//系统函数
//停顿几秒
void _sleep(int n){
clock_t goal;
goal = (clock_t)n * CLOCKS_PER_SEC + clock();
while(goal>clock());
}
//按任意键继续
char _keygo(){
char c;
printf("按任意键继续.......\n");
c = getch();
return c;
}
///用户函数///
//数据设置区域
int time_unit = 2;//时间片长度
const maxnum = 10;//最大进程数量
int num = 5;//实际进程数量
PCB pcbdata[maxnum] = {
{1000,"A",0,4,4,0,'R'},
{1001,"B",2,5,3,0,'R'},
{1002,"C",5,3,5,0,'R'},
{1003,"D",4,2,2,0,'R'},
{1004,"E",1,1,4,0,'R'},
};
//就绪队列,存放进程的pcb
int ready[maxnum];
//记录排序使用哪个数值作为排序对象
int order[maxnum];
//手工输入数据
void input(){
int i;
printf("进程总数为:");
scanf("%d",&num);
for(i = 0; i< num; i++){
//系统自动分配标识符
pcbdata[i].id = 1000 + i;
printf("输入第%d个进程名:"