基于可重定位分区分配算法的内存管理的设计与实现

合集下载

连续分配 分页管理动态重定位分区分配算法-Read

连续分配 分页管理动态重定位分区分配算法-Read
并对该进程的进程控制块做相应的修改。
连续分配+分页管理
(2) 进程的换入。 系统应定时地查看所有进程的状态,从中找出“就绪” 状态但已换出的进程,将其中换出时间(换出到磁盘上)最久的 进程作为换入进程,将之换入,直至已无可换入的进程或无 可换出的进程为止。
连续分配+分页管理
4.3 基本分页存储管理方式
连续分配+分页管理
4.2.3 动态分区分配
连续分配+分页管理
连续分配+分页管理
1. 分区分配中的数据结构
(1) 空闲分区表。 (2) 空闲分区链。
前 向 指 针 N + 2 0
N个字节可用
后 向 指 针 N + 2 0
图 4-5 空闲链结构
连续分配+分页管理
2. 分区分配算法 (1) 首次适应算法FF。 (2) 循环首次适应算法,该算法是由首次适应算法演变而成的。 (3) 最佳适应算法。
之间的关系。
对于 64位的计算机,如果要求它能支持 2 64 (=1844744 TB)规模的物理存储空间,则即使是采用三级页表结构也是 难以办到的;而在当前的实际应用中也无此必要。
连续分配+分页管理
练习:
有一基本分页存储管理系统,假定页面大小为1024字节,页
表采用离散方式放在内存中。每个页表项占用4个字节。在 忽略页表及系统区等占用空间的条件下, 若采用一级页表,系统能支持的逻辑空间最多为多少? 若采用二级页表,系统能支持的逻辑空间最多为多少? 在二级页表中,现有逻辑地址为542783,求该地址对应的 外层页号,外层页内地址和页内地址?
求是连续的。 可以采用这样两个方法来解决这一问题:① 采
用离散分配方式来解决难以找到一块连续的大内存空间的问 题:② 只将当前需要的部分页表项调入内存, 其余的页表项 仍驻留在磁盘上,需要时再调入。

基于可重定位分区分配算法的内存管理的设计与实现

基于可重定位分区分配算法的内存管理的设计与实现

组号成绩计算机操作系统课程设计报告题目基于可重定位分区分配算法的内存管理的设计与实现专业:计算机科学与技术班级:学号+:指导教师:2016年12月23 日一.设计目的掌握内存的连续分配方式的各种分配算法二.设计内容基于可重定位分区分配算法的内存管理的设计与实现。

本系统模拟操作系统内存分配算法的实现,实现可重定位分区分配算法,采用PCB定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。

内存分区表采用空闲分区表的形式来模拟实现。

要求定义与算法相关的数据结构,如PCB、空闲分区;在使用可重定位分区分配算法时必须实现紧凑。

三.设计原理可重定位分区分配算法与动态分区分配算法基本上相同,差别仅在于:在这种分配算法中,增加了紧凑功能。

通常,该算法不能找到一个足够大的空闲分区以满足用户需求时,如果所有的小的空闲分区的容量总和大于用户的要求,这是便须对内存进行“紧凑”,将经过“紧凑”后所得到的大空闲分区分配给用户。

如果所有的小空闲分区的容量总和仍小于用户的要求,则返回分配失败信息四.详细设计及编码1.模块分析(1)分配模块这里采用首次适应(FF)算法。

设用户请求的分区大小为u.size,内存中空闲分区大小为m.size,规定的不再切割的剩余空间大小为size。

空闲分区按地址递增的顺序排列;在分配内存时,从空闲分区表第一个表目开始顺序查找,如果m.size≥u.size且m.size-u.size≤size,说明多余部分太小,不再分割,将整个分区分配给请求者;如果m.size≥u.size且m.size-u.size>size,就从该空闲分区中按请求的大小划分出一块内存空间分配给用户,剩余的部分仍留在空闲分区表中;如果m.size<u.size则查找下一个空闲分区表项,直到找到一个足够大的空闲分区;如果没有找到一个足够大的内存空闲分区,但所有的小的空闲分区的容量总和大于用户的要求,就进行紧凑,将紧凑后得到的大的空闲分区按上述的方式分配给用户;但如果所有的小的空闲分区的容量总和仍不能满足用户需要,则分配失败。

国家开放大学《操作系统》形考任务2答案

国家开放大学《操作系统》形考任务2答案

国家开放大学《操作系统》形考任务2答案一、单选题1.Linux系统中的进程调度采用(抢占式优先级)。

2.Linux系统中的shell是负责(解释并执行来自终端的命令)的模块。

3.作业一旦进入内存即为执行状态,与之相关的进程在作业进入内存时予以创建,该进程的初始状态为(就绪态)。

4.作业调度选择一个作业装入主存后,该作业能否占用处理器必须由(进程调度)来决定。

