操作系统实习报告Word格式文档下载.doc
- 文档编号:469794
- 上传时间:2023-04-29
- 格式:DOC
- 页数:23
- 大小:178.50KB
操作系统实习报告Word格式文档下载.doc
《操作系统实习报告Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《操作系统实习报告Word格式文档下载.doc(23页珍藏版)》请在冰点文库上搜索。
调用:
被进程控制块函数和进程就绪函数调用。
2.voidinput()
进程控制块函数
num,i,name,super,needtime
主函数main()调用
3.voiddisp(PCB*pr)
进程显示函数,用于显示当前进程。
name,state,super,needtime,runtime
被进程查看函数check()调用
4.voidcheck()
进程查看函数,用于显示当前运行进程和就绪队列状态。
PCB*prpr=ready
被主函数main()调用
5.voiddestroy()
进程撤消函数,用于当进程运行结束时,撤消进程。
p->
name
被进程就绪函数running()调用
6.voidrunning()
进程就绪函数,当进程运行时间到,置进程就绪状态。
runtime
7.main()
主函数
五、程序流程图
六、实验源程序
#include<
stdio.h>
stdlib.h>
conio.h>
#definegetpch(type)(type*)malloc(sizeof(type))
charname[10];
charstate;
intsuper;
intneedtime;
intruntime;
structpcb*link;
*ready=NULL,*p;
typedefstructpcbPCB;
voidsort()/*建立对进程进行优先级排列函数*/
{
PCB*first,*second;
intinsert=0;
if((ready==NULL)||((p->
super)>
(ready->
super)))/*优先级最大者,插入队首*/
{
p->
link=ready;
ready=p;
}
else/*进程比较优先级,插入适当的位置中*/
first=ready;
second=first->
link;
while(second!
=NULL)
{
if((p->
(second->
super))/*若插入进程比当前进程优先数大,*/
{/*插入到当前进程前面*/
p->
link=second;
first->
link=p;
second=NULL;
insert=1;
}
else/*插入进程优先数最低,则插入到队尾*/
{
first=first->
second=second->
}
if(insert==0)first->
}
intinput()/*建立进程控制块函数*/
inti,num;
printf("
\n请输入进程数?
"
);
scanf("
%d"
&
num);
for(i=0;
i<
num;
i++)
printf("
\n进程号P%d:
\n"
i);
p=getpch(PCB);
\n输入进程名:
scanf("
%s"
p->
name);
\n输入进程优先数:
super);
\n输入进程运行时间:
needtime);
runtime=0;
state='
w'
;
link=NULL;
sort();
/*调用sort函数*/
}
returnnum;
voiddisp(PCB*pr)/*建立进程显示函数,用于显示当前进程*/
\nqname\tstate\tsuper\tndtime\truneedtime\n"
|%s\t"
pr->
|%c\t"
state);
|%d\t"
runtime);
voidcheck()/*建立进程查看函数*/
PCB*pr;
\n****当前正在运行的进程是:
/*显示当前运行进程*/
disp(p);
pr=ready;
\n****当前就绪队列状态为:
/*显示就绪队列状态*/
while(pr!
disp(pr);
pr=pr->
voiddestroy()/*建立进程撤消函数(进程运行结束,撤消进程)*/
printf("
\n进程[%s]已完成.\n"
free(p);
voidrunning()/*建立进程就绪函数(进程运行时间到,置就绪状态*/
(p->
runtime)++;
if(p->
runtime==p->
needtime)
destroy();
/*调用destroy函数*/
else
(p->
super)--;
/*调用sort函数*/
main()/*主函数*/
intlen,h=0;
charch;
len=input();
while((len!
=0)&
&
(ready!
=NULL))
ch=getchar();
h++;
\nTheexecutenumber:
%d\n"
h);
p=ready;
ready=p->
R'
check();
running();
\n按任一键继续......"
\n\n进程已经完成.\n"
ch=getchar();
实习二主存空间的分配和回收
主存储器空间的分配和回收。
通过本实习帮助理解在不同的存储管理方式下应怎样进行存储空间的分配和回收。
第一题:
在可变分区管理方式下采用首次适应算法实现主存分配和回收。
(1)可变分区方式是按作业需要的主存空间大小来分割分区的。
当要装入一个作业时,根据作业需要的主存容量查看是否有足够的空闲空间,若有,则按需分配,否则,作业无法装入。
假定内存大小为128K,初始状态见右图。
空闲区说明表格式为:
起始地址——指出空闲区的起始地址;
长度——一个连续空闲区的长度;
状态——有两种状态,一种是“未分配”状态,另一种是“空表目”状态。
(2)采用首次适应算法分配。
运行时,输入一系列分配请求和回收请求。
四、程序流程
为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:
起址
长度
状态
第一栏
14K
12K
未分配
第二栏
32K
96K
M
空表目
其中:
起址——指出一个空闲区的主存起始地址。
长度——指出从起始地址开始的一个连续空闲的长度。
状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的
分配算法流程图:
回收算法流程图:
#definen10/*假定系统允许的最大作业为,假定模拟实验中n值为10*/
#definem10/*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/
#defineminisize100
struct
{
floataddress;
/*已分分区起始地址*/
floatlength;
/*已分分区长度,单位为字节*/
intflag;
/*已分配区表登记栏标志,用"
0"
表示空栏目*/
}used_table[n];
/*已分配区表*/
/*空闲区起始地址*/
/*空闲区长度,单位为字节*/
/*空闲区表登记栏标志,用"
表示空栏目,用"
1"
表示未分配*/
}free_table[m];
/*空闲区表*/
voidallocate(charJ,floatx)/*采用首次适应算法分配x大小的空间*/
inti,k;
floatad;
k=-1;
m;
i++)/*寻找空间大于xk的最小空闲区登记项k*/
if(free_table[i].length>
=x&
free_table[i].flag==1)
if(k==-1||free_table[i].length<
free_table[k].length)
k=i;
if(k==-1)/*未找到可用空闲区,返回*/
{
无可用空闲区\n"
return;
/*找到可用空闲区,开始分配:
若空闲区大小与要求分配的空间差小于msize大小,则空闲区全部分配;
若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部分分配*/
if(free_table[k].length-x<
=minisize)
free_table[k].flag=0;
ad=free_table[k].address;
x=free_table[k].length;
else
free_table[k].length=free_table[k].length-x;
ad=free_table[k].address+free_table[k].length;
/*修改已分配区表*/
i=0;
while(used_table[i].flag!
=0&
n)/*寻找空表目*/
i++;
if(i>
=n)/*无表目填写已分分区*/
无表目填写已分分区,错误\n"
/*修正空闲区表*/
if(free_table[k].flag==0)
/*前面找到的是整个空闲分区*/
free_table[k].flag=1;
{/*前面找到的是某个空闲分区的一部分*/
free_table[k].length=free_table[k].length+x;
return;
{/*修改已分配表*/
used_table[i].address=ad;
used_table[i].length=x;
used_table[i].flag=J;
}/*主存分配函数结束*/
voidreclaim(charJ)
/*回收作业名为J的作业所占主存空间*/
inti,k,j,s,t;
floatS,L;
/*寻找已分配表中对应登记项*/
s=0;
while((used_table[s].flag!
=J||used_table[s].flag==0)&
s<
n)
s++;
if(s>
=n)/*在已分配表中找不到名字为J的作业*/
找不到该作业\n"
/*修改已分配表*/
used_table[s].flag=0;
/*取得归还分区的起始地址S和长度L*/
S=used_table[s].address;
L=used_table[s].length;
j=-1;
k=-1;
/*寻找回收分区的空闲上下邻,上邻表目k,下邻表目j*/
while(i<
m&
(j==-1||k==-1))
if(free_table[i].flag==1)
if(free_table[i].address+free_table[i].length==S)k=i;
/*找到上邻*/
if(free_table[i].address==S+L)j=i;
/*找到下邻*/
if(k!
=-1)
if(j!
/*上邻空闲区,下邻空闲区,三项合并*/
free_table[k].length=free_table[j].length+free_table[k].length+L;
free_table[j].flag=0;
/*上邻空闲区,下邻非空闲区,与上邻合并*/
free_table[k].length=free_table[k].length+L;
/*上邻非空闲区,下邻为空闲区,与下邻合并*/
free_table[j].address=S;
free_table[j].length=free_table[j].length+L;
/*上下邻均为非空闲区,回收区域直接填入*/
/*在空闲区表中寻找空栏目*/
t=0;
while(free_table[t].flag==1&
t<
m)
t++;
if(t>
=m)/*空闲区表满,回收空间失败,将已分配表复原*/
主存空闲表没有空间,回收空间失败\n"
used_table[s].flag=J;
free_table[t].address=S;
free_table[t].length=L;
free_table[t].flag=1;
}/*主存回收函数结束*/
main()
inti,a;
floatx;
charJ;
/*空闲分区表初始化:
*/
free_table[0].address=10240;
free_table[0].length=102400;
free_table[0].flag=1;
for(i=1;
i++)
free_table[i].flag=0;
/*已分配表初始化:
for(i=0;
n;
used_table[i].flag=0;
while
(1)
选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)\n"
选择功项(0~3):
scanf("
a);
switch(a)
case0:
exit(0);
/*a=0程序结束*/
case1:
/*a=1分配主存空间*/
输入作业名J和作业所需长度x:
"
%*c%c%f"
J,&
x);
allocate(J,x);
/*分配主存空间*/
break;
case2:
/*a=2回收主存空间*/
输入要回收分区的作业名"
%*c%c"
J);
reclaim(J);
/*回收主存空间*/
case3:
/*a=3显示主存情况*/
/*输出空闲区表和已分配表的内容*/
输出空闲区表:
\n起始地址分区长度标志\n"
%6.0f%9.0f%6d\n"
free_table[i].address,free_table[i].length,free_table[i].flag);
按任意键,输出已分配区表\n"
getch();
输出已分配区表:
if(used_table[i].flag!
=0)
%6.0f%9.0f%6c\n"
used_table[i].address,used_table[i].length,used_table[i].flag);
default:
没有该选项\n"
}/*case*/
}/*while*/
}/*主函数结束*/
实习三磁盘存储空间的分配和回收
模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。
磁盘初始化时把磁盘存储空间分成许多块(扇区),这些空间可以被多个用户共享。
用户作业在执行期间常常要在磁盘上建立文件或把已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。
一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间。
怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实习使学生掌握磁盘存储空间的分配和回收算法。
第二题:
用位示图管理磁盘存储空间
(1)为了提高磁盘存储空间的利用率,可在磁盘上组织成链接文件、索引文件,这类文件可以把逻辑记录存放在不连续的存储空间。
为了表示哪些磁盘空间已被占用,哪些磁盘空间是空闲的,可用位示图来指出。
位示图由若干字节构成,每一位与磁盘上的一块对应,“1”状态表示相应块已占用,“0”状态表示该块为空闲。
位示图的形式与实习二中的位示图一样,但要注意,对于主存储空间和磁盘存储空间应该用不同的位示图来管理,绝不可混用。
(2)申请一块磁盘空间时,由分配程序查位示图,找出一个为“0”的位,计算出这一位对应块的磁盘物理地址,且把该位置成占用状态“1”。
假设现在有一个盘组共8个柱面,每个柱面有两个磁道(盘面),每个磁道分成4个物理记录。
那么,当在位示图中找到某一字节的某一位为“0”时,这个空闲块对应的磁盘物理地址为:
柱面号=字节号
位数
4
磁道号=[]
物理记录号={}
(3)归还一块磁盘空间时,由回收程序根据归还的磁盘物理地址计算出归还块在位示图中的对应位,把该位置成“0”。
按照
(2)中假设的盘组,归还块在位示图中的位置计算如下:
字节号=柱面号
位数=磁道号´
4+物理记录号
(4)设计申请一块磁盘空间和归还一块磁盘空间的程序。
要求能显示或打印程序运行前和运行后的位示图;
分配时把分配到的磁盘空间的物理地址显示或打印出来,归还时把归还块对应于位示图的字节号和位数显示或打印出来。
(5)假定已有如表4-1的磁盘空间被占用了,现在要申请五块磁盘空间,运行分配程序,按(4)中要求显示或打印运行的结果。
然后再归还如表4-2的空间,运行回收程序,按(4)中的要求显示或打印运行结果。
表4-1
柱面号
磁道号
物理记录号
1
2
3
表4-2
1.数据结构说明:
/*物理地址*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实习 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)