动态分区分配存储管理组织系统
存储管理动态分区分配及回收算法

存储管理动态分区分配及回收算法存储管理是计算机系统中的重要组成部分,它负责管理和分配计算机中的物理内存资源。
在计算机系统中,通过动态分区分配和回收算法来实现对这些资源的有效利用。
本文将介绍动态分区分配和回收算法的原理、主要算法以及优缺点。
动态分区分配是一种灵活、动态的内存分配方式,它根据进程的需求动态地分配内存空间。
动态分区分配算法有多种,其中最常用的有首次适应算法、最佳适应算法和最坏适应算法。
首次适应算法(First Fit)是最常用的分配算法之一、它从低地址开始寻找第一个满足要求的空闲分区来分配进程。
这种算法的优点是简单、高效,但是可能会产生大量的碎片空间,降低内存的利用率。
最佳适应算法(Best Fit)是在所有空闲分区中找到一个大小最适合进程的分区来分配。
它的主要思想是选择一个更接近进程大小的空闲分区,以减少碎片空间的产生。
然而,这种算法的缺点是需要遍历整个空闲分区链表,因此效率相对较低。
最坏适应算法(Worst Fit)与最佳适应算法相反,它选择一个大小最大的空闲分区来分配进程。
这种算法的好处是可以尽可能地保留大块的碎片空间,以便后续分配使用。
但是,它也会导致更多的碎片空间浪费。
动态分区的回收算法是用于回收被释放的内存空间并合并相邻的空闲分区,以尽量减少碎片空间的产生。
常见的回收算法有合并相邻空闲分区算法和快速回收算法。
合并相邻空闲分区算法会在每次有分区被回收时,检查是否有相邻的空闲分区可以合并。
如果有,就将它们合并为一个大的空闲分区。
这样可以最大程度地减少碎片空间,提高内存的利用效率。
快速回收算法是一种将被释放的分区插入到一个空闲分区链表的头部,而不是按照地址顺序进行插入的算法。
这样可以减少对整个空闲分区链表的遍历时间,提高回收的效率。
总结起来,动态分区分配和回收算法在存储管理中起着重要的作用。
首次适应算法、最佳适应算法和最坏适应算法是常用的动态分区分配算法,它们各自有着不同的优缺点。
实验三 动态分区存储管理

实验三存储管理动态分区存储管理
实验目的
•熟悉并掌握动态分区分配的各种算法。
•熟悉并掌握动态分区中分区回收的各种情
况,并能够实现分区合并。
实验内容及要求
•用高级语言模拟实现动态分区存储管理,要求:
–分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至少一种。
熟悉并掌握各种算法的空闲区组织方式。
–分区的初始化——可以由用户输入初始分区的大小。
(初始化后只有一个空闲分区,起始地址为0,大小是用户输入的大小)–分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。
–分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出来。
(注意:不存在的作业号要给出错误提示!)–分区的显示:任何时刻,可以查看当前内存的情况(起始地址是什么,大小多大的分区时空闲的,或者占用的,能够显示出来)
实验报告要求
•实验报告应包含但不限于以下内容:–设计图(结构图/流程图)和源代码;
–使用的编程语言和系统环境;
–结果截图;
–对结果截图的解释性说明。
注意事项
•三个动态分区分配算法可以使用一套程序,差别只在空闲分区链(表)的排序策略。
•至少完成一个分配算法。
•需完成回收算法。
动态分区分配存储管理系统

