OS课程设计报告书
OS课程设计任务书

《操作系统原理》课程设计任务书(网络工程专业09-1)一、课程设计题目(任选一个题目)1.模拟进程管理2.模拟处理机调度3.模拟存储器管理4.模拟文件系统5.模拟磁盘调度二、设计目的和要求1.设计目的《操作系统原理》课程设计是网络工程专业实践性环节之一,是学习完《操作系统原理》课程后进行的一次较全面的综合练习。
其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。
2.基本要求:(1)选择课程设计题目中的一个课题,独立完成。
(2)良好的沟通和合作能力(3)充分运用前序课所学的软件工程、程序设计、数据结构等相关知识(4)充分运用调试和排错技术(5)简单测试驱动模块和桩模块的编写(6)查阅相关资料,自学具体课题中涉及到的新知识。
(7)课题完成后必须按要求提交课程设计报告,格式规范,内容详实。
三、设计内容及步骤1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。
2.根据实现的功能,划分出合理的模块,明确模块间的关系。
3.编程实现所设计的模块。
4.程序调试与测试。
采用自底向上,分模块进行,即先调试低层函数。
能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。
调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果;5.结果分析。
程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。
6.编写课程设计报告;设计报告要求:A4纸,详细设计部分主要叙述本人的工作内容设计报告的格式:(1)封面(题目、指导教师、专业、班级、姓名、学号)(见附录1)(2)设计任务书(3)目录(4)需求分析(5)概要设计(6)详细设计(含主要代码)(7)调试分析、测试结果(8)用户使用说明(9)附录或参考资料四、进度安排设计在学期的第15、16周进行,时间安排如下:五、成绩评定办法成绩分为优(A)、良(B)、中(C)、及格(D)、不及格(E)五个等级。
OS课程设计报告张伟龙

课程设计课程设计名称:进程调度算法专业班级:计科F1201班学生姓名:张伟龙学号: 201216010313指导教师:张玉宏课程设计时间:2014年7月2日计算机科学与技术专业课程设计任务书说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页1 需求分析已知进程个数以及每个进程的到达时间和要求服务时间,需要知道使用先来先服务,短作业优先,最高响应比优先算法调度这些作业的过程以及他们的平均周转时间和平均带权周转时间。
2 概要设计程序主要有5个函数,input和print函数,以及实现三个进程调度算法的FCFS,SJF,HRRN函数。
其中FCFS中写了一个比较函数cmp用于快速排序。
Main函数中先提示输入,调用input函数之后,读入每个进程的数据。
然后分别调用FCFS,SJF,HRRN函数,并同时打印出结果。
完成进程调度过程。
3 运行环境在windows下运行,Dev-C++ 5.4.2下成功编译运行。
4 开发工具和编程语言Dev-C++ 5.4.2, C++语言。
5 详细设计一个Job结构体用来存储一个作业的基本数据,包括到达时间,服务时间,开始执行时间,完成时间,周转时间,带权周转时间。
函数原型void input();读入每个进程的到达时间和服务时间。
void input(){k = 0;while( cin >> job[k].number ){if( job[k].number < 0 ) break;cin >> job[k].arrive_time >> job[k].serive_time;k++;}}void FCFS( int );实现进程调度算法中的先来先服务算法,其中按照作业到达的顺序进程排序。
调用了bool cmp( const Job & , const Job & );这个比较函数这里调用了STL的快速排序,可以优化排序的时间。
os课程设计

