没有合适的资源?快使用搜索试试~ 我知道了~
1操作系统实验1.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 118 浏览量
2022-06-22
08:41:36
上传
评论
收藏 1.05MB DOC 举报
温馨提示
试读
43页
实验1 进程调度模拟 1. 目的要求 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解 。 2. 问题: 设计一个有 N个进程共行的进程调度程序。 进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进 程)和先来先服务算法。 每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间 、已用CPU时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进 程的到达时间为进程输入的时间。 进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用 CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数 减1(即降低一级),然后把它插入
资源推荐
资源详情
资源评论
1 操作系统实验 1
实验 1 进程调度模拟
一、 目的要求
用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
二、 问题:设计一个有N 个进程共行的进程调度程序。
进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进
程)和先来先服务算法。
每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、
优先数、到达时间、需要运行时间、已用 CPU 时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程
的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(Wait)、运行 R(Run)、或完成 F(Finish)三种
状态之一。
就绪进程获得CPU 后都只能运行一个时间片。用已占用 CPU 时间加 1 来表示。
如果运行一个时间片后,进程的已占用CPU 时间已达到所需要的运行时间,则撤消该
进程,如果运行一个时间片后进程的已占用 CPU 时间还未达所需要的运行时间,也就是进
程还需要继续运行,此时应将进程的优先数减 1(即降低一级),然后把它插入就绪队列
等待 CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进
行检查。
重复以上过程,直到所要进程都完成为止。
调度算法的流程图如下:
1 操作系统实验 1
进程调度源程序如下:
jingchendiaodu.cpp
#include "stdio.h"
#include <stdlib.h>
#include <conio.h>
#dene getpch(type) (type*)malloc(sizeof(type))
#dene NULL 0
struct pcb { /* 定义进程控制块 PCB */
char name[10];
char state;
int super;
int ntime;
int rtime;
struct pcb* link;
}*ready=NULL,*p;
1 操作系统实验 1
typedef struct pcb PCB;
4
4
sort() /* 建立对进程进行优先级排列函数*/
{
PCB *rst, *second;
int insert=0;
if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者,插入队首*/
{
p->link=ready;
ready=p;
}
else /* 进程比较优先级,插入适当的位置中*/
{
rst=ready;
second=rst->link;
while(second!=NULL)
{
if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/
{ /*插入到当前进程前面*/
p->link=second;
rst->link=p;
second=NULL;
insert=1;
}
else /* 向后继续寻找插入位置*/
{
rst=rst->link;
second=second->link;
}
}
if(insert==0) rst->link=p; /*插到末尾处*/
}
}
4input() /* 建立进程控制块函数*/
{
int i,num;
clrscr(); /*清屏*/
printf("\n 请输入进程号?");
scanf("%d",&num);
for(i=0;i<num;i++)
{
printf("\n 进程号 No.%d:\n",i);
p=getpch(PCB);
1 操作系统实验 1
printf("\n 输入进程名:");
scanf("%s",p->name);
printf("\n 输入进程优先数:");
scanf("%d",&p->super);
printf("\n 输入进程运行时间:");
scanf("%d",&p->ntime);
printf("\n");
p->rtime=0;p->state='w';
p->link=NULL;
sort(); /* 调用 sort 函数*/
}
}
int space()
{
int l=0; PCB* pr=ready;
while(pr!=NULL)
{
l++;
pr=pr->link;
}
return(l);
}
disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/
{
printf("\n qname \t state \t super \t ndtime \t runtime \n");
printf("|%s\t",pr->name);
printf("|%c\t",pr->state);
printf("|%d\t",pr->super);
printf("|%d\t",pr->ntime);
printf("|%d\t",pr->rtime);
printf("\n");
}
check() /* 建立进程查看函数*/
{
PCB* pr;
printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/
disp(p);
pr=ready;
printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/
while(pr!=NULL)
{
disp(pr);
1 操作系统实验 1
pr=pr->link;
}
}
destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/
{
printf("\n 进程[%s] 已完成.\n",p->name);
free(p);
}
running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/
{
(p->rtime)++;
if(p->rtime==p->ntime)
destroy(); /* 调用 destroy 函数*/
else
{
(p->super)--;
p->state='w';
sort(); /*调用 sort 函数*/
}
}
main() /*主函数*/
{
int len, h=0;
char ch;
input();
len=space();
while((len!=0)&&(ready!=NULL))
{
ch=getchar();
h++;
printf("\n The execute number:%d \n",h);
p=ready;
ready=p->link;
p->link=NULL;
p->state='R';
check();
running();
printf("\n 按任一键继续......");
ch=getchar();
}
printf("\n\n 进程已经完成.\n");
剩余42页未读,继续阅读
资源评论
是空空呀
- 粉丝: 168
- 资源: 3万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功