ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:44.27KB ,
资源ID:25875163      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25875163.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统课程设计.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统课程设计.docx

1、操作系统课程设计实验一二三四五六七八九十总评成绩武汉大学珞珈学院课程实验(设计)报告专业(班): 计算机科学与技术0901班 学 号: 20091080605031 姓 名: 陈金林 课程名称: 操作系统设计 2011年11 月 10 日实习一 处理器调度一、实习内容选择一个调度算法,实现处理器调度。二、实习目的本实习模拟在单处理器环境下的处理器调度,加深了解处理器调度的工作。三、实习题目本实习有两题,可任选一题。第一题:设计一个按优先数调度算法实现处理器调度的程序。提示:(1)假定系统有5个进程,每个进程用一个PCB来代表。PCB的结构为:进程名如P1P5。指针按优先数的大小把5个进程连成队

2、列,用指针指出下一个进程PCB的首地址。要求运行时间假设进程需要运行的单位时间数。优先数赋予进程的优先数,调度时总是选取优先数大的进程先执行。状态假设两种状态:就绪和结束,用R表示就绪,用E表示结束。初始状态都为就绪状态。(2) 开始运行之前,为每个进程确定它的“优先数”和“要求运行时间”。通过键盘输入这些参数。(3) 处理器总是选择队首进程运行。采用动态改变优先数的办法,进程每运行1次,优先数减1,要求运行时间减1。(4) 进程运行一次后,若要求运行时间不等于0,则将它加入就绪队列,否则,将状态改为“结束”,退出就绪队列。(5) 若就绪队列为空,结束,否则转到(3)重复。要求能接受键盘输入的

3、进程优先数及要求运行时间,能显示每次进程调度的情况,如哪个进程在运行,哪些进程就绪,就绪进程的排列情况。 四. 实验过程 1.实验算法分析:优先数调度算法又称优先权调度算法,在进程调度中,优先数调度算法每次从就绪队列中选择优先数高的进程,将处理机分配给他,使之投入运行。根据进程调度方式的不同,又可以将调地算法分为非强占式优先数调度算法和抢占式优先数调度算法。 2.本实验采用非抢占式优先数调度算法实现进程的调度,实现5个进程的调度情况,实现代码的分析,并验证过程。 3. 实验的流程图如下图所示: 4.代码段分析:struct PCB /定义一个进程结点数据域,为每一个进程定义一个进程控制块 ch

4、ar name3; /进程名 int run_time; /运行时间 int level; /优先数 char state; /运行状态 struct PCB *next; /指向下一个结点的指针; struct PCB *creat() /创建一个函数,用于返回一个链表 包含输入各个节点的信息 并实现调度算法 void display(struct PCB *p) /用于输出当前链表中各结点的状态 输出各个时刻各个节点的状态信息void main( void ) struct PCB *head, *tail, *p; head = creat(); /调用函数creat,head指向头结点

5、 p = head; tail = p; printf(初始进程的情况: n); 下面是对算法的总体实现,以及对输出操作- display(p); /显示当前结点的情况 输出实验结果- 5. 实验结果请输入第1个结点的优先数: 1请输入第1个结点的运行时间: 10请输入第2个结点的优先数: 2请输入第2个结点的运行时间: 20请输入第3个结点的优先数: 3请输入第3个结点的运行时间: 30请输入第4个结点的优先数: 4请输入第4个结点的运行时间: 40请输入第5个结点的优先数: 5请输入第5个结点的运行时间: 50初始进程的情况: P5 50 5 R P4 P4 40 4 R P3 P3 30

6、 3 R P2 P2 20 2 R P1 P1 10 1 R (null)最新进程调度的情况:P5- P5 50 5 R P4 P4 40 4 R P3 P3 30 3 R P2 P2 20 2 R P1 P1 10 1 R (null)最新进程调度的情况:P4- P4 40 4 R P5 P5 49 4 R P3 P3 30 3 R P2 P2 20 2 R P1六.调试结果及分析 通过本次试验的学习,我深入的了解了进程的调度情况,从算法的设计中学到了每个进程用进程控制块的优点,并从中学习了操作系统中任务的运作流程。实习二 主存空间的分配和回收一、实习内容主存储器空间的分配和回收。二、实习目