5.作业调度程序从处于(后备)状态的队列中选取适当的作业调入主存运行。

放在输入井中的作业处于(后备)状态。

6.作业生存期共经历四个状态,它们是提交、后备、(执行)和完成。

7.为了使系统中各部分资源得到均衡使用,就必须选择对资源需求不同的作业进行合理搭配,这项工作是由(作业调度)完成的。

8.为了使计算机在运行过程中能及时处理内部和外部发生的各种突发性事件,现代操作系统采用了(中断)机制。

9.为了对紧急进程或重要进程进行调度,调度算法应采用(优先级法)。

10.下列存储管理方式中,存储碎片尽可能少,使内存利用率较高的是(分页管理)。

11.下列存储器中,容量最大的是(硬盘)。

12.下列存储器中,速度最快的是(CPU内部寄存器)。

13.在存储管理中,为实现地址映射,硬件应提供两个寄存器,一个是基址寄存器。

另一个是(限长寄存器)。

14.下列存储管理方案中,不采用动态重定位的是(固定分区)。

15.下列存储管理方案中,不要求将进程全部调入并且也不要求连续存储空间的是(请求分页式存储管理)。

16.下列存储管理方式中,存储碎片尽可能少,使内存利用率较高的是(分页管理)。

17.下列中断中,可能要人工介入的中断是(硬件故障中断)在页式存储管理系统中,整个系统的页表个数是(和装入主存的进程个数相同)个。

18.下列中断类型中,属于自愿性中断事件的是(访管中断)。

19.在分页存储管理系统中,从页号到物理块号的地址映射是通过(页表)实现的。

20.在页式虚拟存储管理系统中,LRU算法是指(近期最长时间以来没被访问的页先淘汰)。

可变分区存储管理及可重定位分区存储管理实验报告

可变分区存储管理及可重定位分区存储管理实验报告

可变分区存储管理及可重定位分区存储管理实验报告一、实验目的与要求通过消化理解模拟管理程序,了解存储器的分配与回收过程,体会相关数据结构在实现管理算法中的重要性。

输入一到两组实验数据,观察分配与回收的处理结果,特别是回收时邻接空闲分区的合并处理,检测其算法的正确性。

二、算法思想1、可变分区存储管理(1)算法实现a.分配:查空闲分区链表b.回收:考虑邻接合并(2)实验过程:输入操作命令代码a.分配:输入作业号及作业长度(已建立作业不重复建立)b.回收:输入作业号(不存在作业不释放空间)c .可查看空闲链表情况(检测分配、回收正确性)d.可查看作业表情况(检测分配、回收正确性)2、可重定位分区存储管理在前述可变分区存储管理实验基础上修改实现,即遇大作业存在碎片不够分配时进行合并处理。

注:实现拼接(移动,合并):设立按作业地址排列的有序链表,即用静态链表实现(作业表增加静态链仿真指针),在此基础上按地址从小到大顺序依次向前移动(紧凑处理)。

三、算法实现(可重定位分区存储管理)1、修改相关数据结构(1)作业表增加链接仿真指针int next;分量(2)构造有序静态链表(初始化时next均赋值-1)(3)增加静态链首指针Linkp及空闲总容量计数变量size(注:初始化时Linkp=-1,size=n)2、修改分配函数判断新建立作业长度是否小于等于空闲总容量size值。

若无足够大分区,则先进行合并处理后再分配;若有足够大分区,则按可变分区分配算法处理;若作业长度超过总空闲容量,则产生溢出(无内存)。

3、增加插入排序操作函数(sort_tab())分配新作业空间,则按新作业分区首地址大小,将作业表表项插入静态链表。

回收时,还必须从中删除。

4、增加拼接(移动)操作函数(compact())主要是修改作业表表目内容及空闲分区链表,用模拟操作函数move()进行模拟搬家前移。

