• 大小: 68KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-09
  • 语言: 其他
  • 标签: 操作系统  

资源简介

进程调度算法包括先来先服务调度算法FCFS、最短作业时间优先SJF(抢占式 和非抢占式)、最高响应比调度HRN算法4种。(每个人必须做非抢占式SJF, 然后在后面的三种中任选一种,即每个人必须做2种调度算法的模拟。)

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include
#define DELAY 100       
using namespace std;

unsigned short TIME = 0; //当前时间 
unsigned short NUM = 0; //进程数量 
char TYPE = ‘1‘;       //算法类型

//进程控制块PCB 
typedef struct PCB {
char name[16];
char state; //[R]Run[F]Finish[P]Pause[N]New 
unsigned short t_arrive; //到达时间
unsigned short t_start; //开始时间
unsigned short t_finish; //完成时间
unsigned short t_service; //服务时间
unsigned short t_run; //运行时间
unsigned short t_wait; //等待时间
struct PCB *next;
} pcb;

pcb *now = NULL //现在运行的进程
*head = NULL; //pcb链头部指针 

void fcfs(); //先到先服务 
void sjf(); //短作业优先 

void init();      //初始化,完成pcb录入 
pcb *sort(pcb*); //对init()录入的pcb按到达时间排序 
void timer();    //定时器,每一个延迟自我调用一次 
void result();   //打印结果 

 //先到先服务算法
void fcfs() {
if (now->t_arrive>TIME) {//还未到达,则是无进程状态
printf(“[时间:%d]\t无进程运行\n“ TIME);
return;
}
if (now->state == ‘N‘) {//N新进程改为R正在运行进程。设置开始时间为time,并打印。
now->state = ‘R‘;
now->t_start = TIME;
printf(“[时间:%d]\t进程:%s 首次运行\n“ TIME now->name);
}
else if (now->state == ‘R‘) {//R正在运行进程的话
(now->t_run)++;//运行时间自动加一
if (now->t_run >= now->t_service) {//运行结束时
now->state = ‘F‘;//标记结束
now->t_finish = TIME;//标记结束时间
printf(“[时间:%d]\t进程:%s 任务完成\n“ TIME now->name);//打印
now = now->next;//跳转到下一个进程
if (now != NULL) fcfs();
}
else //打印运行状态
printf(“[时间:%d]\t进程:%s 正在运行,已运行时间:%d\n“ TIME now->name now->t_run);
}
}

void sjf() {
if (now->t_arrive>TIME) {//所有进程都完毕,新进程进程还未到达,则是无进程状态
printf(“[时间:%d]\t无进程运行\n“ TIME);
return;
}
if (now->state == ‘N‘) {//N新进程改为R正在运行进程。设置开始时间为time,并打印。
now->state = ‘R‘;
now->t_start = TIME;
printf(“[时间:%d]\t进程:%s 首次运行\n“ TIME now->name);
}
else if (now->state == ‘R‘) {//R正在运行的进程
(now->t_run)++;//运行时间自动加一
if (now->t_run >= now->t_service) {//运行结束时
now->state = ‘F‘;//标记结束
now->t_finish = TIME;//标记结束时间
printf(“[时间:%d]\t进程:%s 任务完成\n“ TIME now->name);//打印

pcb *p = head//检索指针,从头检索。
*p_min = NULL;//最小进程
unsigned short t_min = 9999;
while (p != NULL && p->t_arrive <= TIME) {//从【现在时间及以前】并且未结束的进程中,选出服务时间最小的进程 
if (p->state == ‘F‘) {//当前检索进程已经结束,则检索指针指向下一个进程检索。
p = p->next;
continue;
}
if (p->t_service < t_min) {//当前检索进程的服务时间更短,标记并记录位置。
t_min = p->t_service;
p_min = p;
}
p = p->next;//检索下一个
}

now = p_min;//跳转到最短进程
if (now != NULL) sjf();
}
else //打印运行状态
printf(“[时间:%d]\t进程:%s 正在运行,已运行时间:%d\n“ TIME now->name now->t_run);
}
}



//格式化输出结果
void result() {
pcb *p = head;
double zhouzhuan = 0 pingjunzhouzhuan = 0;
printf(“\n=========运行结果=========\n\n“);
printf(“名称 到达时间 开始时间 完成时间 服务时间 周转时间 带权周转时间\n“);
while (p != NULL)
{
printf(“ %s\t%d\t %d\t %d\t %d\t %d\t %.2f\n“ p->name p->t_arrive
p->t_start p->t_finish p->t_service p->t_finish - p->t_arrive
1.0*(p->t_finish - p->t_arrive) / p->t_service);

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2017-06-15 18:35  os\
     文件        5346  2017-04-11 16:05  os\os.cpp
     文件       71945  2017-04-11 16:02  os\运行结果.docx

评论

共有 条评论