操作系统课程设计.docx

上传人:芳黎 文档编号:1138505 上传时间:2024-10-09 格式:DOCX 页数:50 大小:365.14KB
下载 相关 举报
操作系统课程设计.docx_第1页
第1页 / 共50页
操作系统课程设计.docx_第2页
第2页 / 共50页
操作系统课程设计.docx_第3页
第3页 / 共50页
操作系统课程设计.docx_第4页
第4页 / 共50页
操作系统课程设计.docx_第5页
第5页 / 共50页
点击查看更多>>
资源描述

1、操作系统课程设计任务一、进程创建、控制与撤消一、 目的:通过进程的创建和控制的设计来达到如下目的:1、 加深对进程概念的理解,明确进程和程序的区别;2、 进一步认识并发执行的概念,区别顺序执行和并发执行;3、 分析进程争用临界资源的现象,学习解决进程互斥的方法;二、 内容:在WINDOWS环境下模拟实验:1、 编写一程序,来模拟进程的创建和撤消,要求通过终端键盘输入三、四作业的名称、大小、优先级等。系统为它创建进程,并把进程控制块PCB的内容送到终端显示器上输出。2、 同时模拟内存空间为作业分配内存空间,并把结果用图形形象地表示出来,同样通过终端输出。3、 按进程的优先级的顺序撤消进程,同时通

2、过终端显示PCB的撤消过程和内存的释放过程程序流程图:源代码如下:#include;using namespace std;struct PCBint pid;int priority;int size;int detail;int isrun;PCB running20, ready20;int sum = 0, pid_1;void choose();void menu();int create()if (sum = 20)cout 内存已满,请先结束或换出进程 endl;elsecout 请输入第 sum + 1 个进程endl;cout 请输入进程的pid runningsum + 1

3、.pid;cout 请输入新的进程的优先级 runningsum + 1.priority;cout 请输入新的进程的大小 runningsum + 1.size;cout 请输入新的进程的详情 runningsum + 1.detail;runningsum + 1.isrun = 1;sum+;return runningsum - 1.isrun;choose();void display()int pid;cout 请输入进程的pid pid;if (pid 0 & pid = 20 & runningpid.isrun = 1)cout 进程的pid是: runningpid.pid

4、endl;cout 进程的优先级是: runningpid.priorityendl;cout 进程的大小是: runningpid.sizeendl;cout 进程的相关信息: runningpid.detailendl;elsecout 所查看运行进程不存在 endl;choose();void replace()int pid1, pid2;cout 请输入第一个替换进程的pid pid1;cout 请输入第二个替换进程的pid pid2;if (pid1 0 & pid1 runningpid2.priority)ready20.pid = runningpid1.pid;ready2

5、0.priority = runningpid1.priority;ready20.size = runningpid1.size;ready20.detail = runningpid1.detail;runningpid1.pid = runningpid2.pid;runningpid1.priority = runningpid2.priority;runningpid1.size = runningpid2.size;runningpid1.detail = runningpid2.detail;runningpid2.pid = ready20.pid;runningpid2.pr

6、iority = ready20.priority;runningpid2.size = ready20.size;runningpid2.detail = ready20.detail;cout 替换完成 endl;cout 被替换进程的pid是: ready20.pidendl;cout 被替换进程的优先级是:, ready20.priority;cout 被替换进程的大小是: ready20.sizeendl;cout 被替换进程的详情是: ready20.detailendl;elsecout 进程优先级不够大endl;elsecout 所查看运行进程不存在endl;choose();

7、void kill()int kpid;cout kpid;if (kpid 0 & kpid 20 & runningkpid.isrun = 1)runningkpid.isrun = 0;choose();void choose() int choose;cout 是否继续操作?继续,请输入1,退出:按任意键 endl;cout choose;if (choose = 1) menu();else exit(0);void menu() int n, i;n = 1;while (n = 1)system(cls);cout 进程模拟 endl;cout 1.创建进程 2.查看进程信息