7、的通过本实习帮助理解在不同的存储管理方式下应怎样进行存储空间的分配和回收。三、实习题目本实习有两题,可任选一题。可变分区管理方式下采用首次适应算法实现主存分配和回收(1) 可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存容量查看是否有足够的空闲空间,若有,则按需分配,否则,作业无法装入。假定内存大小为128K,空闲区说明表格式为:起始地址指出空闲区的起始地址;长度一个连续空闲区的长度;状态有两种状态,一种是“未分配”状态;另一种是“空表目”状态,表示该表项目前没有使用。(2) 采用首次适应算法分配回收内存空间。运行时,输入一系列分配请求和回收请求。要求

8、能接受来自键盘的空间申请及释放请求,能显示分区分配及回收后的内存布局情况。四. 实验过程 1.算法分析:首次适应算法又称最先适应算法,该算法要求空袭那分区按地址递增的次序排列。在进行内存分配时,从空闲分区表(或空闲分区链)首开始顺序查找,直到找到第一个能满足其大小要求的空闲分区为止。然后,再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍然留在空闲分区表中。 2 程序的流程图: 3 实现并验证算法的程序分析1) 定义数据结构类型 struct MZone /内存分区 /空闲区起始地址 int begin_addr; /一个连续空闲区的长度 int length; /状态

9、 int state; /内存中任务名 char task_name32; /指向下一个空闲分区 struct MZone *next; ;2) 插入任务到空闲分区并,分配内存/Minsert函数,功能插入任务到空闲分区 int Minsert(struct MZone* Mnew) 插入任务到空闲分区/memoallocate函数,用于分配内存void memoallocate(void) struct MZone *Mnew = (struct MZone*)malloc(sizeof(struct MZone); printf(输入要分配内存大小(kb):n); scanf(%d,&Mn

10、ew-length); printf(输入任务名:n); scanf(%s,&Mnew-task_name); Minsert(Mnew)?printf(分配内存成功n):printf(没有符合大小的空闲分区,内存分配失败。n); system(pause); free(Mnew);3) 回收内存 int Mreturn(char taskname) 显示分配内存的情况4) 显示内存分配情况 /内存头指针 struct MZone * Mhead = NULL;/showmemory函数,显示当前内存分配情况 void showmemory() struct MZone *Mpoint = M

11、head; printf(内存的使用情况n); printf(beginaddrtlengthtstatettaskn); while( NULL!=Mpoint) printf(%dktt,Mpoint-begin_addr); printf(%dkt,Mpoint-length); Mpoint-state?printf(CANUSEt):printf(CANTUSEt); printf(%sn,Mpoint-task_name); Mpoint = Mpoint-next; system(pause);5) 验证算法的正确性 int main(void) int func_ = 0; /

