操作系统指导书新大纲.docx
《操作系统指导书新大纲.docx》由会员分享,可在线阅读,更多相关《操作系统指导书新大纲.docx(32页珍藏版)》请在冰豆网上搜索。
操作系统指导书新大纲
操作系统实验(指导书)
本课程实验共有五个20学时,是提供给大学四年制本科学生学习《计算机操作系统》时使用的,其主要目的是为了让学生能够更好的学习《操作系统》这门课程,并且通过实验使学生们能够更好的理解计算机操作系统所要做的工作及其所做动作的原理。
在这里特别要指出的是,在做实验的时候,一定要仔细、认真。
尤其是在每次做实验之前一定要将本次实验的内容认真的理解清楚,并且要做相应足够的准备工作。
否则是没有一点效果的。
实验要求:
1、在做本实验之前要先阅读完总体的预备知识以及本实验相关的基础知识。
2、本实验要求自己独立的完成,不允许抄袭别人的实验结果。
3、在编写和调试过程中出现的问题最好做一下记录。
4、在实验程序调试完成后,提交给实验教师检查,并由老师给予相应的成绩。
5、实验完成后,要上交实验报告,并附源程序。
注:
操作系统实验报告格式
实验报告格式
1、姓名班级学号
2、实验名称
3、实验目的
4、实验要求
5、实验内容(这个是实验报告的主要部分)
6、实验总结(实验心得)
7、实验报告人报告时间
实验一进程创建与控制
一、实验目的
1、为了更好的配合《操作系统》有关进程管理章节的教学
2、加深和巩固学生对于进程概念的理解,明确进程和程序的区别。
二、实验内容
1、编写程序可以模拟实现对进程的创建,对进程控制块进行初始化并输出相应变量的值。
三、实验要求
实验课时2学时。
要求完成其中至少一个程序。
四、运行结果
五、参考程序
#include"stdio.h"
#definerunning1/*用running表示进程处于运行态*/
#defineaready2/*用aready表示进程处于就绪态*/
#defineblocking3/*用blocking表示进程处于等待态*/
#definesometime5/*用sometime表示时间片大小*/
#definen10/*假定系统允许进程个数为10*/
struct
{
intname;/*进程标识符*/
intstatus;/*进程状态*/
intax,bx,cx,dx;/*进程现场信息,通用寄存器内容*/
intpc;/*进程现场信息,程序计数器内容*/
intpsw;/*进程现场信息,程序状态字寄存器内容*/
intnext;/*下一个进程控制块的位置*/
}pcbarea[n];/*定义模拟进程控制块区域的数组*/
intPSW,AX,BX,CX,DX,PC,TIME;/*模拟寄存器*/
intrun;/*定义指向正在运行进程的进程控制块的指针*/
struct{inthead;inttail;}ready;/*定义指向就绪队列的头指针head和尾指针tail*/
intblock;/*定义指向等待队列的指针*/
intpfree;/*定义指向空闲进程控制块队列的指针*/
sheduling()/*进程调度函数*/
{inti;if(ready.head==-1)/*空闲进程控制块队列为空,退出*/
{printf("无就绪进程\n");
return;}
i=ready.head;/*就绪队列头指针赋给i*/
ready.head=pcbarea[ready.head].next;/*就绪队列头指针后移*/
if(ready.head==-1)ready.tail=-1;/*就绪队列为空,修正尾指针ready.tail*/
pcbarea[i].status=running;/*修改进程控制块状态*/
TIME=sometime;/*设置相对时钟寄存器*//*恢复该进程现场信息:
*/
run=i;
AX=pcbarea[run].ax;BX=pcbarea[run].bx;
CX=pcbarea[run].cx;DX=pcbarea[run].dx;PC=pcbarea[run].pc;PSW=pcbarea[run].psw;/*修改指向运行进程的指针*/
}
/*进程调度函数结束*/
create(intx)/*创建进程*/
{inti;
if(pfree==-1)/*空闲进程控制块队列为空*/
{printf("无空闲进程控制块,进程创建失败\n");
return;}
i=pfree;/*取空闲进程控制块队列的第一个*/
pfree=pcbarea[pfree].next;/*pfree后移*//*填写该进程控制块内容:
*/
pcbarea[i].name=x;pcbarea[i].status=aready;pcbarea[i].ax=x;pcbarea[i].bx=x;
pcbarea[i].cx=x;pcbarea[i].dx=x;
pcbarea[i].pc=x;pcbarea[i].psw=x;
if(ready.head!
=-1){/*就绪队列不空时,挂入就绪队列方式*/
pcbarea[ready.tail].next=i;ready.tail=i;
pcbarea[ready.tail].next=-1;}
else{/*就绪队列空时,挂入就绪队列方式:
*/
ready.head=i;
ready.tail=i;
pcbarea[ready.tail].next=-1;}}/*进程创建函数结束*/
main(){/*系统初始化*/
intnum,i,j;
run=ready.head=ready.tail=block=-1;
pfree=0;
for(j=0;jpcbarea[j].next=j+1;
pcbarea[n-1].next=-1;
printf("输入进程编号(避免编号的冲突,以负数输入结束,最多可以创建10个进程):
\n");
scanf("%d",&num);
while(num>0){create(num);
scanf("%d",&num);}
while(ready.head>=0)
{sheduling();
if(run!
=-1){printf("进程名进程状态寄存器内容:
axbxcxdxpcpsw:
\n");
printf("%4d%10d%3d%3d%3d%3d%3d%3d\n",pcbarea[run].name,pcbarea[run].status,pcbarea[run].ax,pcbarea[run].bx,pcbarea[run].cx,pcbarea[run].dx,pcbarea[run].pc,pcbarea[run].psw);
}}}/*main()结束*/
实验二进程调度算法的实现
一、实验目的
1、为了更好的配合《操作系统》有关进程调度章节的教学。
2、加深和巩固学生对于进程调度的了解和掌握。
3、使学生通过本实验能够初步的了解和掌握进程调度的整个过程及常用算法。
4、提高学生的上机和编程过程中处理具体问题的能力
二、实验内容
1、学习进程调度的基本方法。
2、学习时间片轮转调度算法、先来先服务算法、最短作业优先算法。
3、计算出不同时间片是多进程调度的完成时间、周转时间。
给定进程A,B,C,D,E,每个进程的运转时间4,3,4,2,4,每个进程的到达时间1,2,3,4,5;
(1)进行时间片轮转调度算法的模拟;
(2)时间片q=1,轮转调度算法的模拟并计算周转时间、平均周转时间、带权周转时间。
(3)时间片q=4,轮转调度算法的模拟并计算周转时间、平均周转时间、带权周转时间。
4、按照一定的算法选取进程;
(1)5个进程各自运行所需要的时间及存储空间,即A,B,C,D,E,每个进程的运转时间4,3,5,2,4,每个进程的到达时间0,1,2,3,4;
(2)进行进程调度算法的模拟;
(3)按的原则进行调度;根据运行情况计算周转时间、平均周转时间、带权周转时间。
(4)按的原则进行调度;根据运行情况计算周转时间、平均周转时间、带权周转时间。
5、画出调度图或表。
三、实验要求
实验课时2学时。
要求画出进程调度图或表,并比较算法的性能,算法至少编写完成先来先服务。
四、运行结果
1.先来先服务算法
2.短作业优先
五、参考程序
先来先服务算法程序:
//结束输入使用###,没有进行异常处理
#include
classpcb
{
public:
charname;
intcometime;
intruntime;
};
voidmain()
{
pcbp[10];
intworkstart[10];
intworkend[10];
inti=0;
charn;
intc;
intr;
intj;
cout<<"请输入进程"<
"<cin>>n>>c>>r;
while(n!
='#')
{
p[i].name=n;p[i].cometime=c;p[i].runtime=r;
if(i==0)
{
workstart[i]=p[i].cometime;
workend[i]=p[i].runtime+p[i].cometime;
}
else
{
if(p[i].cometime>=workend[i-1])
{
workstart[i]=p[i].cometime;
workend[i]=p[i].runtime+p[i].cometime;
}
else
{
workstart[i]=workend[i-1];
workend[i]=workend[i-1]+p[i].runtime;
}
}
i++;
cout<<"请输入进程"<
"<cin>>n>>c>>r;
}
cout<<"先来先服务的调度顺序为:
"<for(j=0;j
cout<<"进程名:
"<
"<}
实验三存储器管理
一、实验目的
1、为了更好的配合《操作系统》有关存储器管理章节的教学。
2、加深和巩固学生对动态分区存储管理方式的了解和掌握。
3、提高学生的上机和编程过程中处理具体问题的能力。
二、实验内容
设计一个模拟存储器管理程序,该程序可完成对存储空间的管理,具有动态分配内存,回收内存,以及拼接存储空间的功能。
已知:
内存空间共有10000个存储单元,实现动态分区分配。
在实现可变分区分配存储管理方式时,要解决以下问题。
1、分区分配中所用到的数据结构。
空闲分区表,空闲分区链。
2、分区分配算法。
首次适应算法,循环首次适应算法,最佳适应算法。
3、分区的分配与回收操作。
分配的流程。
P142
回收的流程。
4、回收后空闲空间的拼接。
三、实验要求
实验课时4学时。
要求至少选用一种分配算法,完成分区的分配与回收,并在实验报告上画出测试数据的分配与回收情况图。
回收后空闲空间的拼接可视课时的多少选作。
要求输出内存使用情况和空闲情况。
内存情况输出的格式为:
numaddressstatussize
num内存分区号
address该分区的首地址
status如果已分配为1,空闲为0
size分区长度
也可以做出窗口界面,演示分配回收的过程。
四、运行界面
五、参考程序
首次适应算法:
源程序:
#include
#definenull0
#definebegin0
#definev10000
#definek100
#definex100
structtt
{structtt*front,*next;
longaddr;
longcd;
ints;
};
structtta[x],*f,*c,*n,*head,*q;
longresult,temp,longc,u_size;
inti,f0,choice,j,f1;
fenpei()
{c=head;
result=-1;
while((c!
=null)&&(result==-1))
{longc=c->cd;
if((longcs==1))
c=c->next;
else{longc=longc-u_size;
if(longc<=k)
{c->s=1;
result=c->addr;
}
else
{f=c;
q=head;
while(q->cd!
=0)
q++;
c=q;
n=f->next;
if(n!
=null)
n->front=c;
c->front=f;
c->next=f->next;
c->addr=f->addr+u_size;
c->cd=f->cd-u_size;
c->s=0;
f->cd=u_size;
f->s=1;
f->next=c;
result=f->addr;
}
}
}
}
huishou()
{c=head;
f0=0;
while((c!
=null)&&(f0==0))
{if((c->addr==temp)&&(c->addr!
=0))
{f0++;}
elsec=c->next;
}
if(c!
=null)
{f=c->front;
if(f->s==0)
{n=c->next;
if(n!
=null)
n->front=f;
f->cd=f->cd+c->cd;
f->next=c->next;
c->cd=0;
c=f;
}
n=c->next;
if((n!
=null)&&(n->s==0))
{f=n->next;
if(f!
=null)
f->front=c;
c->cd=c->cd+n->cd;
c->next=n->next;
n->cd=0;
}
c->s=0;
printf("huishousuccess\n");
printf("\n");
}
if(f0==0)
printf("addresserror\n");
printf("\n");
}
pinjie()
{c=head;
f1=0;
while(f1==0)
{
while(c->s==1)
c=c->next;
f=c->front;
n=c->next;
if(n==null)
f1++;
while((n!
=null)&&(n->s==1))
n=n->next;
if(n!
=null)
{f->next=c->next;
c->next->front=f;
f=f->next;
while(f!
=n)
{f->addr-=c->cd;
f=f->next;}
n->addr-=c->cd;
n->cd+=c->cd;
c->cd=0;
c=n;
}
elsef1++;
}
}
main()
{
for(i=0;ia[i].cd=0;
head=a;
head->front=head;
head->next=null;
head->addr=begin;
head->cd=v;
head->s=0;
printf("iffirstuse,pleasechoice0\n");
printf("andthefirstwillbeusedtosystem,can'thuishou\n");
printf("\n");
for(j=0;j<100;j++)
{printf("pleaseinputyourchoice\n");
printf("0:
fenpei\n");
printf("1:
huishou\n");
printf("2:
pinjie\n");
printf("3:
exit\n");
scanf("%d",&choice);
if(choice==3)
break;
if(choice==0)
{printf("plesaeinputsize\n");
scanf("%d",&u_size);
fenpei();
if(result==-1)
{printf("fail\n");
printf("\n");}
else
{printf("success,%d\n",result);
printf("\n");}
}
else{if(choice==1)
{printf("pleaseinputaddress\n");
scanf("%d",&temp);
huishou();}
elseif(choice==2)
pinjie();
}
c=head;
i=1;
printf("num,addr,status,size\n");
while(c!
=null)
{printf("%d,%d,",i,c->addr);
printf("%d,%d\n",c->s,c->cd);
c=c->next;
i++;
}}
printf("\n");
printf("\n");
}
实验四文件管理
一、实验目的
1、为了更好的配合《操作系统》有关各章节的教学
2、加深和巩固学生对于操作系统的了解和掌握
3、提高学生的上机和编程过程中处理具体问题的能力
二、实验内容
使用位示图实现文件存储空间管理:
分配盘块、回收盘块、盘块一致性检查。
初始化位示图后,按需要分配盘块、回收盘块并完成盘块一致性检查。
分别调用盘块分配函数,盘块回收函数,盘块一致性检查函数并打印显示分配情况。
盘块一致性检查可选作。
三、运行结果
四、源程序指导
#include
#include
#include
#definemax6
#defineNmax*max
structblock
{
intblocknumber;
intindexblock[100];
}block[100];
structfile
{
charname[10];
intlength;
}file[100];
intbitvector[max][max];
intfat[N+1];
intm=0;
voidallocate(structfilef)//文件分配
{
file[m]=f;
intk=0,l=0;
for(inti=0;i{
for(intj=0;j{
if(bitvector[i][j]==0&&k{
bitvector[i][j]=1;
block[m].indexblock[l]=i*max+j+1;
fat[i*max+j+1]=1;
l++;k++;
}
elseif(bitvector[i][j]==0&&k==file[m].length)
{
bitvector[i][j]=1;
block[m].blocknumber=i*max+j+1;
fat[i*max+j+1]=1;
k++;
}
}
}
m++;
}
voidfree(structfilef);//空闲块的回收
voidprintcontents();//显示文件内
voidmain()
{
cout<<"1.对已分配盘块采用索引方式管理"<<<"2.空闲盘块采用位示图管理"<<<"3.实现分配,回收"<for(inti=0;i<100;i++)
{
file[i].length=0;
}//所有文件初始化
for(i=0;i{
fat[N]=0;
}
cout<<"初始化位示图..."<for(i=0;i{
for(intj=0;jbitvector[i][j]=0;
}
printbitvector();
inttemp;
while
(1)
{
cout<<"1.创建文件"<<cin>>temp;
structfilef;
if(temp==1)
{
cout<<"请输入文件名:
"<cin>>f.name;
cout<<"请输入文件长度:
"<cin>>f.length;
intn=0;
for(inti=0;i{
for(intj=0;j{
if(bitvector[i][j]==0)
n++;
}
}//当前空闲盘块数
if(n>=f.length+1)
allocate(f);
else
cout<<"磁盘空间不足,分配失败"<}
elseif(temp==2)
{
cout<<"请输入文件名:
"<cin>>f.name;
free(f);
}
elseif(temp==3)
{
printbitvector();
}
elseif(temp==4)
{
printcontents();
}
else
exit(0);
}
}
实验五设备的分配与回收
一、实验目的
1、为了更好的配合《操作系统》有关设备管理章节的教学。
2、加深和巩固学生对设备管理方式的了解和掌握。
3、提高学生