存储管理---动态分区分配算法的模拟
操作系统第4章练习题

操作系统第4章练习题操作系统常见题解析及模拟题内容第4章存储器管理4.1典型例题解析【例1】某系统采用动态分区分配方式管理内存,内存空间为640k,高端40k用来存放操作系统。
在内存分配时,系统优先使用空闲区低端的空间。
对下列的请求序列:作业1申请130k、作业2申请60k、作业3申请100k、作业2释放60k、作业4申请200k、作业3释放100k、作业1释放130k、作业5申请140k、作业6申请60k、作业7申请50k、作业6释放60k,请分别画图表示出使用首次适应算法和最佳适应算法进行内存分配和回收后内存的实际使用情况。
动作首次适应算法最佳适应算法空闲分区已分配分区己分配分区空闲分区(始址,大(作业,始址,大小)(作业,始址,大小)(始址,大小)小)130,470190,410l,o,1301,o,1302,130,601,o,1302,130,603,190,100l,0,1303,190,100l,0,1303,190,1004,290,200l,0,1304,290,2004,290,2004,290,2005,0,1404,290,2005,0,1406,490,604,290,2005,o,1406,490,607,550,504,290,2005,0,1407,550,50130,470190,410l,0,1302,130,60作业1申请130kl,0,130作业2申请60k1,0,130作业3申请100k2,130,603,190,100作业2释放60kl,0,1303,190,100290,310130,60290,310130,60490,1lo130,160490,1100,290490,110140,150490,110200,90490,110290,310130,60290,310130,60490.110490,110130,160490,1100,290490,110140,150550,50140,1501,o,130作业4申请200k3,190,1004,290,200作业3释放100k作业l释放130k作业5申请140kl,0,1304,290,2004,290,2004,290,2005,0,1404,290,2005,o,1406,140,604,290,2005,0,1406,140,607,200,504,290,2005,0,1407,200,50作业6申请60k作业7申请50k250,40490,110140,60250,40490,110140,150作业6释放60k490,60140,1501操作系统常见题解析及模拟题内容请问:采用首次适应环境算法和最佳适应环境算法展开上述内存的分配和废旧后,内存的实际采用情况分别例如图(a)和(b)右图。
动态分区分配以及动态重定位分配四种方式

0
0
图4-6 空闲链结构
分区分配算法 1)首次适应算法(first fit) FF算法要求空闲分区链以地址递增的次序链接。在分 配内存时,从链首开始顺序查找,直至找到一个大小能 满足要求的空闲分区为止;然后再按照作业的大小,从 该分区中划出一块内存空间分配给请求者,余下的空闲 分区仍留在空闲链中。若从链首直至链尾都不能找到一 个能满足要求的分区,则此次内存分配失败,返回。该 算法倾向于优先利用内存中低址部分的空闲分区,从而 保留了高址部分的大空闲区。这给为以后到达的大作业 分配大的内存空间创造了条件。其缺点是低址部分不断 被划分,会留下许多难以利用的、很小的空闲分区,而 每次查找又都是从低址部分开始,这无疑会增加查找可 用空闲分区时的开销。
5)快速适应算法(quick fit) 该算法又称为分类搜索法,是将空闲分区根据其容量 大小进行分类,对于每一类具有相同容量的所有空闲分 区,单独设立一个空闲分区链表,这样,系统中存在多 个空闲分区链表,同时在内存中设立一张管理索引表, 该表的每一个表项对应了一种空闲分区类型,并记录了 该类型空闲分区链表表头的指针。空闲分区的分类是根 据进程常用的空间大小进行划分,如2 KB、4 KB、8 KB 等,对于其它大小的分区,如7 KB这样的空闲区,既可 以放在8 KB的链表中,也可以放在一个特殊的空闲区链 表中。
分区分配操作 1)分配内存 系统应利用某种分配算法,从空闲分区链(表)中找到 所需大小的分区。设请求的分区大小为u.size,表中每 个空闲分区的大小可表示为m.size。若m.sizeu.size≤size(size是事先规定的不再切割的剩余分区的 大小),说明多余部分太小,可不再切割,将整个分区分 配给请求者;否则(即多余部分超过size),从该分区中 按请求的大小划分出一块内存空间分配出去,余下的部 分仍留在空闲分区链(表)中。然后,将分配区的首址返 回给调用者。
动态分区分配操作系统操作方法实验步骤

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