5、增加显示静态链表内容的较出操作函数(printsorttab())四、算法流程1、可变分区存储管理(1)主程序(main()函数)(2)分配程序(allocm()函数)(3)回收程序(freem()函数)(4)显示空闲分区链表及作业表程序(printlink()及printtab()函数)注:主程序(main()函数)分配程序(allocm()函数)回收程序(freem()函数)有四种情形(假定回收区首地址=> addr,长度=> length)(1)空闲分区链表空,或不与任何空闲区邻接=> 分配新结点空间,存入回收作业首地址及长度插入空闲分区链(链首,链中,链尾)(2)回收分区与后一空闲分区相邻接=> 进行后邻接合并(3)回首分区与前一空闲分区相邻接(4)回收分区与前同时又与后空闲分区相邻接=> 需进行三个分区合并,并删除一个空闲分区结点注:除了修改空闲分区链表,还要修改作业表(清除flag标志)2、可重定位分区存储管理(1)分配程序(修改allocm()函数)(2)回收程序(修改freem()函数)(3)有序静态链表插入操作程序(sort_tab()函数)(4)拼接(移动)操作程序(compact()函数)(5)输出有序静态链表操作程序(printsorttab()函数)注:分配程序(修改allocm()函数)n,l输出作业已建立提示串,返回内存容量不够,返回置新作业作业表作业地址(分配空间)提示操作者输入新建作业的作业号及长度作业n已建立?l≤size?NYNY分配作业表表项,填入作业长度,置标志为1,总空闲容量减去l查空闲分区链表查到表尾?调用拼接操作函数compact()进行拼接处理Y分区大小=lNYN分区大小>lY修改空闲分区链表(size= l,空闲链为空(一起分配),size> l ,分割分配)作业表表目插入有序静态链表返回切割分配分区空间,修改分区链表作业表表目插入有序静态链表分区整体分配,修改分区链(删除结点)作业表表目插入有序静态链表返回查下一分区N回收程序(修改freem()函数)有序静态链表插入操作程序(sort_tab())拼接(移动)操作程序(compact())五、实验步骤1、可变分区存储管理(1)消化实验算法程序(2)组织上机实验数据(3)第一组:指定(4)第二组:自定(要求能测试各种情形)(5)输入上机程序,编译,运行,记录各操作步骤的运行结果(通过显示空闲分区链表及作业表)2、可重定位分区存储管理(1)阅读相关算法程序(2)组织调试数据(必须包含需合并的操作)(3)上机运行、调试(测试),记录运行情况,分析运行结果六、实验运行情况分析1、可变分区存储管理(1)操作程序1a.分配作业1(80k),作业3(30k),作业8(50k),作业5(140k),作业9(50k),作业6(100k),作业4(50k)b.观察(记录)空闲表及作业表情况c.回收作业8,观察结果d.分配作业7(80k),观察结果e.回收作业6, 回收作业1, 观察结果f分配作业10(120k),观察运行情况g,回收作业7,作业3,作业5,观察各次结果(2)操作程序2a.分配作业1(100k)、作业2(50k)、作业3(50k)、作业4(80k)、作业5(120k),观察结果b.回收作业4c.分配作业6(90k)d.回收作业3 f.分配作业7(140k)2、可重定位分区存储管理(1)操作程序1a.分配作业1(80k),作业3(30k),作业8(50k),作业5(140k),作业9(50k),作业6(100k),作业4(50k)b.观察(记录)空闲表及作业表情况c.回收作业8,观察结果d.分配作业7(80k),观察结果e.回收作业6, 回收作业1, 观察结果f 分配作业10(120k ),观察运行情况g,回收作业7,作业3,作业5,观察各次结果(2)操作程序2a.分配作业1(100k)、作业2(50k)、作业3(50k)、作业4(80k)、作业5(120k),观察结果b.回收作业4c.分配作业6(90k)d.回收作业3 f.分配作业7(140k )七、实验总结通过这次实验,我掌握了可变分区存储管理及可重定位分区存储管理的具体方法,对书本上的理论知识有了更深刻的认识。

现代计算机系统中内存管理地址重定位

现代计算机系统中内存管理地址重定位
分 数据 在 外 存 中 的进 程 ,我们 如 何 去 安排 它们 的地 址 。 通 常 一 个 程序 要 被 执 行 ,要 经 过 编译 程 序 翻 译成 计 算 机 能够 识 别 的 目 标 代码 ,然 后链 接 程 序 把 不 同 的程 序段 链 接 起 来 ,对 于 不 同 的 程 序段 ,具 有 不 同 的地 址 。 对于 这 些 编 译后 生 成 的 目标 代 码 的 地 址 ,我们 通 常采用 两种 方法 去安 排。
二 、地 址 重 定 位
地 址 重 定 位 是把 虚 拟地 址 转 换成 内存 中 的物 理地 址 。 这个 过 程 又 可 以叫 地址 映射 。 内存 中 ,每 一 个 存储 单 元都 有 一 个 内
存 地址 对 应 ,内 存 空间 是 以个 一 维线 性 空 间 。如 何把 虚 拟 存储 器 中 的一 维 或 多维 线 性 空 间转 变 成 内存 的 物理 线 性 空 间。 一个 存 储 器 是 计 算机 硬 件 系统 重 要 组 成 部 分 , 是 五 大 部 件 之 问题是 虚拟 空 间 的 划分 ,虚拟 空 间 的划 分 让 不 同的程 序 模块 链 因 此对 存 储 器 管理 直 接 影 响计 算 机 的 系统 性 能 。存 储 器 有 接到统一的虚拟空间中,它与计算机的系统空间有关。另一个 内存 和 外存 组 成 。 内存 由顺 序编 址 的 物理 单 元 组成 。任 何 程 序 问题 是 如何 把 虚 拟 空 间 中的 内容 调 进 内存 ,并将 虚 拟地 址 重定 都 必 须 先调 入 内存 才 能执 行 。 系统 中对 内 存 的管理 主要 是 对 内 位 成 内存地 址 的问 题 。 实现 地址 重 定位 有 两 种 方法 :静态 地 址 存 的分 配 、 内存 的保 护 、 地 址重 定 位 和 内存 的扩 展 。本 文 主 要 重 定位 和动 态地 址重 定位 。

