计算机操作系统”课程设计大作业
计算机操作系统课程设计(大作业)

摘要银行家算法是一个用来预防系统进入死锁状态的算法,用它可以判断系统的安全性,如果系统当前处于安全状态,则可以为申请资源的进程分配资源,如果不是安全状态,则不能为申请资源的进程分配资源。
银行家算法执行过程中,首先判断申请资源的进程所申请的资源数目是否合法,若是合法的,则可以为其进行试分配,再利用安全性算法求出安全序列,·如果存在安全序列,则说明可以给申请资源的进程分配资源,分配成功,继续为其它进程服务。
如果找不到安全序列,则说明为该进程分配资源后系统会进入不安全状态,所以不能为该进程分配资源,使该进程进入阻塞状态。
若申请资源的进程申请的资源数目不合法,则不需要进行试分配,直接使其进入阻塞状态,处理其他申请资源的进程。
论文首先对算法的设计从总体上进行了分析,然后分析各个细节,再对算法分模块设计,并对各个模块的算法思想通过流程图表示,分块编写代码,并进行调试和测试,最后进行组装测试及系统测试,使其成为一个可以用来判断系统安全状态的程序。
关键词:可用资源最大需求矩阵分配矩阵需求矩阵安全性算法安全序列目录一、绪论 (3)二、需求分析 (4)三、算法分析 (5)四、详细设计 (6)五、程序调试 (9)六、总结 (11)参考文献 (12)附录(源代码) (13)一、绪论Dijkstra (1965)提出了一种能够避免死锁的调度算法,称为银行家算法。
它的模型基于一个小城镇的银行家,他向一群客户分别承诺了一定的贷款额度,每个客户都有一个贷款额度,银行家知道不可能所有客户同时都需要最大贷款额,所以他只保留一定单位的资金来为客户服务,而不是满足所有客户贷款需求的最大单位。
这里将客户比作进程,贷款比作设备,银行家比作系统。
客户们各自做自己的生意,在某些时刻需要贷款。
在某一时刻,客户已获得的贷款和可用的最大数额贷款称为与资源分配相关的系统状态。
一个状态被称为是安全的,其条件是存在一个状态序列能够使所有的客户均得到其所需的贷款。
“计算机操作系统”课程设计大作业

华南理工大学
“计算机操作系统”课程设计大作业
一、题目: 动态内存分区分配方式模拟
二、目的
假设初始态下,可用内存空间为640K,并有下列请求序列,请分别用首次适应算法和最佳适应算法为作业分配和回收内存块,并显示出每次分配和回收后的空闲分区链的情况来以及内存占用情况图。
作业1申请130K
作业2申请60K
作业3申请100k
作业2释放60K
作业4申请200K
作业3释放100K
作业1释放130K
作业5申请140K
作业6申请60K
作业7申请50K
作业6释放60K
三、实验要求:
每人完成一份大作业实验报告。
报告分设计思想、数据定义、处理流程、源程序、运行结果、设计体会等部分。
1)给出数据定义和详细说明;
2)给出实现思想和设计流程;
3)调试完成源程序;
4)屏幕观察运行结果;
5)总结自己的设计体会;
编程工具及操作系统平台不限,建议用VC6. 0或JA V A开发。
四、提交内容
本大作业每个人必须单独完成。
最后需提交的内容包括:源程序(关键代码需要注释说明)、可运行程序、算法思路及流程图、心得体会。
将以上内容刻入光盘,光盘上写明班级、学号、姓名信息,再将大作业要求、源程序及注释、算法思路及流程图、心得体会等打印出来。
最后将打印稿及光盘统一交给教务员。
过期自负。
大作业严禁抄袭。
发现抄袭一律以不及格论。
操作操作系统大型作业

