计算机操作系统课程设计00001文档格式.docx
- 文档编号:17031806
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:24
- 大小:547.86KB
计算机操作系统课程设计00001文档格式.docx
《计算机操作系统课程设计00001文档格式.docx》由会员分享,可在线阅读,更多相关《计算机操作系统课程设计00001文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
voiddeltask(constmemoryspaceL);
//删除作业
voidsetfree(memoryspace&
//回收空闲空间
五、程序运行结果
任务二、单处理机系统的进程调度
1、加深对进程概念的理解,明确进程和程序的区别
2、深入了解系统如何组织进程,创建进程
3、进一步认识如何实现处理机调度。
从下面调度算法中,选择一个调度算法来实现进程调度:
1、先来先服务调度算法
2、优先数调度算法;
3、时间片轮法调度算法
4、多级反馈队列轮转调度算法
四、程序清单
1.进程调度函数
scheduling(){//进程调度函数
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;
//设置相对时钟寄存器
//恢复该进程现场信息
AX=pcbarea[run].ax;
BX=pcbarea[run].bx;
CX=pcbarea[run].cx;
DX=pcbarea[run].dx;
PC=pcbarea[run].pc;
PSW=pcbarea[run].psw;
run=i;
}//进程调度函数结束
2.进程创建函数
create(intx)//进程创建函数
{
if(pfree==-1)//空闲进程控制块队列为空
{
无空闲进程控制块,进程创建失败\n"
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;
pcbarea[ready.tail].next=-1;
}//进程创建函数结束
任务三、基本存储器管理
一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。
当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。
当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。
主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在不同的存储管理方式下怎样实现主存的分配和回收。
从下两种存储管理方式的主存分配和回收中,选择一种管理方式来实现本次实验任务:
1、在可变(动态)分区管理方式下,采用最先适应算法。
2、在分页式管理方式下,采用位示图来表示主存的分配情况和回收情况。
三、程序框图
1.主存分配函数
voidallocate(charJ,floatxk){/*给J作业,采用最佳分配算法分配xk大小的空间*/
inti,k;
floatad;
k=-1;
for(i=0;
i<
m;
i++)/*寻找空间大于xk的最小空闲区登记项k*/
if(free_table[i].length>
=xk&
&
free_table[i].flag==1)
if(k==-1||free_table[i].length<
free_table[k].length)
k=i;
if(k==-1)/*未找到可用空闲区,返回*/{
printf("
无可用空闲区\n"
}/*找到可用空闲区,开始分配:
若空闲区大小与要求分配的空间差小于minisize大小,则空闲区全部分配;
若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部分分配*/
if(free_table[k].length-xk<
=minisize){
free_table[k].flag=0;
ad=free_table[k].address;
xk=free_table[k].length;
}
else{
free_table[k].length=free_table[k].length-xk;
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;
else{/*前面找到的是某个空闲分区的一部分*/
free_table[k].length=free_table[k].length+xk;
return;
}else{/*修改已分配表*/
used_table[i].address=ad;
used_table[i].length=xk;
used_table[i].flag=J;
}/*主存分配函数结束*/
2.主存回收函数
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;
i=0;
/*寻找回收分区的空闲上下邻,上邻表目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;
/*找到下邻*/
}i++;
if(k!
=-1)
if(j!
=-1){/*上邻空闲区,下邻空闲区,三项合并*/
free_table[k].length=free_table[j].length+free_table[k].length+L;
free_table[j].flag=0;
else/*上邻空闲区,下邻非空闲区,与上邻合并*/
free_table[k].length=free_table[k].length+L;
else
=-1){/*上邻非空闲区,下邻为空闲区,与下邻合并*/
free_table[j].address=S;
free_table[j].length=free_table[j].length+L;
else/*上下邻均为非空闲区,回收区域直接填入*/
{/*在空闲区表中寻找空栏目*/
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;
}/*主存回收函数结束*/
任务四、请求分页存储管理(虚拟存储)
一、目的
通过请求分页存储管理的设计,让学生了解虚拟存储器的概念和实现方法。
进行运行时不需要将所有的页面都调入内存,只需将部分调入内存,即可运行,在运行的过程中若要访问的页面不在内存时,则需求有请求调入的功能将其调入。
假如此时若内存没有空白物理块,则通过页面置换的功能将一个老的不用的页面淘汰出来,其中淘汰的算法有多种。
二、要求
模拟仿真请求分页调度算法,其中淘汰的算法可选下列其一
1、先进先出算法
2、最近最久算法
3、CLOCK算法
三、程序清单
voidInit()//初始化页框
voidOutPut()//输出
voidFIFO()//FIFO算法
voidLRU()//最近最不常用调度算法(LFU)
voidLFU(){}
voidNUR(){}
voidYourChoice(intchoice)
四、程序框图
任务五、死锁的避免
在多道程序系统中,多个进程的并发执行来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。
所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局(DeadlyEmbrace),当进程处于这种状态时,若无外力作用,他们都无法在向前推进。
我们可以在分配资源时加上限制条件就可以预防死锁,但是,在每一种预防死锁的方法之中,都施加了较强的限制条件;
而在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
利用银行家算法来避免死锁的发生
1、建立银行家算法的数据结构描述;
2、将初始数据放在文件中,算法运行时读出;
3、对给定的资源请求,使用算法判断是否允许;
4、输出每次判断产生的执行序列;
1.银行家算法
voidBankerArithmetic:
:
Init(inta,intb){
inti,j;
100;
i++)
Sign[i]=-1;
Available=newint[b];
//Availablede的申请
Left=newint[b];
//Left的申请
Allocation=newint*[a];
//Allocation的申请
a;
Allocation[i]=newint[b];
Need=newint*[a];
//Need的申请
Need[i]=newint[b];
cout<
<
"
请输入可用资源Available:
endl;
b;
cin>
>
Available[i];
请输入进程号:
Number[i];
请输入分配资源矩阵Allocation:
'
('
a<
'
b<
)'
for(j=0;
j<
j++)
cin>
Allocation[i][j];
cout<
请输入仍需要资源矩阵Need:
for(i=0;
for(j=0;
cin>
Need[i][j];
//计算剩余的资源
for(i=0;
i++){
Left[i]=Available[i];
j=0;
while(j<
m){
for(i=0;
n;
Left[j]-=Allocation[i][j];
j++;
}
2.安全处理
intBankerArithmetic:
Safe(intgrac)//看是或安全
inti,j,temp;
if(Sign[i]!
=1){
temp=1;
j++){
if(Left[j]>
=Need[i][j])
temp*=1;
else
temp*=0;
}
if(temp==1)
break;
ID=i;
Sign[i]=1;
Progress[grac]=ID;
if(temp)
returnID;
else
return-1;
Bank(){
for(inti=0;
Left[i]=Left[i]+Allocation[ID][i];
Show(){
进程AllocationNeed\n"
;
i++){
cout<
Number[i]<
"
cout<
"
Left[i]<
cout<
}
输入:
输出:
任务六、磁盘空间的分配与回收
三、目的:
磁盘初始化时把磁盘存储空间分成许多块(扇区),这些空间可以被多个用户共享。
用户作业在执行期间常常要在磁盘上建立文件或已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。
。
一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间。
怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实验使学生掌握磁盘存储空间的分配和收回算法。
四、要求:
模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。
从下题目中选择一题来实现设备的管理:
(1)连续的磁盘存储空间的分配和回收。
(2)用位示图管理磁盘存储空间。
(3)模拟UNIX系统的空闲块组链接法,实现磁盘存储空间的管理。
1.showbitmap函数
voidshowbitmap(void){
inti=0;
//用来和位示图bitmap相与得到某位的状态
当前系统磁盘位示图(0表示块可用):
\n"
for(;
COUNT;
i++){
if(0==i%8){
%d块:
%d\t"
i+1,bitinfo->
bitmap[i]);
system("
pause"
2.diskallocate函数(分配物理块给)
voiddiskallocate(void){//由用户输入需要的物理块数:
intneednum;
inti;
intbusy=0;
charfilestor[32];
输入需要分配的块数:
scanf("
%d"
&
neednum);
输入文件名:
%s"
filestor);
for(i=0;
busy=busy+bitinfo->
bitmap[i];
if(64-busy<
neednum){
没有足够的空闲磁盘,分配失败!
else{
开始分配...\n"
for(i=0;
i<
i++){
if(0==bitinfo->
bitmap[i]){
分配块物理地址为:
第%d个柱面,\t第%d个磁道,\t第%d个扇区\n"
i/8+1,i%8/4,(i%8)%4);
bitinfo->
bitmap[i]=1;
strcpy(bitinfo->
filename[i],filestor);
neednum--;
if(0==neednum){
break;
分配成功!
3.diskreturn函数
voiddiskreturn(void){
charfilereturn[32];
输入要回收的文件名"
filereturn);
if(0!
=strcmp(filereturn,bitinfo->
filename[i])){
continue;
bitmap[i]=0;
回收位示图中第%d字节的第%d位的物理块\n"
i/8+1,i%8+1);
查看磁盘位示图:
申请分配磁盘空间:
申请回收磁盘空间:
任务七、文件管理
通过一个简单的多用户文件系统的设计,加深理解文件系统的内部功能及内部实施过程。
设计并实现一个用户的二级文件系统。
要求作到以下几点:
可以实现下列几条命令(至少4条)
命令单词
命令含义
login
用户登录
dir
列文件目录
create
创建文件
delete
删除文件
open
打开文件
close
关闭文件
read
读文件
write
写文件
2、列文件目录时要列出文件名,物理地址,保护码和文件长度。
3、源文件可以进行读写保护。
三、功能框图
1.Help功能函数
voidhelp(void){
命令一览"
create:
建立文件。
read:
读取文件。
write:
写入文件,支持多线程"
del:
删除文件。
mkdir:
建立目录。
cd:
切换目录。
logout:
退出登录。
2.Createroot函数(创建文件存储结点)
voidcreateroot(){
recent=root=initfile("
/"
1);
root->
parent=NULL;
child=NULL;
prev=root->
next=NULL;
strcpy(para,"
3.功能函数
intmkdir();
intcreate();
intdir();
intread();
intwrite(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 操作系统 课程设计 00001