操作系统实验C语言模拟操作系统运行课程设计Word文档格式.docx
- 文档编号:16759273
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:45
- 大小:660.87KB
操作系统实验C语言模拟操作系统运行课程设计Word文档格式.docx
《操作系统实验C语言模拟操作系统运行课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统实验C语言模拟操作系统运行课程设计Word文档格式.docx(45页珍藏版)》请在冰豆网上搜索。
3.时间片轮转算法完成进程的调度
3.1设计要求:
(1)进程的调度采用时间片轮转算法。
(2)设计三个链队列,分别用来表示运行队列、就绪队列和完成队列。
(3)用户输入进程标识符以及进程所需的时间,申请空间存放进程PCB信息。
(4)输出的格式和上面的运行结果分析中的格式相同。
时间片轮转调度,具体做法是调度程序每次把CPU分配给就绪队列首进程使用一个时间片。
当这个时间片结束时,就强迫一个进程让出处理器,让它排列到就绪队列的尾部,等候下一轮调度。
实现这种调度要使用一个间隔时钟。
当一个进程开始运行时,就将时间片的值置入间隔时钟内,当发生间隔时钟中断时,就表明该进程连续运行的时间已超过一个规定的时间片。
此时,中断处理程序就通知处理器调度进行处理器的切换工作。
3.2.时间片轮转算法主要思想:
在计算机中系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。
时间片的大小从几ms到几百ms。
当执行的时间片用完,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;
然后再把处理机分配给就绪队列中给定的时间内均能获得一时间片的处理机执行时间。
3.3算法的实现
1.数据结构及变量说明
typedefstructpcb
{
//进程标识符
intpArriveTime;
//到达时间
intpRunTime;
//估计运行时间
//进程时间轮转时间片
//进程占用CPU时间
//进程到完成还要的时间
//计数器
//进程的状态
structpcb*next;
//链指针
PCB*finish,*ready,*tail,*run;
//队列指针
PCBhead_input;
intN;
//进程数
2.完成功能的主要函数
voidroundrun()//时间片轮转法
{}函数
3.时间片轮转的主要算法功能及注释:
voidinsert2(PCB*p2)//轮转法插入函数
tail->
next=p2;
//将新的PCB插入在当前就绪队列的尾
tail=p2;
p2->
next=NULL;
}
voidcreate2()//轮转法创建进程PCB
PCB*p;
inti,time,n;
charna[10];
ready=NULL;
finish=NULL;
run=NULL;
printf("
输入进程名及所需时间\n"
);
for(i=1;
i<
=N;
i++)
{
p=(PCB*)malloc(sizeof(PCB));
scanf("
%s"
na);
%d"
&
time);
strcpy(p->
name,na);
p->
cputime=0;
needtime=time;
count=0;
state='
W'
;
round=3;
if(ready!
=NULL)
insert2(p);
else
next=ready;
ready=p;
tail=p;
}
system("
cls"
轮转法输出\n"
************************************************\n"
prt();
//输出进程PCB信息
run=ready;
//将就绪队列的第一个进程投入运行
ready=ready->
next;
run->
R'
while(run!
cputime=run->
cputime+1;
needtime=run->
needtime-1;
count=run->
count+1;
if(run->
needtime==0)//运行完将其变为完成态,插入完成队列
next=finish;
finish=run;
F'
firstin();
//就绪对列不空,将第一个进程投入运行
count==run->
round)//如果时间片到
//计数器置0
=NULL)//如就绪队列不空
//将进程插入到就绪队列中等待轮转
insert2(run);
//将就绪对列的第一个进程投入运行
//输出进程信息
4.时间片算法主要流程图如下:
5.时间片算法运行结果分析如下:
4.用先来先服务算法完成进程的调度
4.1设计要求:
(1)进程的调度采用先来先服务算法。
(3)用户输入进程标识符以及进程所需的时间,申请空间存放进程PCB信息。
先来先服务:
按照进程进入就绪队列的先后次序来分配处理器。
先进入就绪队列的进程优先被挑选,运行进程一旦占有处理器将一直运行下去直到运行结束或被阻塞,这是一种非剥夺式调度。
4.2先来先服务调度算法主要思想:
此算法既可用于作业调度,也歌词用于进程调度。
当作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源,创建进程,然后放入就绪队列。
在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。
该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
4.3算法的实现
voidExecProcessList(){}//先来先服务函数
3.先来先服务的主要算法功能及注释:
voidExecProcessList()
run=head_input.next;
=NULL)
{
//run指向对头的下一个进程
printf("
开始运行正在运行已经运行时间剩余时间等待中的进程已结束进程\n"
for(intj=0;
j<
(run->
pRunTime)/1000;
j++)//输出每次运行的统计信息
if(0==j)
%s\n"
run->
name);
//到达进程开始执行
}
%s%d%d"
name,j+1,(run->
pRunTime/1000)-(j+1));
ready=run->
//判断此时还有哪些进程在队列里面
while(ready!
%s"
ready->
\n"
C'
//将进城状态设置为执行完的状态
%s\n"
ready=run;
//将run指向下一个元素
run=run->
head_input.next=run;
deleteready;
//将此进程从进程队列里面删除
}
4.先来先服务算法主要流程图如下:
5.先来先服务运行结果如下:
三:
主存空间的回收与分配
主存是中央处理器能直接存取指令和数据的存储器,能否合理地利用主存,在很大程度上将影响到整个计算机系统的性能。
主存分配是指在多道作业和多进程环境下,如何共享主存空间。
主存回收是指当作业执行完毕或进程运行结束后将主存空间归还给系统。
主存分配与回收的实现是与主存储器的管理方式有关。
本次设计主要是为了帮助学生深入理解主存空间的分配与回收的几种算法。
(1)掌握最先适应分配算法
(2)掌握最优适应分配算法(3)掌握最坏适应分配算法
用户提出内存空间请求,系统根据申请者要求,按照最先适应分配算法的分配策略分析内存空间的使用情况,找出能满足请求的空闲区,分给申请者,当程序执行完毕时,系统要收回它所占用的内存空间。
建立空闲数据文件,空闲区数据文件包括若干行,每行有两个字段:
起始地址、内存块大小(均为整数),各字段以逗号隔开。
下面是一个空闲区数据文件的示例:
0,10
10,08
18,10
28,06
34,10
44,09
读取空闲区数据文件,建立空闲区表并在屏幕上显示空闲内存状态,空闲区表记录了可供分配的空闲内存的起始地址和大小,用标志位指出该分区是否是未分配的空闲区。
接收用户的内存申请,格式为:
作业名、申请空间的大小。
按照内存分配算法中的一种方法选择一个空闲区,分割并分配,修改空闲区表,填写内存已分配区表(起始地址、长度、标志位),其中标志位的一个作用是指出该区域分配给哪个作业。
进程结束后回收内存。
本次设计要求完成如下算法:
(1)设计一个内存分配回收的程序使用最先适应分配算法
(2)设计一个内存分配回收的程序使用最优适应分配算法
(3)设计一个内存分配回收的程序使用最坏适应分配算法
用户提出内存空间请求,系统根据申请者要求,选择上述算法的一种分配策略分析内存空间的使用情况,找出合适的空闲区,分给申请者,当进程执行完毕时,系统收回它所占用的内存空间。
创建空闲区表:
空闲区表的结构如下:
typedefstructnode{
intstart;
intlength;
chartag[20];
}job;
3.算法的设计实现
3.1设计实现:
constintMAXJOB=100;
//定义表最大记录数
jobfrees[MAXJOB];
//定义空闲区表
intfree_quantity;
joboccupys[MAXJOB];
//定义已分配区表
intoccupy_quantity;
initial()初始化
readData()从文本文件读取数据
sortearliest()最先适应算法排序
earliest()实现最先适应算法
sortbest()最佳适应算法排序
bestMethod()实现最佳适应算法
sortbad()最坏适应算法排序
BadMethod()实现最坏适应算法
finished()实现主存回收
view()显示
3.2.最先适应算法的功能及注释
//声明变量
charjob_name[20];
intjob_length;
inti,j,flag,t;
//输入进程名和空间大小
cout<
<
"
请输入新申请内存空间的作业名和空间大小:
cin>
>
job_name;
job_length;
flag=0;
//标志变量
for(i=0;
free_quantity;
i++){
if(frees[i].length>
=job_length){//空闲区长度是否大于进程所需空间
flag=1;
}}
if(flag==0){//空闲区长度小于进程所需空间
endl<
Sorry,当前没有能满足你申请长度的空闲内存,请稍候再试"
endl;
else{//空闲区长度大于进程所需空间,从首地址开始查询,找到大于进程长度的及分配给进程
t=0;
i=0;
while(t==0){
if(frees[i].length>
=job_length){
t=1;
}
i++;
i--;
occupys[occupy_quantity].start=frees[i].start;
strcpy(occupys[occupy_quantity].tag,job_name);
occupys[occupy_quantity].length=job_length;
occupy_quantity++;
job_length){
frees[i].start+=job_length;
frees[i].length-=job_length;
else{
for(j=i;
free_quantity-1;
j++){
frees[j]=frees[j+1];
free_quantity--;
最先适应算法的主要流程图如下:
最先适应算法运行结果如下:
3.3.最佳适应算法的实现
//名字
intjob_length;
//长度
inti,j;
intmax=0,min=0,maxx;
cout<
cin>
//查找最合适的空闲区
for(i=0;
i++){
for(j=0;
i;
j++){
if(frees[j].length<
=frees[i].length)
max=i;
elsemax=j;
if(frees[j].length>
min=i;
elsemin=j;
if(frees[min].length<
=job_length&
&
frees[max].length>
=job_length){
maxx=i;
}}
if(frees[maxx].length<
job_length){//没有能满足的空闲区
}else{//符合要求,给进程分配空间
occupys[occupy_quantity].start=frees[maxx].start;
if(frees[maxx].length>
job_length){
frees[maxx].start+=job_length;
frees[maxx].length-=job_length;
else{
for(j=maxx;
frees[j]=frees[j+1];
free_quantity--;
最优流程图:
最佳算法运行结果如下:
3.4.最坏适应算法的实现
intmax;
//找出空闲区最大的
frees[i].length)
max=j;
}}
if(frees[max].length<
job_length){//如果最大空闲区都臂进程空间小,则不满足要求
}else{//满足要求,给进程分配空间
occupys[occupy_quantity].start=frees[max].start;
if(frees[max].length>
job_length){
frees[max].start+=job_length;
frees[max].length-=job_length;
for(j=max;
最坏流程图:
最坏算法运行结果如下:
3.5.主存回收算法的实现
inti,j,flag,p=0;
//输入要回收的进程名
请输入要撤消的作业名:
flag=-1;
//找到指定进程
occupy_quantity;
if(!
strcmp(occupys[i].tag,job_name)){
flag=i;
start=occupys[i].start;
length=occupys[i].length;
if(flag==-1){
没有这个作业名"
//加入空闲表
if((frees[i].start+frees[i].length)==start){
if(((i+1)<
free_quantity)&
(frees[i+1].start==start+length)){
frees[i].length=frees[i].length+frees[i+1].length+length;
for(j=i+1;
frees[j]=frees[j+1];
free_quantity--;
p=1;
else{
frees[i].length+=length;
if(frees[i].start==(start+length)){
frees[i].start=start;
frees[i].length+=length;
p=1;
}}
if(p==0){
frees[free_quantity].start=start;
frees[free_quantity].length=length;
free_quantity++;
//删除分配表中的该作业
for(i=flag;
occupys[i]=occupys[i+1];
occupy_quantity--;
主存回收的流程图如下:
回收算法运行结果如下:
四:
模拟DOS文件的建立和使用
磁盘文件是磁盘上存储的重要信息,通过本实验模拟DO
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 语言 模拟 运行 课程设计