操作系统课程设计所在班级:0310401班学生学号:031040109学生姓名:李雨晴论文题目:生产者和消费者问题任课教师:李艳老师完成日期: 2012年12月2日目录操作系统课程设计 (1)一、课程的地位、目标和任务 (3)二、课程设计的基本要求 (3)1.课程设计要求: (3)2.学习要求: (3)三、题目分析 (3)1.题目的特点: (3)2.采用信号量机制: (4)2.1. PV原语操作的动作 (4)2.2信号量 (4)四、课程设计的内容 (5)1.实验程序的结构图(流程图) (5)2. 数据结构及信号量定义的说明 (5)2 .1 CreateThread (5)2.2. CreateMutex (6)2.3. CreateSemaphore (6)2.功能模块 (7)五、课程实现的内容 (7)1.课程设计的实验环境 (7)2. 实验的步骤 (8)2.1 打开VC (8)2.2在工程中创建源文件" R_WP1.cpp": (8)2.3通过调用菜单命令项build->build all进行编译连接 (8)3.代码实现的具体分析 (8)3.1.使用信号量解决生产者-消费者问题 (10)3.2.使用消息传递解决生产者-消费者问题 (12)六、个人体会 (15)参考文献 (15)附录:具体实现代码 (16)一、课程的地位、目标和任务“操作系统”是计算机专业的核心专业课,“操作系统课程设计”是理解和巩固操作系统基本理论、原理和方法的重要实践环节。
本课程通过设计实现一个综合作业,加深对操作系统原理的理解,提高综合运用所学知识的能力,培养学生独立工作和解决问题的能力,取得设计与调试的实践经验,为今后进一步从事计算机系统软件和应用软件的分析、研制和开发打下良好的基础。
二、课程设计的基本要求1.课程设计要求:教学内容:用信号量机制解决生产者和消费者问题。
重点:信号量实现进程同步的算法难点:进程同步的实现2.学习要求:理解生产者和消费者模型,掌握利用信号量实现进程同步的方法,通过对实际问题的编程实现,获得实际应用和编程能力。
计算机系课程设计(大作业)报告—计算机网络

汇聚层交换机:在校园网中,要求有流畅的上网环境,我们选择的交换机时,就要求交换机能提高LAN的运行效率,所以我们选了CiscoCatalyst3750。
4.4
二层交换机均选用WS-C2960-48TC-L,该款交换机具有48个10/100以太网端口和2个双介质上行链路端口, WS-C2960-48TC-L配备了强大的特性集,通过组播过滤和旨在第二层网络中提供最高可用性的全套生成树协议改进,实现了网络可扩展性及更高可用性;同时提供了出色的多层QoS特性,确保网络流量进行了分类和优先级划分,并以最好的方式避免了拥塞。
核心层交换机:要求高性能、模块化和高介质灵活性,在性价比适中情况下,要求有较长的部署寿命,从而减少更换和维修等方面的开支。核心层交换机我们选择了WS-C4507。
4.3
CiscoCatalyst3750系列交换机是一款创新交换机,通过将业界领先的易用性和可堆叠交换机的最高永续性相结合,提高了LAN的运行效率。此产品系列是下一代桌面交换机的代表,采用了Cisco StackWise™技术,这一 32-Gbps堆叠互联使客户可以逐个交换机地构建统一、高度永续的交换系统。对于中型机构和企业分支机构来说, Cisco Catalyst 3750系列通过提供配置灵活性、支持融合网络模式及自动进行智能网络服务配置,简化了融合应用的部署,并可针对不断变化的业务需求进行调整。此外,Cisco Catalyst 3750系列针对高密度千兆位以太网部署进行了优化,包括多种交换机,以满足接入、汇聚或小型网络骨干连接需求。Cisco Catalyst 3750系列可采用标准多层软件镜像(SMI)或增强多层软件镜像(EMI)。SMI特性集包括高级服务质量(QoS)、限速、访问控制列表(ACL),以及基本静态和路由信息协议(RIP)路由功能。EMI则提供了更为丰富的企业级特性集,包括先进的基于硬件的IP单播和组播路由。
操作系统大作业(含课程设计)