《操作系统原理》课程标准

《操作系统原理》课程标准

理、动态链接和共享的概念;掌握存储体系的概念、存储管理的任务、页式 存储管理和段式存储管理的实现原理和地址变换、虚拟存储技术、页面置换 算法; 7 8 9 10 了解设备分类、I/O 系统;理解缓冲技术和 Spooling 系统及磁盘调度算法; 掌握 I/O 控制方式、设备分配技术; 了解文件的概念、文件系统的主要操作、文件系统的安全性;理解文件系统 的功能;掌握文件及其分类、文件的逻辑结构和物理结构的概念,文件、目 录及目录结构; 理解外存的组织形式、文件存储空间的管理方法; 理解联机命令接口、命令解释程序;掌握 Shell 命令语言、系统调用;
(2)知识目标 序号 1 2 3 4 5 6 知 识 目 标
掌握操作系统基本概念、特征、类型、功能和组织结构; 理解程序的并发执行及其特征;掌握多道程序设计、并发、进程的概念、进 程的状态及其转换、进程控制原语; 理解临界资源、临界区概念、信号量机制、PV 操作及其应用、进程间的通 信;掌握进程的同步与互斥实现方法;了解进程通信、线程的概念; 掌握作业调度和进程调度算法、理解处理机调度的层次; 掌握死锁的概念与必要条件、死锁的预防与避免、资源分配图; 了解分区管理方案、段页式存储管理、覆盖技术;理解交换技术、局部性原
模 概论 用户接口 进程管理 处理机调度与死锁 进程同步 存储管理 设备管理 文件管理 磁盘存储器管理 综合 合计 3、能力训练项目设计



学 时 4 4 6 6 6 8 6 6 4 2 52
根据模块内容,可将多个单元的训练要求综合考虑,设计内含多个训练任务的、具有 平行、递进关系或包含关系的一级训练项目。训练的形式包扩示范讲解,课堂练习和课外作 业。
2、课程内容设计 (1)设计的整体思路:主要内容以操作系统的功能为单位组织教学模块,兼顾篇幅进 一步细分。各模块内容相对独立,以利学习进度的控制。针对本课程理论性强、概念繁多、 知识面广的特点,各单元的学习从提出实际问题开始,引出相应的概念,介绍解决问题的方 法和技术, 并在讲授中对理论概念辅以相应的练习以加深理解和融会贯通。 据此将课程划分 为下列模块。 (2)模块设计表:

电大计算机本科《操作系统》作业及答案

电大计算机本科《操作系统》作业及答案

《操作系统》课程作业(四)姓名班级学号一、选择题(选择一个正确答案的代码填入括号中)1.通常,用户编写的程序中所使用的地址是()。

A.逻辑地址 B.物理地址2.3.4.5.6.调入其他所需数据,称为()。

A.覆盖技术B.对换技术C.虚拟技术D.物理扩充7.分区管理中进行分区的是主存的()。

A.系统区域 B.用户区域C.程序区域 D.整个区域8.分区管理要求对每一个作业都分配()的内存单元。

A.地址连续B.若干地址不连续C.若干连续的页面D.若干不连续的页面9.固定分区中各分区的大小是()。

A.相同的 B.相同或者不同,但预先固定10.11.12.A.绝对地址=界限寄存器值+逻辑地址B.绝对地址=下限寄存器值+逻辑地址C.绝对地址=基址寄存器值+逻辑地址D.绝对地址=块号 块长+页内地址13.最先适应分配算法把空闲区()A.按地址顺序从小到大登记在空闲区表中B.按地址顺序从大到小登记在空闲区表中C.按长度以递增顺序登记在空闲区表中D.按长度以递减顺序登记在空闲区表中14.最容易形成很多小碎片的可变分区算法是()。

A.最先适应算法 B.最佳适应算法C.位示图法 D.以上都不是15.16.17.18.19.虚拟存储器的容量是由计算机的地址结构决定的,若CPU有32位地址,则它的虚拟地址空间为()。

A.100K B.640K C.2G D.4G20.在请求分页虚拟存储管理中,若所需页面不在内存中,则会引起()。

A.输入输出中断 B.时钟中断C.越界中断 D.缺页中断21.下列存储管理方案中,不要求将进程全部调入并且也不要求连续存储空间的是()。

A.固定分区 B.可变分区C.页式存储管理 D.请求分页式存储管理22.存储管理中,页面抖动是指()。

