计算机操作系统课程设计00001.docx

上传人:b****4 文档编号:4115792 上传时间:2022-11-28 格式:DOCX 页数:24 大小:547.86KB
下载 相关 举报
计算机操作系统课程设计00001.docx_第1页
第1页 / 共24页
计算机操作系统课程设计00001.docx_第2页
第2页 / 共24页
计算机操作系统课程设计00001.docx_第3页
第3页 / 共24页
计算机操作系统课程设计00001.docx_第4页
第4页 / 共24页
计算机操作系统课程设计00001.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

计算机操作系统课程设计00001.docx

《计算机操作系统课程设计00001.docx》由会员分享,可在线阅读,更多相关《计算机操作系统课程设计00001.docx(24页珍藏版)》请在冰豆网上搜索。

计算机操作系统课程设计00001.docx

计算机操作系统课程设计00001

计算机操作系统课程设计

操作系统课程设计报告

 

学校:

景德镇陶瓷学院

所属学院:

信息工程学院

系:

计算机系

学号:

201110510216

姓名:

吴俊贤

指导老师:

李娟、胡静芳

日期:

2014-1-2

 

1、进程创建、控制与撤消………………………………3

2、单处理机系统的进程调度……………………………4

3、基本存储器管理………………………………………7

4、请求分页存储管理(虚拟存储)……………………12

5、死锁的避免……………………………………………14

6、磁盘空间的分配与回收………………………………19

7、文件管理………………………………………………24

8、实验小结………………………………………………27

 

任务一、进程创建、控制与撤消

一、目的:

通过进程的创建和控制的设计来达到如下目的:

1、加深对进程概念的理解,明确进程和程序的区别;

2、进一步认识并发执行的概念,区别顺序执行和并发执行;

3、分析进程争用临界资源的现象,学习解决进程互斥的方法;

二、要求:

在WINDOWS环境下模拟实验:

一、编写一程序,来模拟进程的创建和撤消,要求通过终端键盘输入三、四作业的名称、大小、优先级等。

系统为它创建进程,并把进程控制块PCB的内容送到终端显示器上输出。

二、同时模拟内存空间为作业分配内存空间,并把结果用图形形象地表示出来,同样通过终端输出。

按进程的优先级的顺序撤消进程,同时通过终端显示PCB的撤消过程和内存的释放过程。

三、程序框图:

四、程序清单

voidInit(memoryspace&L,intsize);//初始化空间段

voidchoice(memoryspace&L);//选择操作类型

voidAdd(memoryspace&L);//添加作业

voidDisplay(constmemoryspaceL);//显示作业

voiddeltask(constmemoryspaceL);//删除作业

voidsetfree(memoryspace&L);//回收空闲空间

五、程序运行结果

任务二、单处理机系统的进程调度

一、目的:

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)//进程创建函数

{

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;

}

}//进程创建函数结束

五、程序运行结果

任务三、基本存储器管理

一、目的:

一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。

当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。

当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。

主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在不同的存储管理方式下怎样实现主存的分配和回收。

二、要求:

从下两种存储管理方式的主存分配和回收中,选择一种管理方式来实现本次实验任务:

1、在可变(动态)分区管理方式下,采用最先适应算法。

2、在分页式管理方式下,采用位示图来表示主存的分配情况和回收情况。

三、程序框图

四、程序清单

1.主存分配函数