“计算机操作系统”课程设计大作业一、题目: 页面置换算法模拟实验二、目的分别采用最佳(Optimal)置换算法、先进先出(FIFO)页面置换算法和最近最少使用(LRU)置换算法对用户输入的页面号请求序列进行淘汰和置换,从而加深对页面置换算法的理解。
三、内容和要求请用C/C++语言编一个页面置换算法模拟程序。
用户通过键盘输入分配的物理内存总块数,再输入用户逻辑页面号请求序列,然后分别采用最佳(Optimal)置换算法、先进先出(FIFO)页面置换算法和最近最少使用(LRU)置换算法三种算法对页面请求序列进行转换,最后按照课本P150页图4-26的置换图格式输出每次页面请求后各物理块内存放的虚页号,并算出每种算法的缺页次数。
最后评价三种页面置换算法的优缺点。
三种页面置换算法的思想可参考教材P149-P152页。
假设页面号请求序列为4、3、2、1、4、3、5、4、3、2、1、5,当分配给某进程的物理块数分别为3块和4块时,试用自己编写的模拟程序进行页面转换并输出置换图和缺页次数。
四、提交内容本大作业每个人必须单独完成,大作业以WORD附件形式提交。
最后需提交的内容包括:算法算法思路及流程图、数据结构说明、源程序(关键代码需要注释说明)、运行结果截图、心得体会及总结。
大作业严禁抄袭。
发现抄袭一律以不及格论。
请大家严格按照大作业题目来编写程序,不要上交以前布置的大作业。
如果提交的大作业题目与本文档要求不符,成绩一律为不及格。
请大家按时在网院网上系统里提交大作业,过了规定时间将无法再补交大作业。
答:一、思路页面置换算法:当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。
该程序通过查找页表,得到该页所在外存的物理块号。
熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi 编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序,学会如何把学到的知识用于解决实际问题,培养学生!。
大工20秋《操作系统》大作业题目及要求

内容仅供参考1.谈谈你对本课程学习过程中的心得体会与建议?转眼间,学习了一个学期的计算机操作系统课程即将结束。
在这个学期中,通过老师的悉心教导,让我深切地体会到了计算机操作系统的一些原理和具体操作过程。
在学习操作系统之前,我只是很肤浅地认为操作系统只是单纯地讲一些关于计算机方面的操作应用,并不了解其中的具体操作过程和实用性。
通过这一学期的学习,我才知道操作系统(Operating System,简称OS)是管理计算机系统的全部硬件资源包括软件资源及数据资源;控制程序运行;改善人机界面;为其它应用软件提供支持等,使计算机系统所有资源最大限度地发挥作用,为用户提供方便的、有效的、友善的服务界面。
操作系统这门课程并不是教你如何使用操作系统的,而是讲操作。
总而言之,操作系统的一些原理在生活中都可以找到相应的例子。
结合生活中的例子,可以化抽象为具体,我们会更加清楚地了解到其原理与操作过程。
我觉得通过我们的不断学习,结合生活中的实际问题,我们就会把操作系统学得更好。
总体来说,通过这次的对操作系统的总结,有收获也有遗憾、不足的地方,但我想,我已经迈入了操作系统的大门,只要我再认真努力的去学习,去提高,肯定能让自己的知识能力更上一层楼。
进程同步与互斥生产者-消费者问题1、设计思路在这次设计中定义的多个缓冲区不是环形循环的,并且不需要按序访问。
其中生产者可以把产品放到某一个空缓冲区中,消费者只能消费被指定生产者生产的产品。
本设计在测试用例文件中指定了所有生产和消费的需求,并规定当共享缓冲区的数据满足了所有有关它的消费需求后,此共享才可以作为空闲空间允许新的生产者使用。
本设计在为生产者分配缓冲区时各生产者之间必须互斥,此后各个生产者的具体生产活动可以并发。
而消费者之间只有在对同一个产品进行消费时才需要互斥,它们在消费过程结束时需要判断该消费者对象是否已经消费完毕并释放缓冲区的空间。
2、程序流程图3基本内容在设计程序时主要有三个主体部分、三个辅助函数和一个数据结构。
操作系统大作业