专业班级:计算机11-2第1组指导教师:许家昌一、目的通过课程设计, 加深对操作系统各资源管理模块的理解,掌握操作系统的基本原理及功能, 具有初步分析实际操作系统、设计、构造和开发现代操作系统的基本能力。
二、内容及要求题目:一个十字路口,共有四组红绿灯,每个路口的车辆都遵循“红灯停、绿灯行”的原则,假设将每一台汽车都作为一个进程,请设计良好的机制,展示出合理的“十字路口交通管理”情况。
1.车辆数目:每个路口的车辆数目不超过5辆,程序能够提供参数来设定初始的车辆数目。
2.交通灯设定:初始情况一个路口为红灯、一个路口为绿灯;红灯变为绿灯的间隔为x 秒,必须保持十字路口交通灯的设定正确。
3.车辆通行设定:路口宽度不限,对一个路口而言,只有当一辆车通过路口(越过对面路口的交通灯后)后,其后续车辆才能继续通过交通灯,车辆通过路口的时间可以固定、可以自行计算,但是不能为x秒。
(即必须体现交通灯对通行的管制)。
小组成员:组长:专业班级:计算机11-2第2组指导教师:许家昌一、目的通过课程设计, 加深对操作系统各资源管理模块的理解,掌握操作系统的基本原理及功能, 具有初步分析实际操作系统、设计、构造和开发现代操作系统的基本能力。
二、内容及要求题目:进程调度算法的设计设计要求:①设计进程控制块PCB表结构,分别适用于优先数调度算法和循环轮转调度算法。
②建立进程就绪队列。
对两种不同算法编制入链子程序。
③编制两种进程调度算法:1)优先数调度;2)循环轮转调度小组成员:组长:专业班级:计算机11-2第3组指导教师:许家昌一、目的通过课程设计, 加深对操作系统各资源管理模块的理解,掌握操作系统的基本原理及功能, 具有初步分析实际操作系统、设计、构造和开发现代操作系统的基本能力。
二、内容及要求题目:银行家算法设计设计要求:编制银行家算法通用程序,并检测所给状态的系统安全性。
设进程I提出请求Request[N],则银行家算法按如下规则进行判断。
操作系统课程设计报告

课程设计报告课程名称操作系统课题名称生产、消费面包问题一、设计内容与设计要求1.设计内容:[问题描述] 面包房有五个盘子,生产者生产面包放入其中。
生产时不能消费。
盘子中有面包才能消费。
五只盘子全满时不能生产。
[基本功能](1)生产者进程(2)消费者进程2.设计要求:课程设计报告规范1)需求分析a.程序的功能。
b.输入输出的要求。
2)概要设计a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。
b.课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。
3)详细设计a.采用C++语言定义相关的数据类型。
b.写出各模块的类C码算法。
c.画出各函数的调用关系图、主要函数的流程图。
4)调试分析以及设计体会a.测试数据:准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果。
b.程序调试中遇到的问题以及解决问题的方法。
c.课程设计过程经验教训、心得体会。
5)使用说明用户使用手册:说明如何使用你编写的程序,详细列出每一步的操作步骤。
6)书写格式a.设计报告要求用A4纸打印成册:b.标题为:黑体二号(加粗):正文为:宋体5号。
行间距为固定值22。
c. 封面格式如第1页。
7)附录a.参考书目b.源程序清单(带注释)●考核方式指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。
具体考核标准包含以下几个部分:1、平时出勤(占10%)2、系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)3、程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)4、设计报告(占30%)注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
5、独立完成情况(占10%)。
●课程验收要求①运行所设计的系统。
os课程设计报告

