进程调度算法模拟 实验报告
更新时间:2023-08-28 19:48:01 阅读量: 教育文库 文档下载
- 进程调度算法模拟实验报告推荐度:
- 相关推荐
实 验 报 告
课程名称
实验名称 专业班级 学生姓名 指导教师
实验一 进程调度算法模拟,
1.内容:设计一个简单的进程调度算法,模拟OS中的进程调度过程;
2.要求:
① 进程数不少于5个;
② 进程调度算法任选;
可以用动态优先数加时间片轮转法实现进程调度,每运行一个时间片优先数减3; ③ 用C语言编程;
④ 程序运行时显示进程调度过程。
3.步骤:
① 设计PCB及其数据结构:
进程标识数:ID
进程优先数:PRIORITY(优先数越大,优先级越高)
进程已占用时间片:CPUTIME,每得到一次调度,值加1;
进程还需占用时间片:ALLTIME,每得到一次调度,该值减1,一旦运行完毕,
ALLTIME为0)
进程队列指针:NEXT,用来将PCB排成队列
进程状态:STATE(一般为就绪,可以不用)
② 设计进程就绪队列及数据结构;
③ 设计进程调度算法,并画出程序流程图;
④ 设计输入数据和输出格式;
结构格式:当前正运行的进程:0
当前就绪队列:2,1,3,4
⑤ 编程上机,验证结果。
4.提示:
假设调度前,系统中有5个进程,其初始状态如下:
ID 0 1 2 3 4 PRIORITY 9 38 30 29 0 可否考虑用CPUTIME 0 0 0 0 0 数组或链表ALLTIME 3 2 6 3 4 去实现 STATE ready ready ready ready ready ① 以时间片为单位调度运行;
② 每次调度ALLTIME不为0,且PRIORITY最大的进程运行一个时间片; ③ 上述进程运行后其优先数减3,再修改其CPUTIME和ALLTIME,重复②,③ ④ 直到所有进程的ALLTIME均变为0。
5.书写实验报告
① 实验题目;
② 程序中所用数据结构及说明;
③ 清单程序及描述;
④ 执行结果。
实验源代码:
#include<stdio.h>
#include<malloc.h>
typedef int Status;
#define ERROR 0
#define OK 1
typedef struct PCB{
char NAME[10]; //进程名字
int PRIO; //进程优先数
int ROUNT; //轮转时间片
int COUNT; //计数器
int NEEDTIME; //需要的CPU时间
int CPUTIME; //占用cpu时间
char *STATE; //进程状态
}ElemPCB;
typedef struct QNode{
ElemPCB pcb;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct{ //就绪队列
QueuePtr RUN; //当前运行进程指针
QueuePtr READY; //头指针
QueuePtr TAIL; //尾指针
}READYQueue;
typedef struct{ //完成队列
QueuePtr FINISH; //头指针
QueuePtr TAIL; //尾指针
}FINISHQueue;
Status Create(READYQueue &ready);
Status Print(READYQueue ready,FINISHQueue finish);
Status Printr(READYQueue ready,FINISHQueue finish);
Status Fisrt(READYQueue &ready);
Status Insert1(READYQueue &ready);
Status Insert2(READYQueue &ready);
Status Prisch(READYQueue &ready,FINISHQueue &finish);
Status Roundsch(READYQueue &ready,FINISHQueue &finish);
void main(){
char ch;
READYQueue ready;
FINISHQueue finish;
ready.READY=ready.TAIL=(QueuePtr)malloc(sizeof(QNode));
ready.RUN=(QueuePtr)malloc(sizeof(QNode));
ready.RUN->next=NULL;
finish.FINISH=finish.TAIL=(QueuePtr)malloc(sizeof(QNode));
Create(ready);
//创建后就绪对列中
printf("\n就绪对列中初始值:\n");
Print(ready,finish); //存储分配
Fisrt(ready);
printf("请输入要选择调度的算法(p--优先数调度,r--时间片轮转法):\n");
while(1){
do{
ch=getchar();
scanf("%c",&ch);
}while(ch!='p' && ch!='r');
switch(ch){
case 'p':
//优先数调度
Prisch(ready,finish);
break;
case 'r':
//时间片轮转法
Roundsch(ready,finish);
break;
}
}
}
Status Print(READYQueue ready,FINISHQueue finish){
队列中的进程状态
QueuePtr p,q;
p=ready.READY;
q=finish.FINISH;
//运行中的进程
if(ready.RUN->next!=NULL)
{
printf("%s",ready.RUN->next->http://www.77cn.com.cn);
printf(":%s\t",ready.RUN->next->pcb.STATE);
printf("优先数:%d\n",ready.RUN->next->pcb.PRIO);
}
//就绪队列的进程
while(p!=ready.TAIL){
printf("%s",p->next->http://www.77cn.com.cn);
printf(":%s\t",p->next->pcb.STATE);
printf("优先数:%d\n",p->next->pcb.PRIO);
p=p->next;
}
//完成队列的进程
while(q!=finish.TAIL){
printf("%s",q->next->http://www.77cn.com.cn);
printf(":%s\t",q->next->pcb.STATE);
printf("优先数:%d\n",q->next->pcb.PRIO);
q=q->next; //打印就绪
}
return OK;
}
Status Printr(READYQueue ready,FINISHQueue finish){ //打印就绪队列中的进程状态
QueuePtr p,q;
p=ready.READY;
q=finish.FINISH;
//运行中的进程
if(ready.RUN->next!=NULL)
{
printf("%s",ready.RUN->next->http://www.77cn.com.cn);
printf(":%s\t",ready.RUN->next->pcb.STATE);
printf("剩余时间:%d\n",ready.RUN->next->pcb.NEEDTIME);
}
//就绪队列的进程
while(p!=ready.TAIL){
printf("%s",p->next->http://www.77cn.com.cn);
printf(":%s\t",p->next->pcb.STATE);
printf("剩余时间:%d\n",p->next->pcb.NEEDTIME);
p=p->next;
}
//完成队列的进程
while(q!=finish.TAIL){
printf("%s",q->next->http://www.77cn.com.cn);
printf(":%s\t",q->next->pcb.STATE);
printf("剩余时间:%d\n",q->next->pcb.NEEDTIME);
q=q->next;
}
return OK;
}
Status Create(READYQueue &ready){
QueuePtr p;
int i=0 ;
int n;
printf("请输入进程个数:");
scanf("%d",&n);
while(i<n)
{
p=(QueuePtr)malloc(sizeof(QNode));
printf("输入第%d进程名:",i+1);
scanf("%s",p->http://www.77cn.com.cn);
printf("输入进程需要的时间:");
scanf("%d",&p->pcb.NEEDTIME);
printf("输入进程的进程优先数:");
scanf("%d",&p->pcb.PRIO);
p->pcb.STATE="W";
p->pcb.ROUNT=2;
p->pcb.COUNT=0;
i++;
p->next=NULL;
ready.TAIL->next=p;
ready.TAIL=p;
}
return OK;
}
Status Fisrt(READYQueue &ready){
if(ready.READY==ready.TAIL)
return ERROR;
ready.RUN->next=ready.READY->next;
ready.RUN->next->pcb.STATE="RUN"; //修改进程状态
if(ready.TAIL==ready.READY->next)
ready.READY=ready.TAIL;
else
ready.READY->next=ready.READY->next->next; //头指针后移
printf("\n%s被从就绪队列调度运行\n",ready.RUN->next->http://www.77cn.com.cn);
return OK;
}
Status Insert1(READYQueue &ready){
int i=0,j=0;
QueuePtr p=ready.READY,q;
ElemPCB temp;
QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
s->pcb=ready.RUN->next->pcb;
s->next=NULL; //将未完成的进程插入就绪队列
ready.TAIL->next=s;
ready.TAIL=s;
//按优先数从大到小排序
for(p;p!=ready.TAIL;p=p->next)
{
for(q=p->next;q!=ready.TAIL;q=q->next)
{
if(p->next->pcb.PRIO < q->next->pcb.PRIO)
{
temp=p->next->pcb;
p->next->pcb=q->next->pcb;
q->next->pcb=temp;
}
}
}
return OK;
}
Status Insert2(READYQueue &ready){
QueuePtr p=ready.RUN->next;
if(p->pcb.NEEDTIME > 0)
{
ready.TAIL->next=p; //插入到就绪队列
ready.TAIL=p;
ready.RUN->next=NULL;
}
return OK;
}
Status Prisch(READYQueue &ready,FINISHQueue &finish){
int i=0 ;
while(ready.RUN->next!=NULL)
{
ready.RUN->next->pcb.CPUTIME++;
ready.RUN->next->pcb.NEEDTIME--;
ready.RUN->next->pcb.PRIO-=3;
if(ready.RUN->next->pcb.NEEDTIME==0)
{
finish.TAIL->next=ready.RUN->next; //插入到完成队列
finish.TAIL=ready.RUN->next; //尾指针后移
ready.RUN->next->pcb.STATE="FINISH";
ready.RUN->next=NULL;
if(ready.READY!=ready.TAIL)
{
Fisrt(ready);
}
}
else if(ready.READY != ready.TAIL && (ready.RUN->next->pcb.PRIO) (ready.READY->next->pcb.PRIO))
{
ready.RUN->next->pcb.STATE="W";
printf("%s被调到就绪队列里\n",ready.RUN->next->http://www.77cn.com.cn); Insert1(ready);
Fisrt(ready);
}
i++;
printf("\n进程执行第%d个时间片的结果:\n",i);
Print(ready,finish);
} <
return OK;
}
Status Roundsch(READYQueue &ready,FINISHQueue &finish){
int i=0;
while(ready.RUN->next!=NULL)
{
ready.RUN->next->pcb.CPUTIME++;
ready.RUN->next->pcb.NEEDTIME--;
ready.RUN->next->pcb.COUNT++;
if(ready.RUN->next->pcb.NEEDTIME==0)
{
finish.TAIL->next=ready.RUN->next; //插入到完成队列 finish.TAIL=ready.RUN->next; //尾指针后移
ready.RUN->next->pcb.STATE="FINISH";
ready.RUN->next=NULL;
if(ready.READY!=ready.TAIL)
{
Fisrt(ready);
}
}
else if(ready.RUN->next->pcb.COUNT==ready.RUN->next->pcb.ROUNT) {
ready.RUN->next->pcb.COUNT=0;
if(ready.READY != ready.TAIL)
{
ready.RUN->next->pcb.STATE="W";
printf("%s被调到就绪队列里\n",ready.RUN->next->http://www.77cn.com.cn); Insert2(ready);
Fisrt(ready);
}
}
i++;
printf("\n进程执行第%d个时间片的结果:\n",i);
Printr(ready,finish);
}
return OK;
}
运行结果截图:
正在阅读:
进程调度算法模拟 实验报告08-28
初二上册历史教师总结汇报202204-24
学而优二年级数学家庭作业二03-09
中南财经政法大学2012学年大学生暑期社会实践立项申报书04-28
计量通用题库12-24
技术:洗砂污水处理常用工艺05-05
2C值水平角观测限差与竖盘指标差10-09
家庭教育学试题01-31
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 调度
- 算法
- 进程
- 模拟
- 实验
- 报告
- 地理:湘教版八年级上册第三章 中国的自然资源复习题(测试卷)
- S7-300PLC与200PLC之间的PROFIBUS-DP网络通信
- 部编人教版小学二年级数学上册《乘法的初步认识(一)》教案
- 关掉计划任务服务(Task Scheduler)是一个什么服务
- 【市政工程沟槽土方计算表】
- 进入21世纪的世界大趋势 ——经济全球化和世界多极化
- 深圳市流动人口社区卫生服务需求与供给研究
- 架空高压输电线路巡线机器人样机研制
- 【推荐重点】2019高中数学 第1章 统计案例 1.2 回归分析学案 苏教版选修1-2
- 第1讲 降低化学反应活化能的酶,细胞的能量“通货”——ATP
- “十三五”重点项目-学生信息管理系统项目申请报告
- 一诺千金 诚信做人 作者:宏威数码 HR卓伟灿
- 新编中日交流标准日本语教案31~40课
- 初三化学计算题中考复习
- 电信各省联系名单有点老
- 教育工作目标管理督导考核细则(试行)
- 2016-2022年中国装饰原纸产业发展现状及发展前景报告
- 电磁感应竞赛题解析
- 构造判断矩阵的讲解(层次分析法)
- 竣工_验收监理质量评估报告