操作系统⼤作业操作系统实验报告进程调度实验⼀.实验题⽬⽤C语⾔编写和调试⼀个进程调度程序,模拟进程调度过程。
调度算法采⽤优先数算法和先来先服务算法。
⼆.⽬的要求1.把理论与实践紧密结合,加深对进程的概念及进程调度算法的理解。
取得较好的学习效果2.加深对操作系统课程的理解。
使学⽣更好地掌握操作系统的基本概念、基本原理、及基本功能,具有分析实际操作系统、设计、构造和开发现代操作系统的基本能⼒。
3.培养学⽣的系统程序设计能⼒。
三.实验内容设计⼀个有N个进程并⾏的进程调度程序。
其中:1)进程调度算法:采⽤最⾼优先数优先的调度算法分配处理机和先来先服务算法来排队,总的过程采⽤时间⽚轮转算法。
2)每个进程有⼀个进程控制块(PCB)表⽰。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运⾏时间、已⽤CPU时间、进程状态。
3)进程的优先数及需要的运⾏时间可以事先⼈为地指定。
进程的到达时间为进程输⼊的时间。
4)进程的运⾏时间以时间⽚为单位进⾏计算。
5)每个进程的状态可以是就绪W(Wait)、运⾏R(Run)、或完成F(Finish)三种状态之⼀。
6)就绪进程获得CPU后都只能运⾏⼀个时间⽚。
⽤已占⽤CPU时间加1来表⽰。
7)果运⾏⼀个时间⽚后,进程的已占⽤CPU时间已达到所需要的运⾏时间,则撤消该进程;如果运⾏⼀个时间⽚后进程的已占⽤CPU时间还未达所需要的运⾏时间,也就是进程还需要继续运⾏,此时应将进程的优先数减1(即降低⼀级),然后把它插⼊相应优先级就绪队列等待CPU。
8)每进⾏⼀次调度程序都打印⼀次运⾏进程、就绪队列、以及各个进程的PCB,以便进⾏检查。
9)重复以上过程,直到所要进程都完成为⽌。
四.整体功能设计五.进程调度流程图:EXIT六.C语⾔编程实现及数据结构6.1 C程序见报告后⾯的代码6.2 数据结构6.2.1 在实验中共有8个进程。
进程优先级为1到3,进程状态为:“wait”,“run”,“finish”中的⼀种。
计算机操作系统”课程设计大作业

