静态优先权优先算法的进程调度程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(at>thisP->next->enterMemoryTime){//判断当前时间是否大于下一节点时间
markP=thisP->next;//是,标记此节点
at=markP->enterMemoryTime;//到达时间更改为标记时间
}
thisP=thisP->next;//向后遍历
}
}
return markP;
if(i>0){//初始之后,计算各时间及周转
srt=runtime;
runtime+=runPro->serviceTime;
4.2
(1)主菜单:如图4.1所示。
图4.1主菜单
(2)进程调度模拟。
图4.2创建进程
2)
图4.3进程运行过程
3)进程在调度算法中,计算出的具体的完成时间,周转时间,带权时间。如图4.4所示。
图4.4进程运行结果
(3)选择2:从文件读取数据。如图4.5。
在f:\test.txt中,数据如下。
//从文件读取数据
确定进程优先权的依据有如下三个方面:
a.进程类型.(系统进程/用户进程)
b.进程对资源的需求.(需求量的大小)
c.用户要求.(用户进程紧迫程度)
3)本程序采用优先级数字大的优先权大。
1.2
1)每一个进程有一个PCB,其内容可以根据具体情况设定。
2)进程数、进入内存时间、要求服务时间、优先级等均可以在界面上设定。
void printPCBP(struct PCB *);
void printField();
void printFieldP();
void release(struct PCB *);
void releaseR(struct PCB *);
void setNewPCB(char *,int,int,int);
3)可读取样例数据(要求存放在外部文件中)进行进程数、进入内存时间、进程优先级的初始化。
4)可以在运行中显示各进程的状态:就绪、执行 (由于不要求设置互斥资源与进程间的同步关系,故只有两种状态)。
5)具有一定的数据容错性。
2
2.1
系统总体设计如图2.1所示。
图2.1系统总体设计
2.2
1)void buildProcess():手动创建进程。
/*数据格式如下
进程名优先级到达时间服务时间
proc12110
proc22111
proc3322
*/
运行结果。如图4.6
图4.6文件读取数据及运行结果
5
根据屏幕提示输入即可。
需要用户注意的是优先级(整数表示)越大优先权越大。
6
本次课程设计,第一天上午去拿课程设计题目采用静态优先权优先算法的进程调度程序,下午开始查找资料并且构思。在网上看到一些课程设计用到的有数据结构体struct,便再度拿出C语言书本以及数据结构课本,主要看了数据结构体和单链表方面的知识。上面也曾说到,程序设计初期打算在单链表中直接使用冒泡排序法进程优先级的排序,总是失败。后来意识到,进程调度不仅要考虑到进程优先级,同时还有进入内存的时间。因为只有到达进入内存的时间,进程才会被调入内存中,进一步通过满足条件被调入CPU中执行,或者说分配CPU进而执行。所以索性模拟出调入内存方法以及调入CPU方法,与此有极大关系的是单链表就绪列表的建立。进行代码编写以及测试,从而模拟进程调度算法完成。
thisP=head;
while(thisP->next!=NULL){
thisP=thisP->next;
}
thisP->next=newP;//遍历单链表,找到最后一个元素
}
thisP=newP;
thisP->No=SequenceNumber;
SequenceNumber++;
printf("进程号%d\n",thisP->No);
srt=at=temp->enterMemoryTime;
runtime=at+temp->serviceTime;
turnOverTime=runtime-at;
ptot=turnOverTime*1.0/temp->serviceTime;
}
readyList(temp);//初始纳入就绪列表以及后续
scanf("%d",&thisP->serviceTime);
thisP->next=NULL;
}
void buildProcess(){//创建进程
int i=0;
printf("输入进程数量:");
scanf("%d",&ProcessAmount);
while(i<ProcessAmount){
void run()//静态优先权算法。将执行的程序释放。调入新的满足执行条件的进程。就绪列表释放。
4.
4.1
在程序设计初期。本想采用冒泡排序将进入内存的进程进行优先级排序,不过最后总是排序失败。最后想到我进行的是进程调度模拟,应该就有进程调入内存以及调入CPU,因此之后设计其他函数进行调入内存、CPU的模拟。而且最后选择新建就绪列表,进行选择插入就绪列表中。以及随时使用屏幕打印语句printf来测试程序各个阶段执行状态。
thisP->enterMemoryTime=pcb->enterMemoryTime;
thisP->serviceTime=pcb->serviceTime;
thisP->next=NULL;
}
struct PCB * callMemory(){//调入内存,返回调入内存的链表节点
int at;//到达时间
printf("输入进程名:");
scanf("%s",thisP->name);
printf("输入优先级:");
scanf("%d",&thisP->priority);
printf("输入进入Hale Waihona Puke Baidu存时间:");
scanf("%d",&thisP->enterMemoryTime);
printf("输入服务时间:");
静态优先权优先算法的进程调度程序
学院
专业
学生姓名
学号
指导教师姓名
21014年3月19日
1.
1.1
1)设计并实现一个采用静态优先权算法的进程调度演示程序。并且求出每个进程的周转时间以及带权周转时间。
2)静态优先权是在创建进程时确定的,且在进程的整个运行期间保持不变.
一般地,优先权是利用某一范围内的一个整数来表示的,例如,0~7或0~255中的某一整数, 又把该整数称为优先数.只是具体用法各异:有的系统用"0"表示最高优先权,当数值愈大时,其优先权愈低;而有的系统恰恰相反.
struct PCB *markP;
if(head==NULL){
printf("程序没有找到。\n");
}else{
markP=thisP=head;//标记指向头节点
at=thisP->enterMemoryTime;//到达时间为头节点到达时间
while(thisP->next!=NULL){//当下一节点不为空
release(temp);//释放进程
while(head!=NULL&&(temp=callMemory())->enterMemoryTime<=runtime){
readyList(temp);//循环判断是否纳入就绪列表
release(temp);
}
}
runPro=runTheProcess();
}
void run(){//静态优先级算法执行。
struct PCB *temp;//临时节点用来存储调入内存节点
struct PCB *runPro;//用来接收执行的节点
int i;//循环初始条件
int at,srt,runtime=0;//到达时间,开始执行时间,运行时间。
int turnOverTime;//周转时间
int No;//进程号
char name[16];//进程名
int enterMemoryTime;//进入内存时间
int serviceTime;//服务时间
int priority;//优先级
struct PCB *next;
};
struct PCB *head,*thisP,*newP;//动态接收进程及详细
3.2
struct PCB * callMemory()//调入内存,返回调入内存的链表节点。将达到进程进入内存时间的所有进程调入内存。
void readyList(struct PCB *pcb)//单链表的形式创建就绪队列。将进入内存的进程调入就绪列表。
struct PCB * runTheProcess()//执行的进程,返回要执行进程的节点。将就绪列表中满足运行条件的进程标识下来并返回节点。
11)void setNewPCB(char *name,int pri,int entime,int sertime):创建进程。在6)中被调用。
12)int timeOfData(FILE *f):计算文件中进程数量。在6)中被调用。
2.3
结构体:struct PCB{} *head,*readyHead;
double ptot;//带权周转时间
if(head==NULL){
printf("没有发现进程。\n");
}else{
for(i=0;i<ProcessAmount;i++){//循环进程的数量次
while(head!=NULL){
temp=callMemory();
if(i==0){//初始情况下球开始执行时间,完成时间,周转时间,带权周转时间
7
7
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int SequenceNumber=1;//进程编号
int ProcessAmount;//进程数量
int StartCount=0;//调入内存进程计数
struct PCB{//进程控制块
struct PCB *readyHead;//动态存储就绪队列
//函数声明
int getch();
int timeOfData(FILE *);
void ListAllPCB();
void Menu();
void printPCB(struct PCB *,int,int,int,double);
struct PCB * runTheProcess();
void newPCB(){//建立PCB
newP=(struct PCB *)malloc(sizeof(struct PCB));
if(head==NULL){//判断头节点是否为空
head=newP;//为空,头节点指向新开辟的内存
}else{
3
3.1
struct PCB
{
int ArrivalTime;
int ServiceTime;
char number[10];
};
struct PCB *head,*thisP,*newP;//动态接收进程及详细
struct PCB *readyHead;//动态存储就绪队列
采用结构体数组,创建一个进程,包含进程相关信息:进程名称、进程优先级、进程到达时间、进程服务时间。
2)struct PCB * callMemory():将符合条件的进程调入内存。
3)void ListAllPCB(struct PCB *h):打印所有进程到屏幕上。
4)void Menu():菜单以及执行。
5)void newPCB():创建进程。在1)中被调用。
6)void readFromFile():从文件中读取数据。
newPCB();
i++;
}
}
void readyList(struct PCB *pcb){//单链表的形式创建就绪队列
newP=(struct PCB *)malloc(sizeof(struct PCB));
if(readyHead==NULL){
readyHead=newP;
}else{
thisP=readyHead;
7)void readyList(struct PCB *pcb):就绪列表。
8)void release(struct PCB *pcb),void releaseR(struct PCB *pcb):释放进程。
9)void run():执行静态优先级进程调度算法。
10)struct PCB * runTheProcess():标识要执行的进程。
while(thisP->next!=NULL){
thisP=thisP->next;
}
thisP->next=newP;
}
thisP=newP;
strcpy(thisP->name,pcb->name);
thisP->No=pcb->No;
thisP->priority=pcb->priority;
相关文档
最新文档