使用动态优先权和时间片轮转的进程调度算法的模拟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机与信息工程学院设计性实验报告
一、实验目的
通过动态优先权调度算法的模拟加深进程概念和进程调度过程的理解。二、实验仪器或设备
虚拟机
三、总体设计(设计原理、设计方案及流程等)
实验内容
(1)在Linux下用C语言编程模拟N个进程采用高优先权优先(要求采用
动态优先权)和简单时间片轮转两种进程调度算法。为了清楚地观察每
个进程的调度过程,程序应将每个时间片内的进程情况显示出来;
(2)进程控制块是进程存在的唯一标志,因此,在模拟算法中每一个进程用
一个进程控制块PCB来代表,PCB用一结构体表示。包括以下字段:
●进程标识数id,或者进程的名称name;
●进程优先数priority,并规定优先数越大的进程,其优先权越高;
●进程需要运行的CPU时间ntime;
●进程的运行时间rtime;
●进程状态state;
●队列指针next,用来将PCB排成队列。
(3)进程在运行过程中其状态将在就绪、执行、阻塞(可选)、完成几种状态
之间转换,同时进程可能处于不同的队列中,如就绪队列、阻塞队列(可
选)。在两种调度算法中,考虑分别可以选择什么样的队列及如何实现进
程的入队、出队操作;
(4)为了便于处理,优先权调度每次也仅让进程执行一个时间片,若在一个
时间片内未运行结束,调整进程优先级将其插入就绪队列,进行新一轮
调度;
(5)优先数改变原则:
●进程每运行若一个时间单位,优先数减3;
●进程在就绪队列中呆一个时间片,优先数增加1。(仅供参考,合理
即可)
(6)优先权调度中,对于遇到优先权一致的情况,可采用FCFS策略解决;
(7)由于是模拟进程调度,所以,对被选中的进程并不实际启动运行,而是
修改进程控制块的相关信息来模拟进程的一次运行;
(8)为了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情
况显示出来,参照格式如下:
id cputime needtime priority(count) state
0 0 2 48 ready
1 0 3 47 ready
2 0 6 44 ready
3 0 5 45 ready
4 0 4 46 ready
简单时间片轮转调度模拟程序见roundrobin.c,优先权调度大家请参考时间片轮转自行实现,有自己想法的同学可以按照自己的思路独立完成实验,而不用参考roundrobin.c程序。
四、实验步骤(包括主要步骤、代码分析等)
#include "stdio.h"
#include
#define getpch(type) (type*)malloc(sizeof(type))
struct pcb {
char name[10];
char state;
int count;
int ntime;
int rtime;
int priority;
struct pcb* link;
}*ready=NULL,*tail=NULL,*p;
typedef struct pcb PCB;
int slice;
sort()
{
PCB *first,*second;
int insert=0;
if((ready==NULL)||((p->priority)>(ready->priority)))
{
p->link=ready;
ready=p;
}
else
{
first=ready;
second=first->link;
while(second!=NULL)
{
if((p->priority)>(second->priority))
{
p->link=second;
first->link=p;
second=NULL;
insert=1;
}
else
{
first=first->link;
second=second->link;
}
}
if(insert==0)
first->link=p;
}
}
input()
{
int i,num;
printf("\n please enter a number of processes:");
scanf("%d",&num);
for(i=0;i { printf("\n process number No.%d:\n",i); p=getpch(PCB); printf("\n please enter the process name :"); scanf("%s",p->name); printf("\n please enter the process running time:"); scanf("%d",&p->ntime); printf("\n please enter the priority number :"); scanf("%d",&p->priority); printf("\n"); p->rtime=0; p->state='w'; p->count=0; p->link=NULL; sort(); } printf("\n please enter the time slice size:"); scanf("%d",&slice); } int space() { int l=0; PCB* pr=ready; while(pr!=NULL) { l++; pr=pr->link; } return(l); } disp(PCB * pr) { printf("\nqname \tstate \tcount \tntime \trtime \tpriority \n"); printf("%s\t",pr->name); printf("%c\t",pr->state); printf("%d\t",pr->count); printf("%d\t",pr->ntime); printf("%d\t",pr->rtime); printf("%d\t",pr->priority); printf("\n"); } check() { PCB* pr; printf("\n **** the current running process is :%s",p->name); disp(p); pr=ready; printf("\n **** the current ready queue state :\n"); while(pr!=NULL)