动态分区分配存储管理系统一、设计目的与内容用高级语言编写和调试一个动态分区内存分配程序,演示实现下列两种动态分区分配算法1)首次适应算法2)循环首次适应算法1.内存中有0-100M的空间为用户程序空间,最开始用户空间是空闲的。
2.作业数量、作业大小、进入内存时间、运行时间需要通过界面进行输入。
3.可读取样例数据(要求存放在外部文件中)进行作业数量、作业大小、进入内存时间、运行时间的初始化。
4.根据作业进入内存的时间,采用简单的先进先出原则进行从外存到内存的调度,作业具有等待(从外存进入内存执行)、装入(在内存可执行)、结束(运行结束,退出内存)三种状态。
5.能够自动进行内存分配与回收,可根据需要自动进行紧凑与拼接操作。
二、算法的基本思想1、定义基本结构:1作业结构:typedefstructJOB{intnum;//作业号intsize;//作业大小intctime;//作业进入时间intrtime;//作业运行时间intstate;//作业状态}Job;2)分区结构:typedefstructDuLNode{intID;//分区号intstart;//开始地址intsize;//大小intstate;//0=尚未使用1=使用2=释放structDuLNode*prior;〃前驱指针structDuLNode*next;//后即指针}DuLNode,*DuLinkList;2、基本操作:intFirstfit(int);//首次适应算法intNext_fit(int);//循环首次适应算法voidshowJob(int);//显示作业表voidshowPartiton(DuLinkList);//显示分区表DuLinkListInitpartitionList(DuLinkList&p);//初始化voidhuishou(DuLinkListpl3,DuLinkList&pl);//回收函数intPutin(int&口);//输入函数,输入作业相关信息3、首次适应算法空闲分区链以地址递增的次序链接,分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,取消的空闲分区仍留在空闲链中。
操作系统的系统资源管理

操作系统的系统资源管理操作系统是一种管理计算机硬件和软件资源的核心软件,它起着至关重要的作用,可以有效地管理和分配系统资源,实现对计算机系统的优化和提高。
系统资源管理是操作系统的重要组成部分,它包括内存管理、进程管理、文件管理和设备管理等子系统。
本文将分别介绍这些系统资源管理的主要功能和方法。
一、内存管理内存管理是指操作系统对计算机内存进行分配和调度的过程。
它的主要功能是有效地利用内存资源,避免内存碎片和冲突,保证程序的正确运行和系统的高效运作。
内存管理的主要方法包括内存分区、虚拟内存和页式存储等。
1. 内存分区内存分区是将计算机的内存划分为若干个固定大小的区域,每个区域包含一个进程或作业。
它可以通过静态分配或动态分配的方式实现。
静态分配是指在进程运行之前分配好内存空间,动态分配则是在进程运行时动态地分配和回收内存空间。
2. 虚拟内存虚拟内存是一种扩展内存的技术,通过将部分暂时不使用或不常用的程序和数据存储在磁盘上,以释放出更多的内存空间。
当这些程序和数据需要时,操作系统会将其从磁盘读入内存。
虚拟内存管理可以充分利用磁盘的容量,提高系统的整体性能。
3. 页式存储页式存储是一种按页面(固定大小的存储单元)进行分割和管理内存的方法。
当需要将一个程序或数据存储在内存中时,操作系统会将其划分为若干个页面,并将这些页面映射到物理内存的页面框中。
通过页面置换算法,可以有效地管理内存,保证内存中总是有最相关的页面。
二、进程管理进程管理是指操作系统对进程进行调度和控制的过程。
进程是程序的一次执行过程,它具有独立的地址空间和运行状态。
操作系统通过进程管理可以有效地控制系统中的多个进程,实现进程的创建、撤销、调度和通信等功能。
1. 进程调度进程调度是指操作系统根据一定的调度算法,决定哪个进程可以运行和使用处理器。
调度算法的选择需要平衡各个进程的优先级、响应时间和资源占用等因素,以提高系统的响应能力和吞吐量。
2. 进程通信进程通信是指操作系统提供的一种机制,用于进程之间的信息传递和共享资源。
操作系统问答题汇编

操作系统问答题汇编操作系统问答题汇编一、操作系统概述1.什么是操作系统?操作系统是一种软件,它管理和协调计算机硬件和软件资源,并为应用程序提供运行环境。
2.操作系统的主要功能有哪些?操作系统的主要功能包括进程管理、内存管理、文件系统管理、设备管理和用户界面等。
3.什么是进程管理?进程管理是指操作系统控制和协调程序执行的活动,包括进程的创建、调度、同步、通信和终止等。
4.什么是内存管理?内存管理是操作系统对物理内存的管理,包括内存分配、地质转换、内存保护和虚拟内存等。
5.什么是文件系统管理?文件系统管理是指操作系统对文件和目录的组织和管理,包括文件的创建、读写、删除和权限控制等。
6.什么是设备管理?设备管理是指操作系统对计算机硬件设备的管理和控制,包括设备驱动程序的加载和设备的分配、操作和维护等。
7.什么是用户界面?用户界面是操作系统与用户之间进行交互的接口,包括命令行界面和图形用户界面等。
二、进程管理1.什么是进程?进程是程序的执行实例,是操作系统中最基本的执行单位。
2.进程有哪些状态?进程有就绪、运行、阻塞和终止等状态。
3.进程调度算法有哪些?常见的进程调度算法有先来先服务(FCFS)、最短作业优先(SJF)、轮转法(RR)和优先级调度等。
4.进程同步有哪些机制?常见的进程同步机制有互斥量、信号量、条件变量和管程等。
5.进程通信有哪些方式?进程通信的方式包括共享内存、消息传递、管道和信号等。
6.进程的创建和终止过程是怎样的?进程的创建过程包括分配资源、加载程序、设置上下文和初始化状态等;进程的终止过程包括释放资源、保存状态和通知父进程等。
三、内存管理1.什么是内存分配?内存分配是指操作系统将物理内存分配给进程使用的过程。
2.内存分配有哪些方式?常见的内存分配方式包括连续内存分配、动态分区分配和页式分配等。
3.什么是地质转换?地质转换是指操作系统将逻辑地质转换为物理地质的过程。
4.什么是内存保护?内存保护是指操作系统对内存进行权限控制,防止进程非法访问。
动态分区管理方式及动态分区算法

动态分区管理方式及动态分区算法一、动态分区概述在操作系统中,内存管理是一个非常重要的部分。
在实际的应用中,程序的内存需求是会发生变化的,因此需要一种灵活的内存管理方式来满足不同程序的内存需求。
动态分区管理方式应运而生,它可以根据程序的需求,灵活地分配和回收内存空间,是一种高效的内存管理方式。
二、动态分区管理方式动态分区管理方式是指将内存划分为多个大小不等的分区,每个分区都可以被分配给进程使用,当进程终止时,分区将被回收。
动态分区管理方式通常通过动态分区算法来实现,下面将介绍几种常见的动态分区算法。
三、首次适应算法首次适应算法是最简单和最直观的动态分区分配算法。
它的基本思想是在空闲分区链表中按照位置区域顺序查找第一个能够满足进程大小需求的空闲分区,并将其分配给进程。
首次适应算法的优点是实现简单,分区利用率较高,但缺点是会产生大量的不连续碎片。
四、最佳适应算法最佳适应算法是在空闲分区链表中查找满足进程大小需求的最小空闲分区,并将其分配给进程。
最佳适应算法的优点是可以减少外部碎片,缺点是查找适合的空闲分区会花费较长的时间。
五、最坏适应算法最坏适应算法是在空闲分区链表中查找满足进程大小需求的最大空闲分区,并将其分配给进程。
最坏适应算法的优点是能够产生较小的碎片,但缺点是会导致剩余分区较多,影响分区利用率。
六、动态分区管理方式的优缺点动态分区管理方式相比于静态分区管理方式有很多优点,比如可以灵活地满足不同程序的内存需求,可以动态地合并和分割分区,提高了内存的利用率等。
但是动态分区管理方式也有一些缺点,比如会产生碎片,分配和回收内存的开销较大等。
七、结语动态分区管理方式及其算法在实际应用中有着广泛的应用,通过合理选择动态分区算法,可以提高内存的利用率,改善系统性能。
也需要注意动态分区管理方式可能产生的碎片问题,可以通过内存紧缩等手段来解决。
希望本文对读者有所帮助。
动态分区管理方式及动态分区算法八、碎片问题与解决方法在动态分区管理方式中,经常会出现碎片问题,包括内部碎片和外部碎片。
动态分区分配操作系统操作方法实验步骤

动态分区分配操作系统操作方法实验步骤1.引言1.1 概述概述部分:在计算机系统中,动态分区分配是一种重要的操作系统操作方法。
它是指在运行时根据进程的内存需求动态地将系统内存分配给进程,以实现内存资源的高效利用。
动态分区分配操作方法在现代操作系统中被广泛应用,例如Windows、Linux等。
通过合理的动态分区分配策略,可以提升系统的性能和资源利用率。
本文将对动态分区分配操作系统操作方法进行详细介绍和实验步骤的说明。
首先,我们将介绍动态分区分配的背景和意义,包括其在操作系统中的作用和应用场景。
其次,我们将详细讨论实验的具体步骤,包括如何进行动态分区分配操作、如何测试相关的性能指标等。
本文的目标是帮助读者了解动态分区分配操作系统操作方法的基本原理和实践技巧。
同时,通过实际操作和实验验证,读者将能够更好地理解动态分区分配的概念和操作过程,提升对操作系统的理解和应用能力。
在接下来的章节中,我们将分别介绍动态分区分配操作系统操作方法的背景和实验步骤,并给出相应的实例和案例分析。
最后,我们将对实验结果进行总结和展望,探讨动态分区分配操作方法的发展前景和可能的研究方向。
通过本文的阅读和实验操作,读者将能够对动态分区分配操作系统操作方法有一个全面的了解,为进一步研究和应用提供基础和指导。
同时,我们也欢迎读者对本文内容进行补充和扩展,以促进相关领域的进一步发展和应用。
1.2 文章结构文章结构部分的内容可以从以下角度进行描述:文章结构是指整篇文章的组织框架和内容安排。
合理的文章结构可以使读者更好地理解文章的主题和内容,帮助读者快速找到所需信息并形成完整的认识。
本文将按照以下结构进行论述:1. 引言:在引言部分,我们将对动态分区分配操作系统操作方法的背景和意义进行介绍,明确文章的目的和重要性。
2. 正文:正文是文章的核心部分,将分为两个要点进行叙述。
2.1 第一个要点:动态分区分配操作系统操作方法。
首先,我们将对动态分区分配的背景进行介绍,解释其在操作系统中的应用和意义。
动态分区分配以及动态重定位分配四种方式

5)快速适应算法(quick fit) 该算法又称为分类搜索法,是将空闲分区根据其容量 大小进行分类,对于每一类具有相同容量的所有空闲分 区,单独设立一个空闲分区链表,这样,系统中存在多 个空闲分区链表,同时在内存中设立一张管理索引表, 该表的每一个表项对应了一种空闲分区类型,并记录了 该类型空闲分区链表表头的指针。空闲分区的分类是根 据进程常用的空间大小进行划分,如2 KB、4 KB、8 KB 等,对于其它大小的分区,如7 KB这样的空闲区,既可 以放在8 KB的链表中,也可以放在一个特殊的空闲区链 表中。
4)最坏适应算法(worst fit) 最坏适应分配算法要扫描整个空闲分区表或链表,总 是挑选一个最大的空闲区分割给作业使用,其优点是可 使剩下的空闲区不至于太小,产生碎片的几率最小,对 中、小作业有利,同时最坏适应分配算法查找效率很高。 该算法要求将所有的空闲分区按其容量以从大到小的顺 序形成一空闲分区链,查找时只要看第一个分区能否满 足作业要求。但是该算法的缺点也是明显的,它会使存 储器中缺乏大的空闲分区。最坏适应算法与前面所述的 首次适应算法、循环首次适应算法、最佳适应算法一起, 也称为顺序搜索法。
(2)空闲分区链。为 了实现对空闲分区的分 配和链接,在每个分区 的起始部分,设置一些 用于控制分区分配的信 息,以及用于链接各分 区所用的前向指针;在 分区尾部则设置一后向 指针,通过前、后向链 接指针,可将所有的空 闲分区链接成一个双向 链。
前 向 指 针
N+2
N个字节可用
后 向 指 针
N+2
可重定位分区分配
动态重定位的引入 在连续分配方式中,必须把一个系统或用户程序装入 一连续的内存空间。如果在系统中只有若干个小的分区, 即使它们容量的总和大于要装入的程序,但由于这些分 区不相邻接,也无法把该程序装入内存。例如,图4-9(a) 中示出了在内存中现有四个互不邻接的小分区,它们的 容量分别为10 KB、30 KB、14 KB和26 KB,其总容量是 80 KB。但如果现在有一作业到达,要求获得40 KB的内 存空间,由于必须为它分配一连续空间,故此作业无法 装入。这种不能被利用的小分区称为“零头”或“碎 片”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动态分区分配存储管理系统学院专业学号学生姓名指导老师2014年3月19日目录一、设计目的与内容 (4)1、设计目的 (3)2、设计内容 (3)3、设计要求 (3)二、算法的基本思想 (3)1、首次适应算法 (3)2、循环首次适应算法 (3)三、主要功能模块流程图 (4)1、主函数流程图 .......................................................................................................................... .42、首次适应算法流程图.............................................................................................................. .53、循环首次适应算法流程图 ..................................................................................................... .6四、系统测试 ......................................................................................................................................... .7输入界面,按要求输入: (7)五、结论 (8)六、源程序 (9)一、设计目的与内容设计的目的操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。
●进一步巩固和复习操作系统的基础知识。
●培养学生结构化程序、模块化程序设计的方法和能力。
●提高学生调试程序的技巧和软件设计的能力。
●提高学生分析问题、解决问题以及综合利用C 语言进行程序设计的能力。
设计内容:用高级语言编写和调试一个动态分区内存分配程序,演示实现下列两种动态分区分配算法1.首次适应算法2.循环首次适应算法设计要求:1.内存中有0-100M 的空间为用户程序空间,最开始用户空间是空闲的2.作业数量、作业大小、进入内存时间、运行时间需要通过界面进行输入3.可读取样例数据(要求存放在外部文件中)进行作业数量、作业大小、进入内存时间、运行时间的初始化4.根据作业进入内存的时间,采用简单的先进先出原则进行从外存到内存的调度,作业具有等待(从外存进入内存执行)、装入(在内存可执行)、结束(运行结束,退出内存)三种状态。
(为了简化,不考虑CPU 的调度与切换,运行时间为作业在内存中驻留的时间)5.能够自动进行内存分配与回收,可根据需要自动进行紧凑与拼接操作,所有过程均有动态图形变化的显示6.采用可视化界面,可随时暂停显示当前内存分配和使用情况图。
二、算法的思想1、首次适应算法空闲分区链以地址递增的次序链接,分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,取消的空闲分区仍留在空闲链中。
若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。
2、循环首次适应算法在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业三、主要功能模块流程图主函数首次适应算法:循环首次适应算法四、系统测试程序运行实例如下:输入界面,按要求输入:五、结论作业采用数组形式进行存储,起初想用数组模拟分区,但划分记录比较不易,时间空间复杂度较大,容易混乱,遂决定用链表形式模拟分区情况。
基本能运行符合要求,能模拟出动态分区过程及最终结果六.源程序#include <stdio.h>#include <stdlib.h>#include <iostream.h>#include <windows.h>#define Free 0#define Use 1#define MAX_length 100 //最大内存空间为100MB#define MaxNumber 100int FreePartition[MaxNumber]={16,16,8,32,64,32,8,16,64};//空闲分区int ProcessNeed[MaxNumber]={7,18,9,20,35,8};//每个进程需求int FirstPartition[MaxNumber];//首次int CycleFirstPartition[MaxNumber];//循环int PartitionNumber=9,ProcessNum=6;//空闲分区数及进程数bool v();bool v(){int j;cout<<"首次适应算法"<<endl;// FirstPartitionMethod();for(int i=0;i<ProcessNum;i++)//进程for(j=0;j<ProcessNum;j++)//分区{if(FreePartition[j]>=ProcessNeed[i]){ FirstPartition[i] =j;FreePartition[j]-=ProcessNeed[i];break;}}// c_out(FirstPartition);for(i=0;i<ProcessNum;i++)cout<<FreePartition[i]<<" ";cout<<endl;// Beginning();FreePartition[0]=16; FreePartition[1]=16;FreePartition[2]=8;FreePartition[3]=32;FreePartition[4]=64;FreePartition[5]=32;FreePartition[6]=8;FreePartition[7]=16;FreePartition[8]=64;cout<<"循环首次适应算法"<<endl;//CycleFirstPartitionMethod();j=0;for(i=0;i<ProcessNum;i++)//进程for(;;)//分区{if(FreePartition[j]>=ProcessNeed[i]){ CycleFirstPartition[i]=j;FreePartition[j]-=ProcessNeed[i];break;}j++;j=j%PartitionNumber;}//c_out(CycleFirstPartition);for(i=0;i<ProcessNum;i++)cout<<CycleFirstPartition[i]<<" ";cout<<endl;return 1;}//--------------作业结构体数组----------------------------typedef struct JOB{int num; //作业号int size; //作业大小int ctime; //作业进入时间int rtime; //作业运行时间int state; //作业状态}Job;typedef struct DuLNode{int ID; //分区号int start; //开始地址int size; //大小int state; //0=尚未使用1=使用2=释放struct DuLNode *prior;//前驱指针struct DuLNode *next; //后即指针}DuLNode, * DuLinkList;//------------------------------------------------------------------------------- int Firstfit(int);//首次适应算法int Next_fit(int); //循环首次适应算法void showJob(int); //显示作业表void showPartiton(DuLinkList);//显示分区表//-----------------------------------------------------------------------------//---------------------------全局变量------------------------------------------- int f;Job *A; //排序前Job *a; //排序后Job *temp;//-----------------------------功能函数------------------------------------------- void delay(){for(int x = 10000;x>0;x--)for(int y = 1000;y>0;y--);}//-------------------------------------------------------------------------------- //------------------------初始化--------------------------------------------------- DuLinkList InitpartitionList(DuLinkList &p){p=(DuLinkList)malloc(sizeof(DuLNode));//申请空间if(!p)exit(0);p->size=100; //初始化大小printf("输入分区首地址:");scanf("%d",&p->start);p->state=0; //状态置空闲p->ID=0; //分区号p->next=NULL;p->prior=NULL;return p;}//------------------------------------------------------------------------------//-----------------------------输入函数--------------------------------------------- int Putin(int &n){int i;Job temp;printf("请输入任务数目:");scanf("%d",&n);a=(Job*)malloc(n*sizeof(Job));A=(Job*)malloc(n*sizeof(Job));for(i=0;i<n;i++){printf("\n");printf("信息输入:\n\n");printf("作业号:");scanf("%d",&a[i].num);printf("作业大小:");scanf("%d",&a[i].size);printf("作业进入时间:");scanf("%d",&a[i].ctime);printf("作业运行时间:");scanf("%d",&a[i].rtime);a[i].state=0; //默认状态为Free A[i] = a[i];}for(int j = 0;j < n;j++)for(i = j;i< n;i++)if(a[j].ctime > a[i].ctime){temp = a[j];a[j] = a[i];a[i] = temp;}//冒泡排序freopen("data.txt","w",stdout);for (i = 0;i < n;i++){printf("%d %d %d %d\n",a[i].num,a[i].size,a[i].ctime,a[i].rtime);}fclose(stdout);freopen("CON","w",stdout);printf("保存成功\n\n");return 1;}//----------------------------------------------------------------------------------------//-----------------------------读文件-----------------------------------------------------int order(int &n){Job temp;printf("Input the number of the task:\n");scanf("%d",&n);a=(Job*)malloc(n*sizeof(Job));freopen("data.txt","r",stdin);for(int i=0;i<n;i++){scanf("%d",&a[i].num);scanf("%d",&a[i].size);scanf("%d",&a[i].ctime);scanf("%d",&a[i].rtime);}fclose(stdin);freopen("CON","r",stdin);for(int j = 0;j < n;j++)for(i = j;i< n;i++)if(a[j].ctime > a[i].ctime){temp = a[j];a[j] = a[i];a[i] = temp;}return 1;}//------------------------------------------------------------------------ //-------------------------显示分区-------------------------------void showPartition(DuLinkList pl){printf("\n\t\t\t分区表\n");printf("\t---------------------------------------\n");printf("\t 开始地址\t分区号\t大小状态\n");printf("\t---------------------------------------\n");while(pl){printf("\t %d\t\t%d\t%d\t",pl->start,pl->ID,pl->size);if(pl->state == 0)printf("空闲\n");if(pl->state == 1)printf("已分配\n");pl=pl->next;}printf("\t---------------------------------------\n");}//------------------------------------------------------------------------- //---------------------------------回收函数--------------------------------- void huishou(DuLinkList pl3,DuLinkList &pl)//pl3是分区链表指针pl头{while(pl3){if(pl3->state==0){if(pl3->next&&pl3->prior&&pl3->prior->state==0&&pl3->next->state= =1)//{pl3->size+=pl3->prior->size;pl3->start=pl3->prior->start;pl3->state=0;pl3->ID=0;if(pl3->prior->prior){pl3->prior->prior->next=pl3;//pl3与最前一个pl3->prior=pl3->prior->prior;//}else{pl3->prior=pl3->prior->prior;//pl3指向空pl=pl3;pl3=pl;//pl3与头}}elseif(pl3->prior&&pl3->next&&pl3->next->state==0&&pl3->prior->state==1){pl3->size+=pl3->next->size;pl3->state=0;pl3->ID=0;if(pl3->next->next){pl3->next->next->prior=pl3;//建立新链表pl3与最后一个结点pl3->next=pl3->next->next;//}else{pl3->next=pl3->next->next;//指向空}}else if(!pl3->prior){if(pl3->next->state==0){pl3->size+=pl3->next->size;pl3->state=0;pl3->ID=0;if(pl3->next->next)pl3->next->next->prior=pl3;//pl3与最后pl3->next=pl3->next->next;//}else{pl3->state=0;}}else if(!pl3->next){if(pl3->prior->state==0){pl3->size+=pl3->prior->size;pl3->state=0;pl3->ID=0;pl3->start=pl->start;if(pl3->prior->prior){pl3->prior->prior->next=pl3;//pl3与最前pl3->prior=pl3->prior->prior;//}else{ pl3->prior=NULL;//pl3指向空pl=pl3;//pl3与头pl3=pl;//}}else{pl3->state=0;}}elseif(pl3->next&&pl3->prior&&pl3->next->state==0&&pl3->prior->state==0) {pl3->size=pl3->size+pl3->next->size+pl3->prior->size;pl3->state=0;pl3->ID=0;pl3->start=pl3->prior->start;if(pl3->next->next)pl3->next->next->prior=pl3;if(pl3->prior->prior){pl3->prior->prior->next=pl3;pl3->next=pl3->next->next;//指向空pl3->prior=pl3->prior->prior;}else{pl3->next=pl3->next->next;//指向空pl3->prior=pl3->prior->prior;//指向头pl=pl3;pl3=pl;}}}pl3=pl3->next;}}//--------------------------------------------------------------------------------------//----------------------------------首次适应算法---------------------------------------void Firstfit(DuLinkList block_first,int n){int t=1;int num=n;while(t&&num){DuLinkList pl1=block_first,pl2,pl3=block_first;printf("时钟:%d\n",t);DuLNode *p=block_first;DuLNode *q=block_first;for(int x=0;x<n;x++){ if(t==a[x].ctime+a[x].rtime)a[x].state=2;}for(int m=0;m<n;m++){if(t==a[m].ctime+a[m].rtime){num-=1;a[m].state=2;//0 等待1 装入2结束while(q){if(q->ID==a[m].num)//分区号等于作业号时{q->state=Free;//在作业完成时,作业号等于分区号时空闲}q=q->next;}showJob(n);showPartition(block_first);}}for( m=0;m<n;m++){if(a[m].ctime==t){a[m].state=1;printf("作业:%d开始运行,对其分配!",a[m].num);}}for( m=0;m<n;m++){if(t==a[m].ctime){while(pl1&&(pl1->state == 1||pl1->size<a[m].size)) pl1=pl1->next;if(pl1){pl2=(DuLinkList)malloc(sizeof(DuLNode));pl2->start=pl1->start+a[m].size;pl2->state=0;pl2->ID=0;pl2->size=pl1->size-a[m].size;if(pl2->size>5){pl1->size=a[m].size;pl1->state=1;pl1->ID=a[m].num;if(pl1->next)pl1->next->prior=pl2;pl2->next=pl1->next;pl2->prior=pl1;pl1->next=pl2;pl1=block_first;}else{pl1->state=1;pl1->ID=a[m].num;}showJob(n);showPartition(block_first);}else{cout<<"内存不足,等待释放"<<endl;for(int i=m;i<n;i++){a[i].ctime+=1;}p=block_first;huishou(p, block_first);}}}t+=1;}}//---------------------------------------------------------------//---------------------------显示作业----------------------------void showJob(int n){printf("\n\t\t\t作业表:\n");printf("\t--------------------------------------------------------------\n");printf("\t 作业号\t大小\t进入时间\t运行时间\t状态\n");printf("\t--------------------------------------------------------------\n");for(int m=0;m<n;m++){printf("\t %d\t %d\t%d\t %d\t",a[m].num,a[m].size,a[m].ctime,a[m].rtime);if(a[m].state == 0)printf(" 等待\n");if(a[m].state == 1)printf(" 装入\n");if(a[m].state == 2)printf(" 结束\n");}printf("\t--------------------------------------------------------------\n"); }//---------------------------------------------------------------------//-------------------- 循环首次适应算法------------------------ void Nextfit(DuLinkList block_first,int n){int t=1;int num=n;DuLinkList flag;flag=block_first;while(t&&num){DuLinkList pl1=block_first,pl2,pl3=block_first;printf("时钟:%d\n",t);DuLNode *p=block_first;DuLNode *q=block_first;for(int m=0;m<n;m++){if(t==a[m].ctime+a[m].rtime){num-=1;a[m].state=2;while(q){if(q->ID==a[m].num){q->state=Free;}q=q->next;}showJob(n);showPartition(block_first);}}for( m=0;m<n;m++){if(a[m].ctime==t){a[m].state=1;printf("作业:%d开始运行,对其分配!",a[m].num);}}for( m=0;m<n;m++){if(t==a[m].ctime){while(flag&&(flag->state == 1||flag->size<a[m].size)) flag=flag->next;pl1=flag;if(pl1){pl2=(DuLinkList)malloc(sizeof(DuLNode));pl2->start=pl1->start+a[m].size;pl2->state=0;pl2->ID=0;pl2->size=pl1->size-a[m].size;if(pl2->size>5){pl1->size=a[m].size;pl1->state=1;pl1->ID=a[m].num;if(pl1->next)pl1->next->prior=pl2;pl2->next=pl1->next;pl2->prior=pl1;pl1->next=pl2;pl1=block_first;}else{pl1->state=1;pl1->ID=a[m].num;}flag=pl2;showJob(n);showPartition(block_first);}else{cout<<"内存不足,等待释放"<<endl;for(int i=m;i<n;i++){a[i].ctime+=1;}p=block_first;huishou(p, block_first);flag=block_first;}}}t+=1;}}//-------------------------------------------------------------------------------------//----------------------------界面输入--------------------------------------------- void inputchoice(int &ch){cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~"<<endl;cout<<"1------>首次适应算法"<<endl;cout<<"2------>循环首次适应算法"<<endl;cout<<"3------>退出"<<endl;cout<<"4------>显示"<<endl;cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~"<<endl;cout<<"请输入选择:"<<endl;scanf("%d",&ch);}//--------------------------------------------------------------------------------------void main(){ DuLinkList p;int n,ch;ch = 0;f = 1;cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~"<<endl;cout<<" 动态分区分配存储管理系统"<<endl;cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~"<<endl;cout<<" 请输入作业信息:"<<endl;Putin(n);while(f){inputchoice(ch);switch(ch){_ case 1:InitpartitionList(p);Firstfit(p,n);ch = 0;break;case 2:InitpartitionList(p);Nextfit(p, n);ch = 0;break;case 3:f = 0;break;case 4:v();break;}}}_。