用C++实现进程调度算法(先来先服务FCFS、抢占和非抢占的短作业优先SJF、时间片轮转RR、静态优先级、高响应比优先HRRN算法)

1 实验内容

假如一个系统中有5个进程,它们的到达时间内如表1所示,忽略I/O以及其他开销时间。若分别按先来先服务(FCFS)、抢占的短作业优先(SJF)、时间片轮转(RR,时间片=1)进行CPU调度,请按照上述三个算法,编程计算出各进程的完成时间内、周转时间、带权周转周期、平均周转周期和平均带权周转时间。

表1 进程到达和需服务时间

进程

到达时间

服务时间

A

0

3

B

2

6

C

4

4

D

6

5

E

8

2

2 算法描述

本程序模拟了六种进程调度算法,分别为:先来先服务、抢占和非抢占的短作业优先、时间片轮转、静态优先级、高响应比优先算法。

(1)定义PCB结构体,成员包含名称、到达时间、服务时间、开始时间、完成时间、周转时间、带权周转时间、标志是否运行结束的标记符、等待时间、剩余时间(用于抢占式算法)、静态优先级(用于静态优先级算法)、运行时间。然后构建全局变量模拟进程就绪队列。

(2)设计进程信息初始化函数。并在此函数中按到达时间对进程进行排序。

(3)设计进程信息输入函数,其中包含文件读取和手动输入两种方式。

(4)先来先服务(FCFS)调度算法

FCFS是一种最简单的调度算法, FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机。

FCFS属于不可剥夺(抢占)算法。从表面上看,它对所有作业都是公平的,但是如果有一个长作业先到达系统,就会使后面许多短作业等待很长时间,因此这种方法肯定不能作为分时系统和实时系统的调度方法,但是它常被结合在其他调度策略使用。比如在使用优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按FCFS原则处理。

特点分析:算法简单,但是效率低下;对长作业较为有利,对短作业不利;利于CPU繁忙型作业,不利于I/O繁忙型作业。

在我设计的模拟程序中,由于进程在初始化时就已经按照到达时间排序,因此只需要通过一个循环,依次模拟进程调度完成即可。

(5)非抢占式短作业优先(SJF)调度算法

非抢占式短作业优先(SPF)调度算法是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某时间而阻塞时,才释放处理机。

但是这种算法有着不容忽视的缺点:

①该算法对长作业不利,SJF中长作业的周转时间会增加。更糟的是,若一旦有长作业进入系统的后备队列,由于调度程序总是优先调度那些短作业(即使是后来的短作业也会被优先安排给处理机),导致长作业长期不被调度,饿死在后备队列中。

②完全没有考虑作业的紧迫程度,因而不能保证紧迫的作业会被及时处理。

③由于作业的长短只是根据用户所提供的预估的执行时间而定的,而用户又可能会有意无意地缩短其作业的估计运行时间,使得算法不一定能真正做到短作业优先调度。

但该算法的优点也显而易见:平均等待时间、平均周转时间最少。

在我设计的模拟程序中,会先用一个循环找到当前未完成的进程中服务时间最短的,将其优先执行,再通过外层循环重复上述操作,直至所有进程调度完成。

(6)抢占式短作业优先调度算法

抢占式短作业优先调度算法的思想是在就绪队列中,在已到达的进程内挑选剩余执行时间最短的进程进行一个时间单元之后暂停,若有其它新的进程添加进来需要考虑是否剩余时间最短,若有进程比暂停进程更符合算法条件,则该进程抢占CPU进行一个时间片,直到所有的进程都进行完毕。

在本模拟程序中,将该算法的时间片默认为1,与非抢占式SJF不同的是,循环中比较的是当前时间下所有进程的剩余时间,而在每一个时间片过后都需要重新进行

  • 32
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
先来先服务算法 #include "stdio.h" #include #define max 100 #define pfree 0 /*process end*/ #define running 1 /*process running status*/ #define aready 2 /*process aready status */ #define blocking 3 /*process aready blocking status*/ typedef struct node { char name; int status; int ax,bx,cx,dx; int pc; int psw; struct node *next; /*pcb define*/ }pcb; pcb *createprocess(pcb *head) { pcb *p,*q; int a,b,c,d,m,n; char ID; q=NULL; printf("input the first seven status pcb:"); scanf("\n%c%d%d%d%d%d%d",&ID,&a,&b,&c,&d,&m,&n); while(1) { p=(pcb*)malloc(sizeof(pcb)); p->name=ID; p->ax=a; p->bx=b; p->cx=c; p->dx=d; p->pc=m; p->psw=n; p->status=aready; if(head==NULL) head=p; else q->next=p; q=p; printf("input the next seven status pcb: "); scanf("\n%c",&ID); if (ID == '*') break; scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&m,&n); } if(q!=NULL) q->next=NULL; q=head; while(q) { printf("\n process name. status.ax. bx. cx. dx. pc. psw.\n "); printf("%10c%5d%5d%5d%5d%5d%5d%5d",q->name,q->status,q->ax,q->bx,q->cx,q->dx,q->pc,q->psw); q=q->next; } return head;/*createprocess end*/ } void processfcfs(pcb *head) /*use fifo */ { pcb *p; p=head; printf("\n the process use fcfs method.\n"); printf("running the frist process:\n"); while(p!=NULL) { p->status=running; printf("\nprocess name status. ax. bx. cx. dx. pc. psw."); printf("\n%10c%5d%8d%5d%5d%5d%5d%5d",p->name,p->status,p->ax,p->bx,p->cx,p->dx,p->pc,p->psw); /*check process running status */ p->status=0; p=p->next; } printf("\n检查进程是否结束:"); p=head; while(p) { printf("\n%3c%3d",p->name,p->status); p=p->next; } printf("\ngame is over!\n"); } main() { pcb *head; head=NULL; head=createprocess(head); processfcfs(head); }
下面是对先来先服务调度算法FCFS)、作业优先调度算法SJF)、时间片轮转调度算法RR)和优先级调度算法的模拟实现的简要介绍: 1. 先来先服务调度算法FCFS): - 这是一种抢占调度算法,按照作业到达的顺序进行调度。 - 模拟实现时,可以根据作业到达的时间和执行时间,按照先后顺序进行调度,并计算平均等待时间和平均周转时间。 2. 作业优先调度算法SJF): - 这是一种抢占调度算法,按照作业执行时间的长进行调度。 - 模拟实现时,可以根据作业的执行时间,选择执行时间最作业进行调度,并计算平均等待时间和平均周转时间。 3. 时间片轮转调度算法RR): - 这是一种抢占调度算法,将CPU时间分为固定长度的时间片,每个作业在一个时间片内执行。 - 模拟实现时,可以使用循环队列来维护就绪队列,每个作业在一个时间片内执行一定量的工作,并按照轮转的方式进行调度。 4. 优先级调度算法: - 这是一种抢占式或抢占调度算法,根据作业优先级进行调度,优先级高的作业先执行。 - 模拟实现时,可以为每个作业分配一个优先级,并根据优先级选择下一个要执行的作业,并计算平均等待时间和平均周转时间。 以上算法可以通过编写C程序来进行模拟实现,你可以根据具体的需求和输入数据进行算法的测试和比较。如果你需要更详细的实现代码或有其他问题,请告诉我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值