使用最佳适应算法对内存实现模拟动态分区管理摘要:内存动态分区管理的算法是操作系统课程中一个重要内容,理解和学习不同的分区算法能够为深入学习操作系统等知识提供一定的理论知识和实践依据。
本文采用c语言程序设计出最佳适应算法来模拟计算机内存分区管理,减少内存分配时产生的碎片,以此提高操作系统的稳定性。
关键词: c语言;模拟;内存分区;分配管理;最佳适应算法中图分类号:tp301 文献标识码:a 文章编号:1006-4311(2013)16-0214-021 模拟算法的设计思想计算机操作系统的最佳适应算法(best fit)是动态内存分区分配算法的一种[1]。
它能够从全部空闲区找出满足作业要求并且最小的空闲分区,这种算法能够让产生的碎片尽量缩小。
为了提高寻找速度,这种算法要求将所有的空闲区按其内容以从小到大的顺序形成一个空闲分区链。
这样,第一次找到的能满足要求的空闲区,必然是最佳的[2]。
最佳适应算法利用的思想就是将地址相邻近的自由区与回收区进行有效地合并,通过初始化空闲区、分配空闲区、回收空闲区实现模拟的内存管理,从而尽量减少碎片的产生,并尽可能的利用内存空间。
2 模拟算法的设计2.1 定义空闲分区链结构初始化时内存分配最大值定义为35670。
全局变量申明:设置分区描述器:2.2 主函数主函数main()包括:建立头结点head;定义内存分配申请1和回收内存2的选择,如果输入1则输入申请的内存大小并调用分配函数assign1=assignment(head,application1),若assign1->address==-1则分配不成功,则调用printf()函数输出“申请失败”,否则分配成功,用assign1->address进行分配;输入2将调用printf()函数提示“输入回收区的首地址和回收区的大小”,然后用语句check=backcheck(head,back)函数判断申请是否合法,若输入合法,则调用do-while循环语句多次查找适应的节点,并再次调用printf()函数输出回收结果。
存储管理动态分区分配及回收算法

存储管理动态分区分配及回收算法存储管理是操作系统中非常重要的一部分,它负责对计算机系统的内存进行有效的分配和回收。
动态分区分配及回收算法是其中的一种方法,本文将详细介绍该算法的原理和实现。
动态分区分配及回收算法是一种将内存空间划分为若干个动态分区的算法。
当新的作业请求空间时,系统会根据作业的大小来分配一个合适大小的分区,使得作业可以存储在其中。
当作业执行完毕后,该分区又可以被回收,用于存储新的作业。
动态分区分配及回收算法包括以下几个步骤:1.初始分配:当系统启动时,将整个内存空间划分为一个初始分区,该分区可以容纳整个作业。
这个分区是一个连续的内存块,其大小与初始内存大小相同。
2.漏洞表管理:系统会维护一个漏洞表,用于记录所有的可用分区的大小和位置。
当一个分区被占用时,会从漏洞表中删除该分区,并将剩余的空间标记为可用。
3.分区分配:当一个作业请求空间时,系统会根据作业的大小,在漏洞表中查找一个合适大小的分区。
通常有以下几种分配策略:- 首次适应(First Fit): 从漏洞表中找到第一个满足作业大小的分区。
这种策略简单快速,但可能会导致内存碎片的产生。
- 最佳适应(Best Fit): 从漏洞表中找到最小的满足作业大小的分区。
这种策略可以尽量减少内存碎片,但是分配速度相对较慢。
- 最差适应(Worst Fit): 从漏洞表中找到最大的满足作业大小的分区。
这种策略可以尽量减少内存碎片,但是分配速度相对较慢。
4.分区回收:当一个作业执行完毕后,系统会将该分区标记为可用,并更新漏洞表。
如果相邻的可用分区也是可合并的,系统会将它们合并成一个更大的分区。
总结来说,动态分区分配及回收算法是一种对计算机系统内存进行有效分配和回收的方法。
通过合理的分配策略和回收机制,可以充分利用内存资源,提高系统性能。
然而,如何处理内存碎片问题以及选择合适的分配策略是需要仔细考虑的问题。
操作系统课程设计报告