23.1.2.3.固定分区存储管理的各分区的大小不可变化,这种管理方式不适合多道程序设计系统。

()4.可重定位分区存储管理可以对作业分配不连续的内存单元。

()5.采用动态重定位技术的系统,目标程序可以不经任何改动,而装入物理内存。

(实验6)基于动态分区分配的内存管理的模拟设计与实现

(实验6)基于动态分区分配的内存管理的模拟设计与实现

(实验6)基于动态分区分配的内存管理的模拟设计与实现实验6 内存的连续分配算法一.实验目的掌握内存的连续分配方式的各种分配算法二.实验内容本系统模拟操作系统内存分配算法的实现,实现固定分区和动态分区分配,算法,采用PCB定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。

内存分区表采用单链表来模拟实现。

三.实验题目基于动态分区分配的内存管理的模拟设计与实现四.实验要求1.定义与算法相关的数据结构,如PCB,空闲分区2.在使用动态分区分配算法时必须实现紧凑和对换功能3.武汉理工大学《操作系统》课程设计说明书14{ if(FFA(id,size)==OK) cout<<"分配成功!"<<<"分配失败!"< { if(BFA(id,size)==OK) cout<<"分配成功!"<<<"分配失败!"< { if(WFA(id,size)==OK) cout<<"分配成功!"<<<"分配失败!"<<="" }="">Show() { Node *cur=head->next; while(cur){ cout<<"***********************************"<<endl;< p=""> cout<<"区号:"; if(cur->data.ID==FREE) cout<<"无"<<data.ID<<<"起始地<="" p="">址:"<data.addr<<<"分区长<="" p="">度:"<data.size<<<"状态:";<="" p="">if(cur->data.state==BUSY) cout<<"已分配"<<<"未分配"<next; 武汉理工大学《操作系统》课程设计说明书 15 } } int main() { cout<<" 动态分区分配方式的模拟"<<endl;< p="">cout<<"********************************************"<<endl; < p="">cout<<"请输入内存大小(KB):"; cin>>area; while(area<=0){ cout<<"输入错误,请重新输入内存大小(KB)"; cin>>area; } while(1){ cout<<"********************************************"<<endl ;< p="">cout<<"** 1.FFA 2.BFA 3.WFA 0.EXIT **"<<endl;< p="">cout<<"********************************************"<<endl; < p="">cout<<"请选择:"; int ch; cin>>ch; if(ch==0) { break; } Init(area); int choice; while(1) { cout<<"********************************************"<<end< p="">l; cout<<"** 1.分配 2.回收 3.查看0.退出**"<<endl;< p="">cout<<"********************************************"<<endl; < p="">cout<<"请输入您的操作:"; cin>>choice; if(choice==1) { cout<<"请输入进程个数"; int num; cin>>num;for(;num>0;num--) { Assign(ch); // 分配内存} 武汉理工大学《操作系统》课程设计说明书 16 } elseif(choice==2) // 内存回收 { int ID; cout<<"请输入您要释放的分区号:"; cin>>ID; Free(ID); } elseif(choice==3) Show();//显示主存else if(choice==0) break;else //输入操作有误{ cout<<"输入有误,请重试!"<<endl;< p="">continue; } } } return 0; }4.</endl;<> </endl;<> </endl;<> </end<> </endl;<> </endl;<> </endl;<> </endl;<> </endl;<> </endl;<>。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

组号成绩计算机操作系统课程设计报告题目基于可重定位分区分配算法得内存管理得设计与实现专业:计算机科学与技术班级:学号+姓名:指导教师:2016年12月 23日一.设计目得掌握内存得连续分配方式得各种分配算法二.设计内容基于可重定位分区分配算法得内存管理得设计与实现.本系统模拟操作系统内存分配算法得实现,实现可重定位分区分配算法,采用PCB定义结构体来表示一个进程,定义了进程得名称与大小,进程内存起始地址与进程状态.内存分区表采用空闲分区表得形式来模拟实现。

要求定义与算法相关得数据结构,如PCB、空闲分区;在使用可重定位分区分配算法时必须实现紧凑.三.设计原理可重定位分区分配算法与动态分区分配算法基本上相同,差别仅在于:在这种分配算法中,增加了紧凑功能。

通常,该算法不能找到一个足够大得空闲分区以满足用户需求时,如果所有得小得空闲分区得容量总与大于用户得要求,这就是便须对内存进行“紧凑”,将经过“紧凑”后所得到得大空闲分区分配给用户。

如果所有得小空闲分区得容量总与仍小于用户得要求,则返回分配失败信息四.详细设计及编码1.模块分析(1)分配模块这里采用首次适应(FF)算法.设用户请求得分区大小为u、size,内存中空闲分区大小为m、size,规定得不再切割得剩余空间大小为size。

空闲分区按地址递增得顺序排列;在分配内存时,从空闲分区表第一个表目开始顺序查找,如果m、size≥u、size且m、size—u、size≤size,说明多余部分太小,不再分割,将整个分区分配给请求者;如果m、size≥u、size且m、size-u、size>size,就从该空闲分区中按请求得大小划分出一块内存空间分配给用户,剩余得部分仍留在空闲分区表中;如果m、size<u、size则查找下一个空闲分区表项,直到找到一个足够大得空闲分区;如果没有找到一个足够大得内存空闲分区,但所有得小得空闲分区得容量总与大于用户得要求,就进行紧凑,将紧凑后得到得大得空闲分区按上述得方式分配给用户;但如果所有得小得空闲分区得容量总与仍不能满足用户需要,则分配失败.(2)内存回收模块进行内存回收操作时,先随机产生一个要回收得进程得进程号,把该进程从进程表中中删除,它所释放得空闲内存空间插入到空闲分区表;如果回收区与插入点得前一个空闲分区相邻,应将回收区与插入点得前一分区合并,修改前一个分区得大小;如果回收区与插入点得后一个空闲分区相邻,应将回收区与插入点得后一分区合并,回收区得首址作为新空闲分区得首址,大小为二者之与;如果回收区同时与插入点得前、后空闲分区相邻,应将三个分区合并,使用前一个分区得首址,取消后一个分区,大小为三者之与。

(3)紧凑模块将内存中所有作业进行移动,使她们全都相邻接,把原来分散得多个空闲小分区拼接成一个大分区。

2.流程图否否就是就是3.代码实现#include〈stdio、h〉#include<stdlib、h>#include〈time、h〉#include〈windows、h〉#define TURE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define SIZE 15////////////////////////////进程表//////////////int ppNo=1; //用于递增生成进程号int pLength=0;struct PCB{int pNo;//进程号(名)int pSize; //进程大小int pOccupy;// 实际占用得内存ﻩint pStartAddr; // 进程起始地址int pState; //进程状态};struct PCBpList[200];//////////////////空闲分区表部分///////////////typedef int Status;typedef struct emptyNode{//空闲分区结构体intareaSize; //空闲分区大小ﻩint aStartAddr;//空闲分区始址struct emptyNode *next;}emptyNode,*LinkList;intListDelete(struct PCB *pList,int i);//AAA/删除下标为i得进程void pSort(struct PCB *pList); //AAA/内存中得进程按始址递增排序voidpact(LinkList &L,struct PCB *pList);//AAA/紧凑 ,内存中进程移动,修改进程数据结构;空闲分区合并,修改空闲分区表数据结构void amalgamate(LinkList &L);//AAA/回收后进行合并空闲分区void recycle(LinkList &L,struct PCB *pList); //AAA/回收,从进程表中删除进程 ,把释放出得空间插入到空闲分区链表中StatusInitList(LinkList &L);//1AAA/构造一个新得有头节点得空链表LStatus ClearList(LinkList &L);//2AAA/将链表L重置为空表Status ListInsert(LinkList &L,LinkList s1);//AAA/*****根据始址进行插入void DeleteElem(LinkList &L,int aStartAddr);//*****删除线性表中始址值为aStartAddr得结点void PrintList(LinkList L); //AAA/*****输出各结点得值voidcreatP(struct PCB*p); //AAA/初始化进程int search(LinkList &L,intpSize);//AAA/检索分区表,返回合适分区得首址int add(LinkList &L);//AAA/返回空闲分区总与void pListPrint(struct PCB *pList); //AAA/输出内存中空间占用情况void distribute(LinkList &L,struct PCB *process);int ListDelete(struct PCB *pList,int i)//AAA/删除下标为i得进程{for(;i<pLength—1;i++){ﻩﻩpList[i]=pList[i+1];}pLength——;}//ListDeletevoid pSort(structPCB*pList){ //AAA/内存中得进程按始址递增排序ﻩint i,j;struct PCB temp;for(i=0;i〈pLength—1;i++){for(j=0;j〈pLength-i-1;j++){ﻩﻩif(pList[j]、pStartAddr>pList[j+1]、pStartAddr){ﻩﻩtemp=pList[j];ﻩﻩﻩpList[j]=pList[j+1];ﻩpList[j+1]=temp;ﻩﻩﻩ}}ﻩ}}//AAA/紧凑 ,内存中进程移动,修改进程数据结构;空闲分区合并,修改空闲分区表数据结构void pact(LinkList&L,struct PCB*pList){printf(”进行紧凑\n”);ﻩ//1、进程移动,修改进程数据结构ﻩint i;pList[0]、pStartAddr=0; //第一个进程移到最上面for(i=0;i<pLength—1;i++){ﻩﻩpList[i+1]、pStartAddr=pList[i]、pStartAddr+pList[i]、pOccu py;}//2、空闲分区合并,修改空闲分区表数据结构LinkListp=L->next,s;ﻩint sumEmpty=0;ﻩwhile(p!=NULL)//求空闲区总与{ﻩﻩsumEmpty+=p—>areaSize;ﻩp=p-〉next;ﻩClearList(L); //清空空闲分区表s=(LinkList)malloc(sizeof(emptyNode));s—>aStartAddr=pList[pLength-1]、pStartAddr+pList[pLengt h—1]、pOccupy;s-〉areaSize=sumEmpty;ﻩListInsert(L,s);ﻩprintf(”\n紧凑后得〉〉>〉\n");pListPrint(pList);ﻩPrintList(L);}void amalgamate(LinkList &L){//AAA/回收后进行合并空闲分区LinkList p=L-〉next,q=p->next;while(q!=NULL){ﻩif(p—>aStartAddr+p-〉areaSize==q->aStartAddr){ﻩp—〉areaSize+=q-〉areaSize;ﻩﻩDeleteElem(L,q—〉aStartAddr);//删除被合并得结点ﻩq=p-〉next;}else{p=q;ﻩﻩq=q->next;ﻩﻩ}}//AAA/回收,从进程表中删除进程 ,把释放出得空间插入到空闲分区链表中voidrecycle(LinkList&L,struct PCB *pList){int index,delPNo,delPSize,delPOccupy,delPStartAddr;LinkList s;srand(time(0));index=rand()%pLength;delPNo=pList[index]、pNo;delPSize=pList[index]、pSize;delPOccupy=pList[index]、pOccupy;delPStartAddr=pList[index]、pStartAddr;printf("________________________________________________________________________________");printf("回收内存进程 P%d: 始址:%d K 占用:%d KB\n”,delPNo,delPStartAddr,delPOccupy);printf("\n回收后〉〉〉>\n");ListDelete(pList,index);//pListPrint(pList);s=(LinkList)malloc(sizeof(emptyNode));ﻩs—>areaSize=delPOccupy;s—>aStartAddr=delPStartAddr;ListInsert(L,s);amalgamate(L);pListPrint(pList);//输出内存中空间占用情况PrintList(L);}///////////////////////////////////////////Status InitList(LinkList&L) //1AAA/构造一个新得有头节点得空链表L {ﻩLinkList s;L=(LinkList)malloc(sizeof(emptyNode));//生成新节点(头结点)if(!L) return ERROR; //申请内存失败s=(LinkList)malloc(sizeof(emptyNode));ﻩs->areaSize=900;ﻩs->aStartAddr=0;L-〉next=s;//头节点得指针域指向第一个结点s-〉next=NULL;return OK;}//InitListStatusClearList(LinkList &L) //2AAA/将链表L重置为空表{LinkList p,r;p=L-〉next; r=p—〉next;ﻩwhile(p!=NULL){free(p);ﻩif(r==NULL){ﻩﻩp=NULL;ﻩﻩ}else{ﻩﻩp=r;ﻩﻩ r=p—〉next;}}L->next=NULL;return OK;}//ClearList//AAA/*****根据始址进行插入Status ListInsert(LinkList &L,LinkList s1){ﻩLinkList r=L,p=L—>next,s;//指针s=(LinkList)malloc(sizeof(emptyNode));ﻩs—〉areaSize=s1->areaSize;s->aStartAddr=s1—>aStartAddr;ﻩif(p==NULL){ﻩﻩL—〉next=s;s—〉next=NULL;ﻩ}else{while(p!=NULL){ﻩﻩ if(s1—>aStartAddr <p->aStartAddr){ﻩﻩs->next=r->next;ﻩr-〉next=s;ﻩﻩbreak;}r=p;ﻩﻩp=p->next; //后移ﻩ}if(p==NULL){ﻩr-〉next=s;ﻩs->next=NULL;ﻩ}}return OK;}//ListInsert2voidDeleteElem(LinkList &L,int aStartAddr)//*****删除线性表中始址值为aStartAddr得结点{ﻩLinkListp=L,q;ﻩwhile(p—>next!=NULL){ﻩq=p->next;ﻩﻩif(q->aStartAddr==aStartAddr)ﻩ{ﻩp->next=q—>next;free(q);ﻩ}ﻩelseﻩp=p—>next;ﻩ}}//DeleteElem////////////////////////////////////////////////void PrintList(LinkList L)//AAA/*****输出各结点得值{printf(”\n空闲分区情况: 始址\t 大小\n”);LinkList p=L—〉next;ﻩwhile(p!=NULL)ﻩ{printf(" %d K\t%d KB\n",p-〉aStartAdd r,p—>areaSize);ﻩﻩp=p—>next;ﻩ}printf("\n");}//PrintListvoidcreatP(struct PCB *p){ //AAA/初始化进程int size;srand(time(NULL));size=rand()%7+1;size*=10;p->pNo=ppNo++;p->pSize=size;ﻩp->pOccupy=0;ﻩp—〉pStartAddr=0;ﻩp-〉pState=0;}int search(LinkList &L,int pSize){ //检索分区表,返回合适分区得首址LinkList p=L-〉next;while(p!=NULL){ﻩif(p—>areaSize>=pSize){ﻩﻩreturn p—>aStartAddr;}ﻩp=p-〉next;}return -1;//没有足够大得}int add(LinkList &L){ //返回空闲分区总与LinkList p=L—>next;int sum=0;ﻩwhile(p!=NULL){sum+=p->areaSize;p=p->next;ﻩ}ﻩreturn sum;}voidpListPrint(struct PCB *pList){//AAA/输出内存中空间占用情况printf("\n进程分配情况:进程\t 始址\t占用\n”);for(int i=0;i<pLength;i++){ﻩprintf(" P%d\t%d K\t%d KB\n",pList[i]、pNo,pList[i]、pStartAddr,pList[i]、pOccupy);ﻩ}}void distribute(LinkList&L,structPCB *process){ﻩLinkList p=L-〉next;ﻩwhile(p!=NULL)ﻩ{ﻩif(p—>areaSize>=process->pSize)ﻩbreak;ﻩﻩp=p—〉next;ﻩ}ﻩprintf(”%d KB <%d KB”,process—>pSize,p->areaSize);ﻩif(p—〉areaSize-process->pSize〈=SIZE){ﻩ//不用分割全部分配 (直接删除此空闲分区结点)process—〉pStartAddr=p->aStartAddr; //进程始址变化ﻩprocess->pState=1; //进程状态ﻩprocess->pOccupy=p—〉areaSize; //进程实际占用内存为改空闲分区得大小ﻩpList[pLength++]= *process; //把进程加入进程列表printf(" 且%d KB - %d KB = %d KB 〈%d KB则整区分配\n”,ﻩ p->areaSize,process—>pSize,p—>areaSize—process-〉p Size,SIZE);ﻩpSort(pList);printf("\n分配后>〉>〉\n”);ﻩﻩpListPrint(pList);//输出内存中空间占用情况ﻩﻩDeleteElem(L,p->aStartAddr);}else{//分割分配process—>pStartAddr=p->aStartAddr; //进程始址变化ﻩprocess->pState=1; //进程状态ﻩprocess-〉pOccupy=process->pSize;//进程实际占用内存为该进程得大小ﻩﻩpList[pLength++]= *process;//把进程加入进程列表ﻩprintf("且%d KB - %d KB = %d KB > %d KB 则划分分配\n”,ﻩﻩ p-〉areaSize,process-〉pSize,p->areaSize—process->pSiz e,SIZE);ﻩﻩpSort(pList);//进程排序ﻩprintf(”\n分配后>>>>\n”);ﻩpListPrint(pList);//输出内存中空间占用情况ﻩ//pact(L,pList);p—〉aStartAddr+=process—>pSize;//空闲分区始址变化p—〉areaSize—=process-〉pOccupy;//空闲分区大小变化}}intmain(){ﻩ//0、创建一个进程,参数随机数方式产生ﻩstruct PCB p;ﻩ inti,num,dele,k,stAddr,flag;ﻩ LinkList s,L;ﻩprintf(”********************************可重定位分区分配********************************");if(!InitList(L))//初始化空闲分区表ﻩprintf("创建表失败\n");while(1){ﻩsrand(time(0));ﻩflag=rand()%100+1;if(flag%2==0){creatP(&p);//初始化进程printf("________________________________________________________________________________");ﻩﻩprintf(”待装入作业:%dSize = %d KB\n",p、pNo,p、pSize);//1、请求分配 size//2、检索空闲分区表(首次适应FF)ﻩPrintList(L);stAddr=search(L,p、pSize);//得到足够大得分区得始址,没有则返回—1if(stAddr==-1){//没有足够大得分区ﻩif(add(L)>=p、pSize){//空闲区总与足够大ﻩﻩprintf("没有足够大得空闲分区但空闲总与足够大\n");ﻩﻩ//紧凑ﻩpact(L,pList);ﻩ //按动态分区方式分配ﻩdistribute(L,&p);ﻩ//pact(L,pList);//紧凑ﻩﻩ}else{ //空闲区总与不足ﻩprintf("分配失败\n\n");ﻩﻩ}}else{//有足够大得distribute(L,&p);ﻩﻩPrintList(L);ﻩﻩ//pact(L,pList);//紧凑ﻩ}ﻩ}else{//回收ﻩﻩﻩif(pLength〉0){ﻩrecycle(L,pList);//pact(L,pList);//紧凑}else{ﻩprintf("无可回收内存! ”);ﻩ}}system("pause”);}//whilereturn 0;}4.结果及其相关分析图4、1分析:作业1大小为20KB。

相关文档
最新文档