os课程设计报告一、教学目标本课程的教学目标是使学生掌握OS(操作系统)的基本概念、原理和关键技术,能够运用OS的基本理论分析和解决实际问题。
1.掌握操作系统的定义、功能和作用。
2.理解操作系统的基本原理,包括进程管理、内存管理、文件系统和输入/输出管理。
3.熟悉常见的操作系统,如Windows、Linux和Unix。
4.能够使用操作系统进行基本的上机操作。
5.掌握基本的操作系统命令和操作技巧。
6.能够运用操作系统的基本原理分析和解决实际问题。
情感态度价值观目标:1.培养学生对操作系统的兴趣和好奇心,激发学生对计算机科学的热爱。
2.培养学生遵守计算机伦理和信息安全意识,提高学生的信息素养。
二、教学内容本课程的教学内容主要包括操作系统的定义、功能和作用,以及操作系统的四大基本原理:进程管理、内存管理、文件系统和输入/输出管理。
1.操作系统的定义、功能和作用:介绍操作系统的概念,解释操作系统在计算机系统中的作用和功能,分析操作系统的重要性。
2.进程管理:讲解进程的定义、特征和状态,介绍进程管理的基本方法,包括进程的创建、调度和同步。
3.内存管理:讲解内存的分类、分配和回收策略,介绍内存管理的技术,如分页、分段和虚拟内存。
4.文件系统:讲解文件和目录的概念,介绍文件系统的结构和管理方法,包括文件的创建、删除和权限管理。
5.输入/输出管理:讲解输入/输出设备的概念,介绍输入/输出管理的基本方法,包括设备驱动程序、中断处理和DMA传输。
三、教学方法本课程采用讲授法、讨论法和案例分析法相结合的教学方法。
1.讲授法:通过教师的讲解,使学生掌握操作系统的基本概念、原理和关键技术。
2.讨论法:学生进行小组讨论,引导学生主动思考和探索问题,提高学生的动手能力和团队协作能力。
3.案例分析法:通过分析实际案例,使学生能够将操作系统的理论知识运用到实际问题中,提高学生的分析和解决问题的能力。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。
os课程设计实验

os课程设计实验一、教学目标本课程的教学目标是使学生掌握操作系统的基本原理和关键技术,能够熟练使用操作系统,并具备一定的操作系统设计和实现能力。
具体来说,知识目标包括了解操作系统的概念、结构和功能,掌握进程管理、内存管理、文件系统、输入/输出系统等基本原理和技术;技能目标包括能够使用操作系统进行日常工作和学习,具备基本的操作系统故障排除和性能优化能力;情感态度价值观目标包括培养学生对操作系统的兴趣和好奇心,培养学生认真负责、团队合作的精神。
二、教学内容根据课程目标,本课程的教学内容主要包括操作系统的概念、结构、功能及其关键技术。
具体包括:第一章操作系统概述,介绍操作系统的定义、发展历程、作用和基本组成;第二章进程管理,介绍进程的概念、状态、控制以及调度算法;第三章内存管理,介绍内存的概念、分配策略和回收算法;第四章文件系统,介绍文件和目录的结构、存储设备的管理以及文件系统的实现;第五章输入/输出系统,介绍输入/输出设备的管理、中断处理和设备驱动程序。
三、教学方法为了达到课程目标,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。
讲授法用于向学生传授操作系统的理论知识,使学生掌握基本概念和原理;讨论法用于引导学生深入思考操作系统的问题,培养学生的分析问题和解决问题的能力;案例分析法用于使学生了解操作系统的实际应用,提高学生的实践能力;实验法用于训练学生的动手能力,使学生熟练掌握操作系统的使用和维护技巧。
四、教学资源为了支持教学内容和教学方法的实施,我们将选择和准备适当的教学资源。
教材方面,我们选择《操作系统原理与实践》作为主教材,辅助以《操作系统设计与实现》等参考书;多媒体资料方面,我们将收集和制作与操作系统相关的PPT、视频等资料,以便更直观地展示操作系统的原理和实现;实验设备方面,我们将准备计算机实验室,使学生能够通过实际操作来加深对操作系统的理解和掌握。
五、教学评估本课程的评估方式包括平时表现、作业、考试等,旨在全面、客观、公正地反映学生的学习成果。
OS课程设计报告

计算机学院课程设计报告
(学院)系: 计算机学院
专业: 软件工程
姓名: 卫兆伟
班级: 一班
学号: 0602211042
指导教师: 肖友清
2009 年1 月10 日
设计思路:
首先,定义访问序列的结构如下:
typedef struct
//定义磁道访问请求序列的结构,其中data为序列数据,flag为数据访问状态标记
{
int data;
int flag;
}node;
然后,申请一个和请求访盘序列一样大的指针数组空间serial用来存放对原始申请访盘序列。
再申请一个比请求访盘序列大1的指针数组空间queue用来复制这些磁道,并把当前磁头放入进行再次排列。
获得当前磁头location所在的位置,然后查找当前位置前后未访问过的磁头,并把离当前磁头最近的作为访问对象,访问完输出并使之成为当前磁头,再进行递归访问,直至访问完所有的磁头。
磁道数的计算:将当前磁头和按算法访问的磁头依次存入temp队列中,用前一个减去后一个数据累加得到磁头移动总数sum;。
OS课程设计实验报告