8、endl;cout 3.撤销进程 4.终止进程 endl;cout 5. 退出 endl;cout i;switch (i)case 1:create(); break;case 2:display(); break;case 3:replace(); break;case 4:kill(); break;case 5: exit(0);default:n = 0;int main()menu();return 0;运行结果如下:任务三、基本存储器管理一、 目的:一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储

9、器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在不同的存储管理方式下怎样实现主存的分配和回收。二、 内容:从下两种存储管理方式的主存分配和回收中,选择一种管理方式来实现本次实验任务:1、在可变(动态)分区管理方式下,采用最先适应算法。2、在分页式管理方式下,采用位示图来表示主存的分配情况和回收情况。程序流程图:源代码如下:#include#include#define n 10

10、 /系统最大作业数#define maxsize 20 /空闲区最大内存 #define minisize 100 using namespace std;struct float addr; /已分配分区起始地址 float size; /已分配分区长度,单位为字节 int flag; useedn; /已分配区表 struct float addr; /空闲区起始地址 float size; /空闲区大小int flag; /0为空,1未分配freesmaxsize; void allo(char a,float xk) int i,k; float ad; k=-1; for(i=0;i

11、=xk&freesi.flag=1) if(k=-1|freesi.sizefreesk.size) k=i; if(k=-1) cout无可用空闲区endl; return; if(freesk.size-xk=minisize) freesk.flag=0; ad=freesk.addr; xk=freesk.size; else freesk.size=freesk.size-xk; ad=freesk.addr+freesk.size; i=0; while(useedi.flag!=0&i=n) couterror,未初始化endl; if(freesk.flag=0) freesk