华南理工大学“计算机操作系统”课程设计大作业1)给出数据定义和详细说明;struct block_s{/*该块的实际长度,不包括block_s的大小。
*/int length;/*申请该块的作业,为0表示该块空闲。
*/int owner;/*当该块是空闲块时,offset表示下一空闲块的偏移,offset为TOTAL_BYTE表示该块是最后一个空闲块。
当该块非空闲块时,offset表示作业实际申请的大小。
*/int offset;};2)给出实现思想和设计流程;该算法遍历空闲链表,找第一个大小能满足要求的块。
然后,若找到的块足够大,再把该块切成两块,返回第一块给调用者;把第二块加到空闲区链表中。
该算法遍历整个空闲链表,找一个大小能满足要求的块。
并且该块是所有能满足要求的空闲块中,大小最小的块。
然后,若找到的块足够大,再把该块切成两块,返回第一块给调用者;把第二块加到空闲区链表中。
3)调试完成源程序;#include "stdio.h"#include <stdlib.h>#include <conio.h>#define n 10 /*假定系统允许的最大作业为n,假定模拟实验中n值为10*/#define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/ #define minisize 100struct{float address; /*已分分区起始地址*/float length; /*已分分区长度,单位为字节*/int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/}used_table[n]; /*已分配区表*/struct{float address; /*空闲区起始地址*/float length; /*空闲区长度,单位为字节*/int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/ }free_table[m]; /*空闲区表*/allocate(char J,float xk){/*采用最优分配算法分配xk大小的空间*/int i,k;float ad;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");return 0;}/*找到可用空闲区,开始分配:若空闲区大小与要求分配的空间差小于msize大小,则空闲区全部分配;若空闲区大小与要求分配的空间差大于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<n) /*寻找空表目*/ 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 1;}else{/*修改已分配表*/used_table[i].address=ad;used_table[i].length=xk;used_table[i].flag=J;}return 1;}/*主存分配函数结束*/reclaim(char J){/*回收作业名为J的作业所占主存空间*/ int i,k,j,s,t;float S,L;/*寻找已分配表中对应登记项*/s=0;while((used_table[s].flag!=J||used_table[s].flag==0)&&s<n) s++;if(s>=n)/*在已分配表中找不到名字为J的作业*/{printf("找不到该作业\n");return 0;}/*修改已分配表*/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<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;elseif(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<m)t++;if(t>=m)/*空闲区表满,回收空间失败,将已分配表复原*/{printf("主存空闲表没有空间,回收空间失败\n");used_table[s].flag=J;return 0;}free_table[t].address=S;free_table[t].length=L;free_table[t].flag=1;}return 1;}/*主存回收函数结束*/main( ){int i,a;float xk;char J;/*空闲分区表初始化:*/free_table[0].address=10240;free_table[0].length=102400;free_table[0].flag=1;for(i=1;i<m;i++)free_table[i].flag=0;/*已分配表初始化:*/for(i=0;i<n;i++)used_table[i].flag=0;while(1){printf ( "选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)\n");printf("选择功项(0~3) :");scanf("%d",&a);switch(a){case 0: exit(0); break;case 1: /*a=1分配主存空间这一句后面需要代码*/ printf("请输入作业名请输入作业大小:");scanf("%c%f\n",&J,&xk);allocate( J, xk);case 2: /*a=2回收主存空间这一句后面需要代码*/ printf("需要回收的作业:");scanf("%c\n",&J);reclaim(J);case 3: /*a=3显示主存情况*//*输出空闲区表和已分配表的内容*/printf("输出空闲区表:\n起始地址分区长度标志\n");for(i=0;i<m;i++)printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length, free_table[i].flag);printf(" 按任意键,输出已分配区表\n");getch();printf(" 输出已分配区表:\n起始地址分区长度标志\n");for(i=0;i<n;i++)if(used_table[i].flag!=0)printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length, used_table[i].flag);elseprintf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length, used_table[i].flag);break;default:printf("没有该选项\n");}/*case*/}/*while*/}/*主函数结束*/4)屏幕观察运行结果;5)总结自己的设计体会;通过这次课程设计,不仅让我了解了模型机的硬件结构和怎么去设计微程序,更重要的还让我学会了、或者说是验证了“做事一定要有次序和对事物的总体把握”这句话。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华南理工大学“计算机操作系统”课程设计大作业1)给出数据定义和详细说明;struct block_s{/*该块的实际长度,不包括block_s的大小。
*/int length;/*申请该块的作业,为0表示该块空闲。
*/int owner;/*当该块是空闲块时,offset表示下一空闲块的偏移,offset为TOTAL_BYTE表示该块是最后一个空闲块。
当该块非空闲块时,offset表示作业实际申请的大小。
*/int offset;};2)给出实现思想和设计流程;该算法遍历空闲链表,找第一个大小能满足要求的块。
然后,若找到的块足够大,再把该块切成两块,返回第一块给调用者;把第二块加到空闲区链表中。
该算法遍历整个空闲链表,找一个大小能满足要求的块。
并且该块是所有能满足要求的空闲块中,大小最小的块。
然后,若找到的块足够大,再把该块切成两块,返回第一块给调用者;把第二块加到空闲区链表中。
3)调试完成源程序;#include "stdio.h"#include <stdlib.h>#include <conio.h>#define n 10 /*假定系统允许的最大作业为n,假定模拟实验中n值为10*/#define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/ #define minisize 100struct{float address; /*已分分区起始地址*/float length; /*已分分区长度,单位为字节*/int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/}used_table[n]; /*已分配区表*/struct{float address; /*空闲区起始地址*/float length; /*空闲区长度,单位为字节*/int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/}free_table[m]; /*空闲区表*/allocate(char J,float xk){/*采用最优分配算法分配xk大小的空间*/int i,k;float ad;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");return 0;/*找到可用空闲区,开始分配:若空闲区大小与要求分配的空间差小于msize大小,则空闲区全部分配;若空闲区大小与要求分配的空间差大于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<n) /*寻找空表目*/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 1;}else{/*修改已分配表*/used_table[i].address=ad;used_table[i].length=xk;used_table[i].flag=J;}return 1;}/*主存分配函数结束*/reclaim(char J){/*回收作业名为J的作业所占主存空间*/int i,k,j,s,t;float S,L;/*寻找已分配表中对应登记项*/s=0;while((used_table[s].flag!=J||used_table[s].flag==0)&&s<n) s++;if(s>=n)/*在已分配表中找不到名字为J的作业*/{printf("找不到该作业\n");return 0;}/*修改已分配表*/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<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;elseif(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<m)t++;if(t>=m)/*空闲区表满,回收空间失败,将已分配表复原*/{printf("主存空闲表没有空间,回收空间失败\n");used_table[s].flag=J;return 0;}free_table[t].address=S;free_table[t].length=L;free_table[t].flag=1;}return 1;}/*主存回收函数结束*/main( ){int i,a;float xk;char J;/*空闲分区表初始化:*/free_table[0].address=10240;free_table[0].length=102400;free_table[0].flag=1;for(i=1;i<m;i++)free_table[i].flag=0;/*已分配表初始化:*/for(i=0;i<n;i++)used_table[i].flag=0;while(1){printf ( "选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)\n");printf("选择功项(0~3) :");scanf("%d",&a);switch(a){case 0: exit(0); break;case 1: /*a=1分配主存空间这一句后面需要代码*/printf("请输入作业名请输入作业大小:");scanf("%c%f\n",&J,&xk);allocate( J, xk);case 2: /*a=2回收主存空间这一句后面需要代码*/printf("需要回收的作业:");scanf("%c\n",&J);reclaim(J);case 3: /*a=3显示主存情况*//*输出空闲区表和已分配表的内容*/printf("输出空闲区表:\n起始地址分区长度标志\n");for(i=0;i<m;i++)printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length, free_table[i].flag);printf(" 按任意键,输出已分配区表\n");getch();printf(" 输出已分配区表:\n起始地址分区长度标志\n");for(i=0;i<n;i++)if(used_table[i].flag!=0)printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length, used_table[i].flag);elseprintf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length, used_table[i].flag);break;default:printf("没有该选项\n");}/*case*/}/*while*/}/*主函数结束*/4)屏幕观察运行结果;5)总结自己的设计体会;通过这次课程设计,不仅让我了解了模型机的硬件结构和怎么去设计微程序,更重要的还让我学会了、或者说是验证了“做事一定要有次序和对事物的总体把握”这句话。
开始,我没有按照步骤先设计机器指令格式,而是一下子就开始去设计微程序,这使我对整个课程设计没有什么总体把握,也不知道接下来要干什么。
后来我问了蒋老师,在他热心耐心的指导下,我终于明白要严格按照实验步骤来做。
我自己的思路也慢慢清晰了,我设计好机器指令格式,马上请教蒋老师,在确认我的机器指令格式正确的基础上,我开始用老师的仿真软件编写微指令,这时我碰到了怎样去设计此设计中02次地址,发现很巧妙而又富有随意性,看到其他同学一贯的雷同现象,我决定还是应该自己动脑筋换成别的地址。