计算机与信息学院操作系统课程设计报告专业班级计算机科学与技术08-5班学生姓名及学号邹纯纯 20082681课程教学班号任课教师刘晓平、李琳、田卫东实验指导教师李琳实验地点逸夫楼5072010 ~ 2011 学年第二学期目录第一章课程设计任务、要求、目的 (3)第二章原理及算法描述 (3)第三章开发环境 (4)第四章重要算法和设计思路描述 (4)第五章程序实现---数据结构 (7)第六章程序实现---程序清单 (8)第七章总结 (24)第八章参考文献 (24)第一章课程设计任务、要求、目的1.1课程设计任务本次课程设计的任务是在windows环境下实现兼容Unix/Linux操作系统的命令接口,并实现一些指定的命令功能。
1.2课程设计要求和目的1、为Windows操作系统建立一个兼容Unix命令的命令接口;2、实现命令包括ls,cat,cp,mv,md,rd,cd,sort,more,print,命令的内容与详细格式请查阅unix命令手册;3、可以字符形式接收命令,执行命令,然后显示命令执行结果。
第二章原理及算法描述计算机的操作我们通常使用的是windows操作系统,在windows2000以上的版本中,我们只需在“搜索程序和文件”选项框中输入cmd命令进入windows 操作系统中就可以达到实现系统相关功能的目的。
同样在Unix和Linux操作平台中,也可以实现相关命令以完成操作系统的相关操作。
现在我们必须实现这样一种方法,即为windows操作系统建立一个兼容Unix 命令的命令接口。
在主程序中新建一个Windows_Unix.exe文件,然后调用相关实现相关Unix命令的函数实现命令功能。
具体命令的实现主要通过系统的API函数调用与之功能相同或相似的Dos 命令,这样就可以实现在Windows操作系统中虚拟地实现Unix命令。
第三章开发环境1、硬件环境:微型计算机。
2、软件环境:Windows 7 操作系统,语言环境为Visual C++ 6.0。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南通大学计算机学院操作系统教程课程设计报告书设计题目1.优先级调度算法2.首次适应算法专业班级软外122学生姓名宋俞璋学号1213122050指导教师周建美日期2014年7月3日目录一级目录1……………………………………………………………页码一级目录2……………………………………………………………页码…………1.课程设计题目:(1)设计一个按优先级调度的算法实现处理机调度(2)采用首次适应算法管理内存2.课程设计目的:(1)进程调度是处理机管理的核心内容。
本实验要求用高级语言编写模拟进程调度程序,以便加深理解有关进程控制快、进程队列等概念,并体会和了解优先级算法的具体实施办法。
(2)一个好的计算机系统不仅要有足够的存储容量,较高的存取速度和稳定可靠的存储器,而且能够合理的分配和使用这些主存空间。
当用户提出申请主存空间的要求时,存储管理能够按照一定的策略分析主存的使用情况,找出足够的空间分配给申请者;当作业运行完毕,存储管理要回收作业占用的主存空间。
本实验实现在可变分区存储管理方式下,采用最先适应算法对主存空间进行分配和回收,以加深了解操作系统的存储管理功能。
3. 课程设计要求:实验一:(1)假设系统中有3~5个进程,每个进程由一个进程控制块(PCB)来代表。
进程的优先数、要求运行时间和估计运行时间由用户程序任意设计,且优先数越低,优先级越高。
调度时,总是选择优先级最高的进程运行。
(2)为了调度方便,设计一个指针指向就绪队列的第一个进程。
另外再设一个当前运行进程指针,指向当前正运行的进程。
(3)处理机调度时,总是选择已经到达队列的优先级最高的进程运行。
为了采用动态优先级调度,进程每运行一次,其优先级就减1。
由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行:优先数加1和估计运行时间减1用这个操作来模拟进程的一次运行。
(4)进程运行一次后,若剩余的运行时间不为0,且其优先级低于就绪队列的其他进程的优先级,则选择一个高优先级进程抢占CPU;若剩余运行时间为0,则把它的状态改为完成状态“C”,并撤出就绪队列。
(5)若就绪队列不空,则重复上述的步骤(3)和(4)直到所有进程都运行完为止。
(6)在所设计的程序中应有显示或打印语句,以显示或打印每次被选中进程的进程名字、运行一次后进程的变化以及就绪队列中的各进程排队情况等。
实验二:一个好的计算机系统不仅要有足够的存储容量,较高的存取速度和稳定可靠的存储器,而且能够合理的分配和使用这些主存空间。
当用户提出申请主存空间的要求时,存储管理能够按照一定的策略分析主存的使用情况,找出足够的空间分配给申请者;当作业运行完毕,存储管理要回收作业占用的主存空间。
本实验实现在可变分区存储管理方式下,采用最先适应算法对主存空间进行分配和回收,以加深了解操作系统的存储管理功能。
4. 课程设计报告内容实验一:(1)数据结构设计如下:struct pcb { /* 定义进程控制块PCB */char name[10]; //进程名char state; //进程状态int super; //优先级数int ntime; //需要运行时间int rtime; //已运行时间(2)流程图实验二:(1)基本思想空闲分区链以地址递增的次序连接。
在分配内存时,从链首开始顺序查找,直至找到一个大小能够满足要求的空闲分区为止;然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍然留在空闲链中。
若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败。
(2)主要数据结构typedef struct FreeLink{ //空闲链struct FreeLink *prior;char name;int start;int size;bool flag;struct FreeLink *next;}* ptr,*head;head top;ptr p;(3)内存分配算法当有进程要求分配主存时,依据首次适应算法从链头开始,延链查找一个足以容纳该进程的空闲区。
若这个分区比较大,则一分为二,一部分分配给进程,另一部分作为空闲区仍留在链中的当前位置,修改它的上一个空闲区的前向指针值为再加上分配给进程的分区大小,下一个空闲区的后向指针值为再加上分配给进程的分区大小,使链保持完整。
若这个分区的大小正好等于进程的大小,该分区全部分配给进程,并将该空闲区从链中摘除(即修改下一个空闲区的后向指针=该空闲区后向指针,上一个空闲区的前向指针=该空闲区的前向指针)。
再在已分配区表中找一个空表目,登记刚刚分配的内存始址、长度和进程号。
(4)内存的回收当进程运行完成,释放内存时,通过输入进程号,来回收进程占用的分区。
在回收时,释放区与空闲区相邻接的情况要考虑4种情况:⊙释放区下邻空闲区⊙释放区上邻空闲区⊙释放区与上下空闲区均相邻⊙释放区与上下空闲区均不相邻(5)程序流程图※空闲链的首次适应算法分配流程图※空闲链的首次适应算法回收流程图(6)截图5.设计总结及体会(1)首先这次实验的难度不小,它必须在熟悉掌握数据结构的链表和队列的前提下才能完成,这次实验中用了三个队列,就绪队列,执行队列和完成队列,就绪队列中的优先级数是有序插入的,当进行进程调度的时候,需要先把就绪队列的队首节点(优先级数最大的节点)移入执行队列中,当执行进程结束后,判断该进程是否已经完成,如果已经完成则移入完成队列,如果没有完成,重新有序插入就绪队列中,这就是这次实验算法的思想。
(2)通过本实验,深刻地理解到了利用可变分区,采用首次适应算法为作业分配内存的过程。
该算法倾向于优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲区。
这给为以后的作业分配大的内存空间创造了条件。
其缺点是地低址部分不断被划分,会留下很多难以利用的,很小的空闲区,而每次查找又都是从低地址部分开始,这无疑会增加查找可用的空闲区时的开销。
参考书目:[1]孙钟秀,《操作系统教程》,北京,高等教育出版社,2008.[2]张丽芬,刘昕,刘利雄《操作系统实验教程》,北京,清华大学出版社,2010附录:(源程序)实验1:#include <stdio.h>#include <stdlib.h>#include <iostream>#define getpch(type) (type*)malloc(sizeof(type))using namespace std;struct pcb{char pname[10];char state;int super;int ntime;int rtime;struct pcb* link;}*ready=NULL,*p;typedef struct pcb PCB;void sort(){PCB *first, *second;int insert=0;if((ready==NULL)||((p->super)>(ready->super))){p->link=ready;ready=p;}else{first=ready;second=first->link;while(second!=NULL){if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,插入到当前进程前面*/ {p->link=second;first->link=p;second=NULL;insert=1;}else /* 插入进程优先数最低,则插入到队尾*/{first=first->link;second=second->link;}}if(insert==0) first->link=p;}}void input() /* 建立进程控制块函数*/{int i,num;cout<<"请输入进程数:";cin>>num;if(num>=5){cout<<"为了便于演示,请输入一个小于5的数!\n" <<"请输入进程号:\n";cin>>num;}if(num<5){for(i=0;i<num;i++){cout<<"进程号No.\n"<<i+1;p=getpch(PCB);cout<<"输入进程名:\n";cin>>p->pname;cout<<"输入进程优先数:\n";cin>>p->super;cout<<"输入进程运行时间:\n";cin>>p->ntime;cout<<endl;p->rtime=0;p->state='w';p->link=NULL;sort(); /* 调用sort函数*/}}}int space(){int l=0; PCB* pr=ready;while(pr!=NULL){l++;pr=pr->link;}return(l);}void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/{cout<<"qname\tstate\tsuper\tndtime\truntime\n";cout<<pr->pname;cout<<"\t"<<pr->state;cout<<"\t"<<pr->super;cout<<"\t"<<pr->ntime;cout<<"\t"<<pr->rtime;cout<<endl;}void check() /* 建立进程查看函数 */{PCB* pr;cout<<"\n当前正在运行的进程是: \n"<<p->pname; /*显示当前运行进程*/ disp(p);pr=ready;cout<<"\n当前就绪队列状态为:\n"; /*显示就绪队列状态*/while(pr!=NULL){disp(pr);pr=pr->link;}}void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/{cout<<"进程"<<p->pname <<"已完成.\n";free(p);}void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/{(p->rtime)++;if(p->rtime==p->ntime)destroy(); /* 调用destroy函数*/else{(p->super)--;p->state='w';sort(); /*调用sort函数*/}}void cpuprio() /*主函数*/{int len,h=0;char ch;input();len=space();while((len!=0)&&(ready!=NULL)){ch=getchar();h++;cout<<"优先级最高的进程号是NO."<<h;cout<<",其优先级是\n"<<ready->super<<endl; p=ready;ready=p->link;p->link=NULL;p->state='R';check();running();cout<<"按回车键继续\n";ch=getchar();}cout<<"进程已经完成\n";ch=getchar();}实验2:#include <iostream.>#include <malloc.h>#include <stdlib.h>using namespace std;typedef struct FreeLink{//定义空闲链struct FreeLink *prior;char name;int start;int size;bool flag;struct FreeLink *next;}* ptr,*head;head top;ptr p;void print(){//将内存分配情况打印到屏幕上p=top;cout<<"************************内存分配情况表************************"<<endl;cout<<"区号\t\t"<<"起始位置\t"<<"区间长度\t"<<"区间状态\t"<<endl;do{cout<<p->name<<"\t\t"<<p->start<<"\t\t"<<p->size<<"\t\t";if(p->flag==false)//flag为false,表明该分区空闲{cout<<"空闲"<<endl;}else{cout<<"已占用"<<endl;}p=p->next;}while(p!=NULL);}void clear(){//结束操作时清空“内存”以备其他操作do{p=top;top=top->next;free(p);}while(top!=NULL);cout<<"内存已清空!";}void hebing(ptr &p){//若被操作的内存有相邻空闲区则将空闲区拼接合并int x;if(p->prior->flag==false&&p->next->flag==false)x=1; //释放区与上下空闲区均相邻if((p->prior->flag==false&&p->next->flag==true)||(p->prior->flag==false&&p->next== NULL))x=2;//释放区下邻空闲区if((p->prior->flag==true&&p->next->flag==false)||(p->prior==NULL&&p->next->flag==f alse))x=3;//释放区上邻空闲区if((p->prior->flag==true&&p->next->flag==true)||(p->prior==NULL&&p->next->flag==tr ue)||(p->prior->flag==true&&p->next==NULL))x=4;//释放区与上下空闲区均不相邻switch(x){case 1:p->next->prior=p->prior;p->prior->next=p->next;p->prior->size=p->prior->size+p->size+p->next->size;p->prior->next=p->next->next;if(p->next->next!=NULL)p->next->next->prior=p->next->prior;free(p->next);//释放free(p);break;case 2:if(p->next==NULL)//p为最后一个分区{p->prior->next=p->next;}else{p->next->prior=p->prior;p->prior->next=p->next;}p->prior->size=p->prior->size+p->size;free(p);break;case 3:if(p->prior==NULL)//p为第一个分区{top=p->next;p->next->prior=NULL;p->next->start=p->start;p->next->size=p->next->size+p->size;}else{p->next->prior=p->prior;p->prior->next=p->next;p->next->start=p->start;p->next->size=p->next->size+p->size;}free(p);break;case 4:p->name='*';//将释放区移至链首并标记为未被占用 p->flag=false;break;}}void allocate(ptr &p){//最先适应法的内存分配函数FreeLink *fl=(FreeLink *)malloc(sizeof(FreeLink));cout<<"请输入要分配内存的进程号:";cin>>fl->name;cout<<"请输入要分配内存的大小:";cin>>fl->size;fl->flag=true;do{if(p->flag==false&&p->size>fl->size){fl->start=p->start;p->start=fl->start+fl->size;p->size=p->size-fl->size;fl->next=p;fl->prior=p->prior;p->prior->next=fl;p->prior=fl;goto a;}if(p->flag==false&&p->size==fl->size){p->flag=fl->flag;p->name=fl->name;free(fl);goto a;}p=p->next;}while(p!=NULL);cout<<"内存过小,分配失败!"<<endl;goto b;a: cout<<"分配成功!"<<endl;b: ;//啥也不做}void huishou(ptr &p){//内存回收函数char n = ' ';cout<<"请输入要回收的内存对应的进程号:";cin>>n;do{if(p->flag==true&&p->name==n){hebing(p);goto c;}p=p->next;}while(p!=NULL);cout<<"内存未能分配给该进程,回收失败!"<<endl;goto d;c: cout<<"内存回收成功!"<<endl;d: ;}int firstfit(){//最先适应法char choice=' ';print();ptr pcb=(FreeLink *)malloc(sizeof(FreeLink));pcb->next=top;pcb->prior=top->prior;top->prior=pcb;pcb->start=top->start;cout<<"请输入要为系统分配的内存块号:";cin>>pcb->name;cout<<"请输入要分配内存的大小:";goto f;e: cout<<"超过内存最大容量,请重新输入要分配内存的大小:"; f: cin>>pcb->size;if(pcb->size>256)goto e;top->size=top->size-pcb->size;top=pcb;top->flag=true;top->next->start+=top->size;print();while(true){do{p=top->next;cout<<"请从下列选项中进行选择:"<<endl;cout<<"1.分配内存"<<endl;cout<<"2.回收内存"<<endl;cout<<"3.结束操作"<<endl;cout<<"请输入你的选择:";cin>>choice;}while(choice!='1'&&choice!='2'&&choice!='3');switch(choice){case '1':allocate(p);print();break;case '2':huishou(p);print();break;case '3':clear();return 0;break;}}}int main(){//主函数ptr free=(FreeLink *)malloc(sizeof(FreeLink));top=free;top->name='*';top->start=0;top->size=256;top->flag=false;top->prior=NULL;top->next=NULL;cout<<endl;cout<<"************************ 首次适应算法 ************************"<<endl;cout<<endl;firstfit();}。