实践课设计报告课程名称操作系统课程设计模拟设计内存管理中的地址题目转换(动态分区、页式十进制)学院班级学号姓名指导教师年月日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 模拟设计内存管理中的地址转换(动态分区、页式十进制)初始条件:1.预备内容:阅读操作系统的内存管理章节内容,理解动态分区、页式、段式和段页式存储管理的思想及相应的分配主存的过程。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.下列内部存储器管理中地址转换,在完成指定存储管理技术中的地址转换基础上还可以选择其它内部存储器管理中的地址转换进行模拟设计并实现:⑴动态分区方案,用最先适用算法对作业实施内存分配,然后把作业地址空间的某一逻辑地址转换成相应的物理地址。
能够处理以下的情形:输入某一逻辑地址,程序能判断地址的合法性,如果合法,计算并输出相应的物理地址。
如果不能计算出相应的物理地址,说明原因。
⑵页式存储管理中逻辑地址到物理地址的转换(十进制)。
能够处理以下的情形:输入某一十进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用十进制表示。
⑶页式存储管理中逻辑地址到物理地址的转换(八进制)。
能够处理以下的情形:输入某一八进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用八进制表示。
⑷页式存储管理中逻辑地址到物理地址的转换(十六进制)。
能够处理以下的情形:输入某一十六进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用十六进制表示。
⑸段式存储管理中逻辑地址到物理地址的转换。
能够处理以下的情形:指定内存的大小,进程的个数,每个进程的段数及段大小;能检查地址的合法性,如果合法进行转换,否则显示地址非法的原因。
⑹段页式存储管理中逻辑地址到物理地址的转换。
动态分区分配与回收算法的模拟
第 4期
电 脑 开 发 与 应 用
(  ̄0 3 0 3)
‘ 61 ・
文章编号 : 1 0 0 3 — 5 8 5 0 ( 2 0 1 3 ) 0 4 — 0 0 6 1 — 0 3
动态分区分配与回收算法的模拟
邓曦 辉
( 晋 中学院计算机科学与技 术学 院 , 山西 晋中 0 3 0 6 0 0 )
DENG Xi — ui
( S c h o o l o f C o m p u t e r S c i e n c e a n d T e c h n o l o g y , J i n z h o n g U n i v e r s i t y , i f n z h o n g 0 3 0 6 0 0 , C h i n a )
Ab s t r a c t :I n o r d e r t o e x p l o r e a n d i mp r o v e t h e t e a c h i n g me t h o d o f o p e r a t i n g s y s t e m ,s t r e n g t h e n s t u d e n t s ’i n — d e p t h u n d e r s t a n d i n g o f t h e d y n a mi c p a r t i t i o n i n g ,T h i s p a p e r ,b a s e d o n l i n k e d l i s t i n t h e C
中图分类号 : T P 3 9 1 文献标识码 : A
S i mu l a t i o n o f Dy n a mi c Pa r t i t i o n i n g Al l o c a t i o n a n d Re c o v e r y Al g o r i t h m
全国自考操作系统(存储管理)模拟试卷2(题后含答案及解析)
全国自考操作系统(存储管理)模拟试卷2(题后含答案及解析) 题型有:1. 单项选择题 3. 填空题 4. 简答题 5. 综合题 6. 判断题单项选择题1.源程序经过编译或者汇编生成的机器指令集合,称为_______。
A.源程序B.目标程序C.可执行程序D.非执行程序正确答案:B解析:源程序经过编译或者汇编生成的机器指令集合不一定是可执行程序,如C编译用-c选项对不包括全部的模块的C程序编译生成的.o代码是目标程序,但不是可执行程序。
知识模块:存储管理2.动态重定位是在程序的_______中进行的。
A.编译过程B.连接过程C.装入过程D.执行过程正确答案:D 涉及知识点:存储管理3.下面几条中,_______是动态重定位的特点。
A.需要一个复杂的重定位装入程序B.存储管理算法比较简单C.不需地址变换硬件机构的支持D.在执行时将逻辑地址变换成内存地址正确答案:D 涉及知识点:存储管理4.固定分区存储管理一般采用_______进行主存空间的分配。
A.首次适应分配算法B.循环首次适应分配算法C.最优适应分配算法D.顺序分配算法正确答案:C解析:为了节省内存,减少内部碎片,固定分区存储管理一般不采用首次适应分配算法,而采用相对来说较费时的最优适应分配算法。
知识模块:存储管理5.在可变分区管理方式下,在释放和回收空闲区,若已判定“空闲区表第j栏中的始址=释放的分区始址+长度”,则表示_______。
A.归还区有上邻空闲区B.归还区有下邻空闲区C.归还区有上下邻空闲区D.归还区无相邻空闲区正确答案:B解析:说明回收的分区尾地址与空闲区表该项登记的空闲区始址相邻。
知识模块:存储管理6.采用单一连续区存储管理时,若作业地址空间大于空闲内存空间,可采用_______把不会同时工作的程序段轮流装入主存区执行。
A.对换技术B.可变分区技术C.虚拟存储技术D.覆盖技术正确答案:D 涉及知识点:存储管理7.将作业部分或全部移到外存,以调入其他的作业的技术称为_______。
存储管理动态分区分配及回收算法
存储管理动态分区分配及回收算法介绍存储管理是操作系统中一个重要的功能模块,负责管理计算机的内存资源。
本文将详细探讨存储管理中的动态分区分配及回收算法。
动态分区分配动态分区分配算法是指根据进程的内存需求,在内存中动态地创建分区,并将进程加载到相应的分区中。
下面是几种常见的动态分区分配算法。
1. 首次适应算法首次适应算法是最简单、最直观的动态分区分配算法。
它从内存的起始位置开始搜索,找到第一个能满足进程需求的分区即可。
具体步骤如下:1.初始化内存的空闲分区表,记录内存中每个空闲分区的起始地址和长度。
2.当一个进程需要分配内存时,遍历空闲分区表,找到第一个大小能满足进程需求的分区。
3.如果找到了合适的分区,将进程加载到该分区,并更新空闲分区表。
4.如果没有找到合适的分区,则提示内存不足。
首次适应算法的优点是简单、快速,但可能会导致碎片问题。
2. 最佳适应算法最佳适应算法是指选择与进程需求最接近的、且大小大于等于进程需求的分区。
具体步骤如下:1.初始化内存的空闲分区表。
2.当一个进程需要分配内存时,遍历空闲分区表,找到满足进程需求的最小分区。
3.如果找到了合适的分区,将进程加载到该分区,并更新空闲分区表。
4.如果没有找到合适的分区,则提示内存不足。
最佳适应算法能最大程度地减少碎片问题,但执行效率较低。
3. 最差适应算法最差适应算法是指选择与进程需求最接近的、且大小大于等于进程需求的最大分区。
具体步骤如下:1.初始化内存的空闲分区表。
2.当一个进程需要分配内存时,遍历空闲分区表,找到满足进程需求的最大分区。
3.如果找到了合适的分区,将进程加载到该分区,并更新空闲分区表。
4.如果没有找到合适的分区,则提示内存不足。
最差适应算法能最大程度地降低内存碎片,但执行效率相对较低。
4. 快速适应算法快速适应算法是一种基于空闲分区表大小的快速搜索算法。
具体步骤如下:1.初始化内存的空闲分区表。
2.当一个进程需要分配内存时,根据进程需求的大小,在空闲分区表中选择一个合适的分区。
事业单位招录计算机专业知识(操作系统)模拟试卷3(题后含答案及解析)
事业单位招录计算机专业知识(操作系统)模拟试卷3(题后含答案及解析)题型有:1. 单项选择题 4. 简答题单项选择题1.某基于动态分区存储管理的计算机,其主存容量为55MB(初始为空闲),采用最佳适配(Bestfitt)算法,分配和释放的顺序为:分配15MB,分配30MB,释放15MB,分配8MB,分配6MB匕时主存中最大空闲分区的大小是( )。
A.7MBB.9MBC.10MBD.15MB正确答案:B解析:其主存容量为55MB(初始为空闲),第一步分配15MB以后还有55MB -15MB=40MB,第二步分配30MB以后还有40MB-30MB=10MB,第三步释放15MB以后有两个空闲区15MB和10MB,第四步分配8MB,则空闲区为15MB,2MB,第五步分配6MB,则空闲区为9MB,2MB,所以这个题目应该是选B。
知识模块:操作系统2.下列的哪种页面置换算法会产生Belady现象?( )A.最近最少使用(LRU)B.先进先出(FIFO)C.最近不经常使用(LFU)D.最佳(OPT)正确答案:B解析:所谓Belady现象是指,在分页式虚拟存储器管理中,发生缺页时的置换算法采用FIFO(先进先出)算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。
知识模块:操作系统3.下列哪一项存储器是指按内容访问的?( )A.虚拟存储器B.相联存储器C.高速存储器D.随机访问正确答案:B 涉及知识点:操作系统4.分区管理要求对每一个作业都分配( )的内存单元。
A.地址连续B.若干地址不连续C.若干连续的帧D.若干不连续的帧正确答案:A解析:分区存储管理是把主存储器中的用户作为一个连续区或者分成若干个连续区进行管理,每个连续区中可装入一个作业。
知识模块:操作系统5.段页式存储管理汲取了页式管理和段式管理的长处,其实现原理结合了页式和段式管理的基本思想,即( )。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、设计任务完成存储器动态分区分配算法的模拟实现。
二、设计思想在对数据结构有一定掌握程度的情况下设计合理的数据结构来描述存储空间,实现分区存储管理的内存分配功能,应该选择最合适的适应算法(首次适应算法,最佳适应算法,最后适应算法,最坏适应算法),实现分区存储管理的内存回收算法,在这些存储管理中间必然会有碎片的产生,当碎片产生时,进行碎片的拼接,等等相关的内容。
三、预期目的让我们了解操作系统的基本概念,理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。
通过课程设计,我们可以进一步理解在计算机系统上运行的其它各类操作系统,并懂得在操作系统的支持下建立自己的应用系统。
操作系统课程设计,对于训练学生掌握程序设计、熟悉上机操作和程序调试技术都有重要作用。
重点培养学生的思维能力、设计能力、创新能力和排错能力。
四、设计方案首先是对相关知识的掌握,例如数据结构,计算方法,组成原理以及操作系统等。
在这些基本知识的基础上进行扩展,用语言的形式从函数,数据结构原代码,原程序等方面来达到自己想要的目的。
该设计就是要达到对各个细节的问题的解决将各个数据块连接起来,最终达到存储器动态分区分配算法的模拟实现。
五、数据结构1.设计合理的数据结构来描述存储空间:1)对于未分配出去的部分,用空闲分区链表来描述。
struct freeList{int startAddress; /* 分区起始地址 */int size; /* 分区大小 */struct freeList *next; /* 分区链表指针 */ }2)对于已经分配出去的部分,由装入内存的作业占据。
struct usedList{int startAddress; /* 分区起始地址 */int jobID; /* 分区中存放作业ID */struct usedList *next; /* 分区链表指针 */ }3)将作业组织成链表。
struct jobList{int id; /* 作业ID */int size; /* 作业大小(需要的存储空间大小)*/int status; /* 作业状态 0 : new job ,1 : in the memory , 2 : finished . */struct jobList *next; /* 作业链表指针 */}以上将存储空间分为空闲可占用两部分,在usedlist中设jobID而不设size,可以在不增加空间复杂度(与freelist相比)的同时更方便的实现可变分区存储管理(从后面的一些函数的实现上可以得出这个结论)。
尽管设置joblist增加了空间复杂度,但它的存在,使得该程序可以方便的直接利用D盘中的JOB文件。
该文件可以认为是一个和其他进程共享的资源。
通过这个文件,其他进程写入数据供读取。
这中思想在操作系统设计中体现的很多。
2.实现分区存储管理的内存分配功能,选择适应算法(首次适应算法,最佳适应算法,最后适应算法,最坏适应算法)。
基本原理分析:1) Best fit :将空闲分区按大小从小到大排序,从头找到大小合适的分区。
2) Worst fit:将空闲分区按大小从大到小排序,从头找到大小合适的分区。
3) First fit :将空闲分区按起始地址大小从小到大排序,……4) Last fit :将空闲分区按起始地址大小从大到小排序,……由此,可将空闲分区先做合适的排序后用对应的适应算法给作业分配存储空间。
排序函数 order(bySize为零则按分区大小排序,否则按分区起始地址;inc为零从小到大排序,否则从大到小排序;通过empty指针返回结果)。
void order(struct freeList **empty,int bySize,int inc){struct freeList *p,*q,*temp;int startAddress,size;for(p = (*empty) -> next;p;p = p -> next){ /* 按bySize和inc两个参数寻找合适的节点,用temp指向它 */ for(temp = q = p;q;q = q -> next){switch(bySize){case 0 : switch(inc){case 0:if(q->size < temp->size)temp = q;break;default:if(q->size > temp->size)temp = q;break;} break;default: switch(inc){case 0:if(q->startAddress < temp->startAddress)temp = q;break;default:if(q->startAddress > temp->startAddress)temp = q;break;} break;}} /* 交换节点的成员值 */if(temp != p){startAddress = p->startAddress;size = p->size;p->startAddress = temp->startAddress;p->size = temp->size;temp->startAddress = startAddress;temp->size = size;}}}3.实现分区存储管理的内存回收算法。
void insertFreeNode(struct freeList **empty,int startAddress,int size) 插入回收的空节点分区,处理回收分区与空闲分区的四种邻接关系。
{struct freeList *p,*q,*r;for(p = *empty;p -> next;p = p -> next) ;/* 处理链表尾部的邻接情况 */if(p == *empty || p -> startAddress + p -> size < startAddress)/* 与尾部不相邻*/{makeFreeNode(&r,startAddress,size);/* 通过r指针返回创建的空闲节点*/ r -> next = p -> next; /* 插入独立的空闲节点 */ p -> next = r;return ;}if(p -> startAddress + p -> size == startAddress) /* 与尾部上邻 */ {p -> size += size; /* 合并尾部节点 */return ;}q = (*empty) -> next; /* 处理链表首节点的邻接情况 */ if(startAddress + size == q -> startAddress) /* 与首节点下邻 */ {q -> startAddress = startAddress; /* 合并首节点 */ q -> size += size;}else if(startAddress + size < q -> startAddress)/* 与首节点不相邻 */ {makeFreeNode(&r,startAddress,size);r -> next = (*empty) -> next;(*empty) -> next = r;}else{ /* 处理链表中间的邻接情况 */ while(q -> next && q -> startAddress < startAddress){p = q;q = q -> next;}if(p -> startAddress + p -> size == startAddress &&\q -> startAddress == startAddress + size)/* 上下邻,合并节点 */ {p -> size += size + q -> size;p -> next = q -> next;课程设计书free(q); /* 删除多余节点 */ }else if(p -> startAddress + p -> size == startAddress &&\ q -> startAddress != startAddress + size)/*上邻,增加节点的大小*/ {p -> size += size;}else if(p -> startAddress + p -> size != startAddress &&\ q -> startAddress == startAddress + size) /* 下邻 */ {q -> startAddress = startAddress; /* 修改节点起始地址 */q -> size += size; /* 修改节点的大小 */ }else{ /* 上下不相邻 */ makeFreeNode(&r,startAddress,size);r -> next = p -> next;p -> next = r;}}}4.当碎片产生时,进行碎片的拼接。
void moveFragment(struct jobList *jobs,struct freeList **empty,struct usedList **used){int size,status;struct usedList *p;int address = memoryStartAddress;/*全局变量,初始化时分配存储空间始址*/ if((*empty)->next == NULL) /* 空闲分区链表为空,提示并返回 */ {printf("\nThe memory was used out at all.\nMay be you should finish some jobs first or press any key to try again !");getch();return;}for(p = (*used) -> next;p;p = p-> next)/* 循环的修改占用分区的始址 */ {p -> startAddress = address;课程设计书getJobInfo(jobs,p -> jobID,&size,&status);/* 由作业ID获得作业大小 */ address += size;}(*empty)->next->startAddress = address;/*修改空闲分区的首节点始址、大小*/ (*empty) -> next -> size = memorySize - (address - memoryStartAddress);(*empty) -> next -> next = NULL; /* 删除首节点后的所有节点 */ }5.空闲分区队列显示:int showFreeList(struct freeList *empty) 6.作业占用链表显示:int showUsedList(struct jobList*jobs,struct usedList *used)从头到尾显示used链,同时通过其中的作业ID在jobs中查对应的大小。