voidallocate(charJ,floatxk){/*给J作业,采用最佳分配算法分配xk大小的空间*/

inti,k;floatad;k=-1;

for(i=0;i

if(free_table[i].length>=xk&&free_table[i].flag==1)

if(k==-1||free_table[i].length

k=i;

if(k==-1)/*未找到可用空闲区,返回*/{

printf("无可用空闲区\n");

return;}/*找到可用空闲区,开始分配:

若空闲区大小与要求分配的空间差小于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&&i

i++;

if(i>=n){/*无表目可填写已分配分区*/

printf("无表目填写已分分区,错误\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;}

return;}/*主存分配函数结束*/

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

s++;

if(s>=n)/*在已分配表中找不到名字为J的作业*/{

printf("找不到该作业\n");

return;}/*修改已分配表*/

used_table[s].flag=0;/*取得归还分区的起始地址S和长度L*/

S=used_table[s].address;

L=used_table[s].length;

j=-1;k=-1;i=0;/*寻找回收分区的空闲上下邻,上邻表目k,下邻表目j*/

while(i

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

if(j!

=-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

t++;

if(t>=m){/*空闲区表满,回收空间失败,将已分配表复原*/

printf("主存空闲表没有空间,回收空间失败\n");

used_table[s].flag=J;

return;}

free_table[t].address=S;

free_table[t].length=L;

free_table[t].flag=1;}

return;}/*主存回收函数结束*/

五、程序运行结果

任务四、请求分页存储管理(虚拟存储)

一、目的

通过请求分页存储管理的设计,让学生了解虚拟存储器的概念和实现方法。

进行运行时不需要将所有的页面都调入内存,只需将部分调入内存,即可运行,在运行的过程中若要访问的页面不在内存时,则需求有请求调入的功能将其调入。

假如此时若内存没有空白物理块,则通过页面置换的功能将一个老的不用的页面淘汰出来,其中淘汰的算法有多种。

二、要求

模拟仿真请求分页调度算法,其中淘汰的算法可选下列其一

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;

for(i=0;i<100;i++)

Sign[i]=-1;

Available=newint[b];//Availablede的申请

Left=newint[b];//Left的申请

Allocation=newint*[a];//Allocation的申请

for(i=0;i

Allocation[i]=newint[b];

Need=newint*[a];//Need的申请

for(i=0;i

Need[i]=newint[b];

cout<<"请输入可用资源Available:

"<

for(i=0;i

cin>>Available[i];

cout<<"请输入进程号:

"<

for(i=0;i

cin>>Number[i];

cout<<"请输入分配资源矩阵Allocation:

"<<'('<

for(i=0;i

for(j=0;j

cin>>Allocation[i][j];

cout<<"请输入仍需要资源矩阵Need:

"<<'('<

for(i=0;i

for(j=0;j

cin>>Need[i][j];//计算剩余的资源

for(i=0;i

Left[i]=Available[i];}

j=0;

while(j

for(i=0;i

Left[j]-=Allocation[i][j];}

j++;}

}

2.安全处理

intBankerArithmetic:

:

Safe(intgrac)//看是或安全

{

inti,j,temp;

for(i=0;i

if(Sign[i]!

=1){

temp=1;

for(j=0;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;}

voidBankerArithmetic:

:

Bank(){

for(inti=0;i

Left[i]=Left[i]+Allocation[ID][i];}

voidBankerArithmetic:

:

Show(){

inti,j;

cout<<"进程AllocationNeed\n";

for(i=0;i

if(Sign[i]!

=1){

cout<

for(j=0;j

cout<<""<

cout<<"";

for(j=0;j

cout<<""<

cout<

}

cout<

for(i=0;i

cout<

cout<

}

五、程序运行结果

输入:

输出:

任务六、磁盘空间的分配与回收

三、目的:

磁盘初始化时把磁盘存储空间分成许多块(扇区),这些空间可以被多个用户共享。

用户作业在执行期间常常要在磁盘上建立文件或已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。

一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间。

怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实验使学生掌握磁盘存储空间的分配和收回算法。

四、要求:

模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。

从下题目中选择一题来实现设备的管理:

(1)连续的磁盘存储空间的分配和回收。

(2)用位示图管理磁盘存储空间。

(3)模拟UNIX系统的空闲块组链接法,实现磁盘存储空间的管理。

三、程序框图:

四、程序清单

1.showbitmap函数

voidshowbitmap(void){

inti=0;//用来和位示图bitmap相与得到某位的状态

printf("当前系统磁盘位示图(0表示块可用):

\n");

for(;i

if(0==i%8){

printf("\n");}

printf("%d块:

%d\t",i+1,bitinfo->bitmap[i]);}

system("pause");}

2.diskallocate函数(分配物理块给)

voiddiskallocate(void){//由用户输入需要的物理块数:

intneednum;

inti;

intbusy=0;

charfilestor[32];

printf("输入需要分配的块数:

\n");

scanf("%d",&neednum);

printf("输入文件名:

\n");

scanf("%s",filestor);

for(i=0;i

busy=busy+bitinfo->bitmap[i];}

if(64-busy

printf("没有足够的空闲磁盘,分配失败!

");}

else{

printf("开始分配...\n");

for(i=0;i

if(0==bitinfo->bitmap[i]){

printf("分配块物理地址为:

第%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;}

}

printf("分配成功!

\n");}

system("pause");}

3.diskreturn函数

voiddiskreturn(void){

charfilereturn[32];

inti;

printf("输入要回收的文件名");

scanf("%s",filereturn);

for(i=0;i

if(0!

=strcmp(filereturn,bitinfo->filename[i])){

continue;}

else{

bitinfo->bitmap[i]=0;

printf("回收位示图中第%d字节的第%d位的物理块\n",i/8+1,i%8+1);}

}

system("pause");}

五、程序运行结果

查看磁盘位示图:

申请分配磁盘空间:

申请回收磁盘空间:

 

任务七、文件管理

一、目的:

通过一个简单的多用户文件系统的设计,加深理解文件系统的内部功能及内部实施过程。

二、要求:

设计并实现一个用户的二级文件系统。

要求作到以下几点:

可以实现下列几条命令(至少4条)

命令单词

命令含义

login

用户登录

dir

列文件目录

create

创建文件

delete

删除文件

open

打开文件

close

关闭文件

read

读文件

write

写文件

2、列文件目录时要列出文件名,物理地址,保护码和文件长度。

3、源文件可以进行读写保护。

三、功能框图

三、程序清单

1.Help功能函数

voidhelp(void){

cout<<"命令一览"<

cout<

cout<<"create:

建立文件。

"<

cout<<"read:

读取文件。

"<

cout<<"write:

写入文件,支持多线程"<

cout<<"del:

删除文件。

"<

cout<<"mkdir:

建立目录。

"<

cout<<"cd:

切换目录。

"<

cout<<"logout:

退出登录。

"<

}

2.Createroot函数(创建文件存储结点)

voidcreateroot(){

recent=root=initfile("/",1);

root->parent=NULL;

root->child=NULL;

root->prev=root->next=NULL;

strcpy(para,"/");

}

3.功能函数

intmkdir();

intcreate();

intdir();

intread();

intwrite(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1