12、.flag=1; else freesk.size=freesk.size+xk; return; else useedi.addr=ad; useedi.size=xk; useedi.flag=a; return; void findc(char x) int i,k,a,s,t; float S,L; s=0; while(useeds.flag!=x|useeds.flag=0)&s=n) cout没有找到该作业endl; return; useeds.flag=0; S=useeds.addr; L=useeds.size; a=-1;k=-1;i=0; while(imaxsize

13、&(a=-1|k=-1) if(freesi.flag=1) if(freesi.addr+freesi.size=S)k=i; if(freesi.addr=S+L)a=i; i+; if(k!=-1) if(a!=-1) freesk.size=freesa.size+freesk.size+L; freesa.flag=0; else freesk.size=freesk.size+L; else if(a!=-1) freesa.addr=S; freesa.size=freesa.size+L; else t=0; while(freest.flag=1&t=maxsize) cou

14、t内存空闲表没有空间,回收空间失败endl; useeds.flag=a; return; freest.addr=S; freest.size=L; freest.flag=1; return; int main( ) int i,a; float xk; frees0.addr=10240; frees0.size=10240; frees0.flag=1; for(i=1;imaxsize;i+) freesi.flag=0; for(i=0;in;i+) useedi.flag=0; while(1) cout选择操作:endl0-退出endl1-分配内存endl2-回收已分配内存en

15、dl3-显示内存信息endl; couta; switch(a) case 0: exit(0); case 1:couta; coutxk; allo(a,xk); break; case 2:couta; findc(a); break; case 3:cout输出空闲分区:endl起始地址 分区长度 标志endl; for(i=0;imaxsize;i+) coutfreesi.addr freesi.size freesi.flagendl; cout 按任意键,输出已分配信息endl; getch(); cout 查看已分配分区:endl起始地址 分区长度 标志endl; for(i

16、=0;in;i+) if(useedi.flag!=0) coutuseedi.addr useedi.size useedi.flagendl; else coutuseedi.addr useedi.size useedi.flagendl; break; default:cout输入有误!endl; return 1;任务五、死锁的避免一、目的在多道程序系统中,多个进程的并发执行来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险死锁。所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局(DeadlyEmbrace),当进程处于这种状态时,若无外力作用

17、,他们都无法在向前推进。我们可以在分配资源时加上限制条件就可以预防死锁,但是,在每一种预防死锁的方法之中,都施加了较强的限制条件;而在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。二、内容利用银行家算法来避免死锁的发生#include#include#define max_s 20#define max_p 100int availablemax_s;int max max_p max_s ;int allocation max_p max_s ;int need max_p max_s ;int request max_s ;int requestPID;int so

18、urce; int process; using namespace std; /1:表示请求的资源还分配的资源/2:表示请求的资源系统剩余的资源/3:表示不存在安全序列/0:成功int banker( int stSq ) int i , j , k; for( i = 0 ; i needrequestPIDi ) return 1; for( i = 0 ; i availablei ) return 2; for( i = 0 ; i source ; i+ ) availablei -= requesti; allocationrequestPIDi += requesti; nee

19、drequestPIDi -= requesti; int finish max_p = 0 ; int work max_s ; int curS; for( i = 0 ; i source ; i+ ) worki = availablei; for( k = 0 ; k process ; k+ ) bool flag = false; for( i = 0 ; i process & !flag ; i+ ) if( finishi = 0 ) flag = true; for( j = 0 ; j workj ) flag = false; curS = i; if( !flag

20、) for( j = 0 ; j source ; j+ ) availablej += requestj; allocationrequestPIDj -= requestj; needrequestPIDj += requestj; return 3; finishcurS = k+1; for( j = 0 ; j source ; j+ ) workj += allocationcurSj; for( i = 0 ; i process ; i+ ) j = 0; while( finishj != i + 1 ) j+; stSqi = j; return 0;void setCS(

21、) source = 3; process = 5; int a = 4 , 5 , 8 ; int max20100; int m max_s = 8 , 5 , 4 , 5 , 3 , 3 , 10 , 1 , 3 , 3 , 3 , 3 , 5 , 4 , 4 , ; int al max_s = 1 , 2 , 1 , 3 , 1 , 1 , 4 , 1 , 3 , 3 , 2 , 2 , 1 , 1 , 3 ; int re = 0 , 2 , 2 ; int i , j; cout当前可用资源数:endl; for( i = 0 ; i source ; i+ ) availabl

22、ei = ai; coutsetw(5)availablei; coutendlendl; cout进程所需资源的最大数量:endl; for( i = 0 ; i process ; i+ ) for( j = 0 ; j source ; j+ ) maxij = mij; coutsetw(5)maxij; coutendl; coutendl; cout进程已分配到资源量:endl; for( i = 0 ; i process ; i+ ) for( j = 0 ; j source ; j+ ) allocationij = alij; coutsetw(5)allocationi

23、j; coutendl; coutendl; cout进程还需的资源量:endl; for( i = 0 ; i process ; i+ ) for( j = 0 ; j source ; j+ ) needij = maxij - allocationij; coutsetw(5)needij; coutendl; coutendl; requestPID = 1; cout进程 requestPID 正在请求的资源:endl; for( i = 0 ; i source ; i+ ) requesti = rei; coutsetw(5)requesti; coutendlendl; v

24、oid main() setCS(); int stSq max_p = 0 ; cout银行家算法的演示endl; int error = banker( stSq ); if( !error ) cout可以进行分配endl; for( int i = 0 ; i process ; i+ ) coutsetw(5)stSqi; coutendl; else cout剩余资源无法满足要求,拒绝分配资源endl; 任务六、磁盘空间的分配与回收一、 目的:磁盘初始化时把磁盘存储空间分成许多块(扇区),这些空间可以被多个用户共享。用户作业在执行期间常常要在磁盘上建立文件或已经建立在磁盘上的文件删

25、去,这就涉及到磁盘存储空间的分配和回收。一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间。怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实验使学生掌握磁盘存储空间的分配和收回算法。二、 内容:模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。从下题目中选择一题来实现设备的管理:(1) 连续的磁盘存储空间的分配和回收。(2) 用位示图管理磁盘存储空间。(3)模拟UNIX系统的空闲块组链接法,实现磁盘存储空间的管理。三、 提示:参考教材

26、P231P2341、 连续的磁盘存储空间的分配和回收:(1) 要在磁盘上建立顺序文时,必须把按序排列的逻辑记录依次存放在磁盘的连续存储空间中。可假定磁盘初始化时,已把磁盘 存储空间划分成若干个等长的块(扇区),按柱面号和盘面号的顺序给每一块确定一个编号。随着文件的建立、删除、磁盘存储空间被分成许多区(每一区包含若干块),有的区存放着文件,而有的区的空闲的。当要建立顺序文件时必须找到一个合适的空闲区来存放文件记录,当一个文件被删除时,则该文件占用的区应成为空闲区。为此可用一张空闲区表不记录磁盘存储空间中尚未占用的部分,格式如下:序列起始空闲块号空闲块个数状态156未分配2143未分配32130未

27、分配4空表目(2) 要建立文件时,先查找空闲区表,从状态为“未分配”的登记栏目中找出一个块数能满足要求的区,由起始空闲块号能依次推得可使用的其它块号。若不需要占用该区的所有块时,则剩余的块仍应为未分配的空闲块,这时要修改起空闲块号和空闲块数。若占用了该区的所有块,则相应登记栏中的状态修改成“空表目”,删除一个文件时,从空闲区表中找一个状态为“空表目”的登记栏目,把归还的起始块号和块数填入对应的位置。磁盘存储空间的分配和回收算法类似于主存储器的可变分区方式的分配和回收。同学们可参考上一实验的第一题。(3) 当找到空块后,必须启动磁盘把信息存放到指定的块中,启动磁盘必须给出由三个参数组成的物理地址

28、:柱面号、磁道号和物理记录号。故必须把找到的空闲块号换算成磁盘的物理地址。为了减少移臂次数,磁盘上的信息按柱面上各磁道顺序存放。现假定一个盘组共有200个柱面,(编号0199)每个柱面有20个磁道(019,同一柱面上的各磁道分布在各盘面上,故磁道号即盘面号。),每个磁道被分成等长的6个物理记录(编号05,每个盘面被分成若干个扇区,故每个磁道上的物理记录号即为对应的扇区号。)。那么,空闲块号与磁盘物理地址的对应关系如下: 假设M=空闲块号/6,m=空闲块号/6 则物理记录号=m 磁道号=M/20,柱面号=M/20(4) 删除一个文件时,从文件目录表中可得到该文件在磁盘上的起始地址和逻辑记录个数,

29、假定每个逻辑记录占磁盘上的一块,则可推算出归还后的起始空闲块号和块数,登记到空闲区表中。换算关系如下:起始空闲块号=(柱面号*20+磁道号)*6+物理记录号空闲块数=逻辑记录数(5) 请设计磁盘存储空间的分配和回收程序,要求把分配到空闲块转换成磁盘物理地址,把归还的磁盘空间转换成空闲块号 假定空闲区表的初值如提示(1)中指出,现有一文件要占用10块,运行你所设计的分配程序,显示或打印分配后的空闲区表以及分配到的磁盘空间的起始物理地址。然后,有一文件被删除,它占用的磁盘空间为:1号柱面2号磁道,0号物理记录开始的4块,运行你所设计划的回收程序,显示或打印回收后的空闲区表。2、用位示图管理磁盘存储

30、空间的分配和回收:(1)为了提高磁盘存储空间的利用率,可在磁盘上组织成链接文件、索引文件,这类文件可以把逻辑记录存放在不连续的存储空间。为了表示哪些磁盘空间已被占用,哪些磁盘空间是空闲的,可用位示图来指出。位示图由若干字节构成,每一位与磁盘上的一块对应,“1”状态表示相应块已占用,“0”状态表示该块为空闲。位示图的形式与上一实验中的位示图一样,但要注意,对于主存储空间和磁盘存储空间应该用不同的位示图来管理,绝不可混用。(2)申请一块磁盘空间时,由分配程序查位示图,找出一个为“0”的位,计算出这一位对应块的磁盘物理地址,且把该位置成占用状态“1”。假设现在有一个盘组共80个柱面,每个柱面有两个磁

31、道,每个磁道分成4个物理记录。那么,当在位示图中找到某一字节的某一位为“0”时,这个空闲块对应的磁盘物理地址为: 柱面号=字节号 磁道号=位数/4 物理记录号=位数/4(3)归还一块磁盘空间时,由回收程序根据归还的磁盘物理地址计算出归还块在位示图中的对应位,把该位置成“0”。按照(2)中假设的盘组,归还块在位示图中的位置计算如下: 字节号=柱面号 位数=磁道号*4+物理记录号(4)设计申请一块磁盘空间和归还一块磁盘空间的程序。要求能显示或打印程序运行前和运行后的位示图;分配时把分配到的磁盘空间物理地址显示或打印出来,归还时把归还块对应于位示图的字节号和位数显示或打印出来。(5)假定已有如表61

32、磁盘空间被占用了,现在要申请五块磁盘空间,运行分配程序,按(4)中要求显示或打印运行的结果。然后再归还如表62的空间,运行回收程序,按(4)中的要求显示或打印运行结果。柱面号磁道号物理记录号001002010013100112表61柱面号磁道号物理记录号002010101表623、模拟UNIX系统的空闲块成组链接法,实现磁盘存储空间的管理:(1)假定磁盘存储空间已被划分成长度n的等长块,共有M块可供使用。UNIX系统中采用空闲块成组链接的方法来管理磁盘存储空间,将磁盘中的每N个空闲块(NM)分成一组,最后一组可以不足N块,每组的第一块登记了下一组空闲块的块数和块号,第一组的块数和块号登记在专用

33、块中,登记的格式如下:空闲块数K空闲块号1空闲块号2空闲块号K当第一项内容为“0”时,则第二项起指出的空闲块是最后一组。(2)现模拟UNIX系统的空闲块成组链接,假定共有8块可供使用,每3块为一组,则空闲块成组链接的初始状态为: A0 A1 A43456 308713 32专用块 A2 A5 A7 A3 A6 A8 开始时,空闲块号是顺序排列的,但经若干次的分配和归还操作后,空闲块的链接就未必按序排列了。 用二维数组AMN来模拟管理磁盘空间,用Ai表示第i块,第0块A0作为专用块。(3)成组链接的分组情况记录在磁盘物理块中,为了查找链接情况,必须把它们读入主存,故当磁盘初始化后,系统先将专用块

34、内容复到主存中,定义一个数组MA存放专用块内容,即MA=A0。申请一块磁盘空间时,查MA,从中找出空闲块号,当一组空闲块只剩第一块时,则应把该块中指出的下一组的空闲块数和块号复制到专用块中,然后把该块分配给申请者。当一组的空闲块分配完后则把专用块内容(下一组链接情况)复制到主存,再为申请者分配。分配算法如图61。开始把As块内容复制到专用块A0:=Asi:=MA0把专用块内容自制到主存MA:=A0MA01?MA0=1?MA1=0?S:=MAi空闲块数减1MA0:=MA0-1显示分配的块号sS:=MAi显示:系统无空闲块结束 否 是 是 否 否 是图61采用成组链接的分配算法(4)归还一块时给出

35、归还的块号,若当前组不满规定块时,将归还块登记入该组;若当前组已满,则另建一新组,这时归还块作为新一组的第一块,应把主存中登记的一组链接情况MA复制归还块中,然后在MA重新登记一个新组。归还一块的算法图62。开始J:=归还块号MA0=3?i:=MA0MAi:=jMA0:=MA0+1MAj:=MAMA0:=1MA1:=j结束 否 是 图62采用成组链接的回收算法(5)设计分配和归还磁盘空间的程序,能显示或打印分配的磁盘空间的块号,在完成一次分配或归还后能显示或打印各空闲块组的情况(各组的空闲块数和块号)。本实验省去了块号与物理地址之间的转换工作,而在实际的系统中必须进行块号与物理地址的转换工作。(6)运行你所设计的

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 建筑施工

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922