12、初始化Mhead Mhead = (struct MZone*)malloc(sizeof(struct MZone); Mhead-begin_addr = 0; Mhead-length = MSIZE; Mhead-state = CANUSE; memset(Mhead-task_name, 0, sizeof(char)*32 ); Mhead-next = NULL; while( 1 ) printf(*首次适应算法实现主存分配和回收系统(内存MSIZE)*n); printf(|1:查看内存分配情况n); printf(|2:申请分配内存n); printf(|3:申请回收内存

13、n); printf(|4:退出程序n); printf(*n); scanf(%d,&func_); switch( func_ ) case 1 :showmemory();break; case 2 :memoallocate();break; case 3 :memoreturn();break; case 4 :return 1; system(cls); 五.实验的输出结果/*首次适应算法实现主存分配和回收系统(内存MSIZE)* |1:查看内存分配情况 |2:申请分配内存 |3:申请回收内存 |4:退出程序*1内存的使用情况beginaddr length state task0

14、k 128k CANUSE请按任意键继续. . . *2输入要分配内存大小(kb):100输入任务名:1分配内存成功请按任意键继续. . . *3输入要收回的任务名1内存回收成功!请按任意键继续. . .*/-六.调试结果及分析 通过对可变分区管理方式下采用首次适应算法实现主存分配和回收算法的设计与分析,是我充分的认识了内存的运作流程,内存的分配与回收至关重要,因此内存的分配算法也很重要,通过本次试验,我认识到作为一个系统工程师所要做的事情。 实习三 磁盘存储空间的分配和回收一、实习内容模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。二、实习目的磁盘初始化时把磁盘存储空间分成许多

15、块(扇区),这些空间可以被多个用户共享。用户作业在执行期间常常要在磁盘上建立文件或把已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间。怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实习使学生掌握磁盘存储空间的分配和回收算法。三、实习题目本实习有三个题目,可以任选一个,但不能与内存管理的题目类似。 连续磁盘存储空间的分配和回收提示:(1) 要在磁盘上建立顺序文件时,必须把按序排列的逻

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

17、区,由起始空闲块号能依次推得可使用的其它块号。若不需要占用该区的所有块时,则剩余的块仍应为未分配的空闲块,这时要修改起始空闲块号和空闲块数。若占用了该区的所有块,则相应登记栏中的状态修改成“空表目”。删除一个文件时,需要考虑空闲块的合并情况。磁盘存储空间的分配和回收算法类似于主存储器的可变分区方式的分配和回收。同学们可参考实习二的第一题。(3) 当找到空闲块后,必须启动磁盘把信息存放到指定的块中,启动磁盘必须给出由三个参数组成的物理地址:盘面号、柱面号和物理记录号(即扇区号)。故必须把找到的空闲块号换算成磁盘的物理地址。为了减少移臂次数,磁盘上的信息按柱面上各磁道顺序存放。现假定一个盘组共有2

18、00个柱面,(编号0-199)每个柱面有20个磁道(编号0-19,同一柱面上的各磁道分布在各盘面上,故磁道号即盘面号。),每个磁道被分成等长的6个物理记录(编号0-5,每个盘面被分成若干个扇区,故每个磁道上的物理记录号即为对应的扇区号)。那么,空闲块号与磁盘物理地址的对应关系如下:则 物理记录号 = 空闲块号 % 6磁道号=(空闲块号 / 6 )% 20 柱面号=(空闲块号 / 6)/20(4) 删除一个文件时,从文件目录表中可得到该文件在磁盘上的起始地址和逻辑记录个数,假定每个逻辑记录占磁盘上的一块,则可推算出归还后的起始空闲块号和块数,登记到空闲区表中。换算关系如下:起始空闲块号=(柱面号

19、20+磁道号)6+物理记录号空闲块数=逻辑记录数(5) 请设计磁盘存储空间的分配和回收程序,要求把分配到的空闲块转换成磁盘物理地址,把归还的磁盘空间转换成空闲块号。要求能接受来自键盘的空间申请及释放请求,能显示或打印分配及回收后的空闲区表以及分配到的磁盘空间的起始物理地址:包括柱面号、磁道号、物理记录(扇区号)。四数据结构及流程 用到的数据结构 1 本程序用到的数据结构为空闲表,其组成元素为结构体,其中用来存空闲表的数组元素定义为: struct float address; /*分区起始地址*/ float lenth; /*空闲长度,单位为块*/ int flag; /*空闲表登记栏标志,

20、用“0”表示空栏目,“1”表示未分配*/ tablen; /*空闲表*/ 其中实型address作为分区起始块号,用于记录个空闲分区的起始块号,在程序开始时,数组第0项address被初始化为0(默认起始块号)其他元素对应项在初始化是不赋值。第二项length表示所对应的项的长度,单位为块,在进程请求磁盘空间时,就是根据这一项大小为其分配合适的地址块,在初始化,第0元素该项被值为1000(默认地址块数),其他项不被置值,最后一项flag用于空闲表登记栏标志,用”0”表示空栏目,表明此项不用于指示磁盘空闲区,则该项其他元素都无效,“1”表示未分配,表明此项其他元素代表磁盘区域,可用于分配给文件,

21、在初始化实第0项被初始化为1,其他项被初始化为0,表示为空。 另一个结构体used_table,用于表示已分配表,从中可以看出已分配得的使用情况。其中address表示已分配分区起始块号,length表示已分配分区长度,单位为字节,在初始化使所有项该元素都不赋值,flag表示已分配区登记栏标志,用“0“表示空栏目,表明该项所有元素都无效,若不为0则代表该磁盘区域分配给的文件名,在初始化时由于没有文件,所以全为0。 (2)主程序流程 系统初始化,输入a的值。 选择需要的服务类型。如a=1转,否则若a=2,转,否则若a=3转,否则退出。 输入文件的名字和所需空间大小,为其分配磁盘区域。转。 输入需

22、要撤销的文件的名字,将其所占有的磁盘回收,转。 将磁盘空闲表和磁盘分配区表打印,转。 输入a的值,返回。 结束。 磁盘分配流程 输入文件的名字name和所需空间大小length,=0. 当in且right=0时,判断tablei.flag 是否为1且tablei.lengthlength,若满足则将right置为1,i项为分配的磁盘区域。 在空闲表中找一空标志项j,将其address置为tablei.address,长度为文件所需长度,flag置为文件名。 将tablei.address置为tablei.address+length, tablei.length置为tablei.length-

23、length. (4)磁盘回收流程 输入想撤销的文件的名字。 在used_table中寻找flag 为name的项。若找不到。则报错。若找到,继续, 2 将used_tablei的起始块号分别负给head,tail,用于判断磁盘中该区域的上下相临区域是否被占用,若无,则分情况将其合并。五.代码分析实现磁盘连续分配的算法choice (void) while(a = !4) if(a = 1) else if(a = 2) else if(a = 3) printf(请选择服务类型:); scanf(%d,&a); 主函数测试: int main(void) for(i=0;in;i+) use

24、d_tablei.flag=0; /*已分配区表初始化*/ table0.address=0.0; table0.length=1000.0; table0.flag=1; /*空闲表初始化*/ for(i=1;im;i+) tablei.flag=0; printf(请选择服务类型 n); printf(-请选择服务类型- n); printf( 1 调入新的文件n); printf( 2 收回文件磁盘空间 n); printf( 3 打印磁盘分配情况表n); printf( 4 退出 n); /*输出功能提示*/ printf(-n); printf(请选择服务类型:); scanf(%d

25、,&a); /*读入选择的服务 */ choice(a);return 0;六.输出结果 请选择服务类型-请选择服务类型- 1 调入新的文件 2 收回文件磁盘空间 3 打印磁盘分配情况表 4 退出-请选择服务类型:1输入文件名:1输入所需磁盘大小:100请选择服务类型:1输入文件名:2输入所需磁盘大小:100请选择服务类型:3used_table起始块号 长度 标志0 0.000000 100.000000 11 100.000000 100.000000 2table 起始块号 长度 标志 0 200.000000 800.000000 1请选择服务类型:2输入想删除的文件名: 1请选择服务

26、类型:3used_table起始块号 长度 标志1 100.000000 100.000000 2table 起始块号 长度 标志 0 200.000000 800.000000 1 1 0.000000 100.000000 1请选择服务类型:七. 调试分析及总结 通过这次试验,自己对磁盘可变分区管理的贮存分配回收有了更深的了解,使课本上的知识的到深化,在程序中用了许多if,else语句,对这些语句结构的掌握对编写几条时程序有很大的帮助,由于自己编程及实际经验有限,在编写过程中,对有些环节进行了简化,虽然可以在总体上完成所要求的功能,但一些细节上略显不足,虽然这样,但自己毕竟花费了许多力气,该试验的目的也基本上达到了,就是对课本上相应的知识有了更深的了解,有助于以后更好的学习,收获很大。 武汉大学珞珈学院 计算机科学系 计算机科学与技术专业0901班 学号:20091080605031 姓名:陈金林

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

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