实验三 基本存储器管理-存储器的分配与回收算法实现
实习3 磁盘存储空间的分配和回收
实习三磁盘存储空间的分配和回收一、实习题目连续磁盘存储空间的分配和回收。
二、实习目的磁盘初始化时把磁盘存储空间分成许多块(扇区),这些空间可以被多个用户共享。
用户作业在执行期间常常要在磁盘上建立文件或把已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。
一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间。
怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实习使学生掌握磁盘存储空间的分配和回收算法。
三、实习内容模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。
四、设计思想1.设计思路(1) 要在磁盘上建立顺序文件时,必须把按序排列的逻辑记录依次存放在磁盘的连续存储空间中。
可假定磁盘初始化时,已把磁盘存储空间划分成若干等长的块(扇区),按柱面号和盘面号的顺序给每一块确定一个编号。
随着文件的建立、删除、磁盘存储空间被分成许多区(每一区包含若干块),有的区存放着文件,而有的区是空闲的。
当要建立顺序文件时必须找到一个合适的空闲区来存放文件记录,当一个文件被删除时,则该文件占用的区应成为空闲区。
为此可用一张空闲区表来记录磁盘存储空间中尚未占用的部分,格式如下:(2) 建立文件时,先查找空闲区表,从状态为“未分配”的表项中找出一个块数能满足要求的区,由起始空闲块号能依次推得可使用的其它块号。
若不需要占用该区的所有块时,则剩余的块仍应为未分配的空闲块,这时要修改起始空闲块号和空闲块数。
若占用了该区的所有块,则相应登记栏中的状态修改成“空表目”。
删除一个文件时,需要考虑空闲块的合并情况。
磁盘存储空间的分配和回收算法类似于主存储器的可变分区方式的分配和回收。
(3) 当找到空闲块后,必须启动磁盘把信息存放到指定的块中,启动磁盘必须给出由三个参数组成的物理地址:盘面号、柱面号和物理记录号(即扇区号)。
存储器管理实验实验报告
存储器管理实验实验报告一、实验目的存储器管理是操作系统的重要组成部分,本次实验的目的在于深入理解存储器管理的基本原理和方法,通过实际操作和观察,掌握存储器分配与回收的算法,以及页面置换算法的实现和性能评估。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。
三、实验内容与步骤(一)存储器分配与回收算法实现1、首次适应算法(1)原理:从空闲分区链的首地址开始查找,找到第一个满足需求的空闲分区进行分配。
(2)实现步骤:建立空闲分区链表,每个节点包含分区的起始地址、大小和状态(已分配或空闲)。
当有分配请求时,从链表头部开始遍历,找到第一个大小满足需求的空闲分区。
将该分区进行分割,一部分分配给请求,剩余部分仍作为空闲分区留在链表中。
若找不到满足需求的空闲分区,则返回分配失败。
2、最佳适应算法(1)原理:从空闲分区链中选择与需求大小最接近的空闲分区进行分配。
(2)实现步骤:建立空闲分区链表,每个节点包含分区的起始地址、大小和状态。
当有分配请求时,遍历整个链表,计算每个空闲分区与需求大小的差值。
选择差值最小的空闲分区进行分配,若有多个差值相同且最小的分区,选择其中起始地址最小的分区。
对选中的分区进行分割和处理,与首次适应算法类似。
3、最坏适应算法(1)原理:选择空闲分区链中最大的空闲分区进行分配。
(2)实现步骤:建立空闲分区链表,每个节点包含分区的起始地址、大小和状态。
当有分配请求时,遍历链表,找到最大的空闲分区。
对该分区进行分配和处理。
(二)页面置换算法实现1、先进先出(FIFO)页面置换算法(1)原理:选择在内存中驻留时间最久的页面进行置换。
(2)实现步骤:建立页面访问序列。
为每个页面设置一个进入内存的时间戳。
当发生缺页中断时,选择时间戳最早的页面进行置换。
2、最近最久未使用(LRU)页面置换算法(1)原理:选择最近一段时间内最长时间未被访问的页面进行置换。
天津理工大学_操作系统_存储器的分配与回收算法实现_实验报告
实验报告学院(系)名称:计算机与通信工程学院【实验过程记录(源程序、测试用例、测试结果及心得体会等)】源程序:MemoryBlock.java://内存块类,包含各种操作public class MemoryBlock {static final int BLOCK_SIZE = 4096;private int baseBlock; //内存块基地址private int blockNum; //大小private boolean inUse; //是否已分配private MemoryBlock prev, next;public MemoryBlock(int blockNum) {this.baseBlock = 0;this.blockNum = blockNum;inUse = false;prev = null;next = null;}public MemoryBlock(int base, int blockNum) {this.baseBlock = base;this.blockNum = blockNum;inUse = false;prev = null;next = null;}public int getBlockNum() {return blockNum;}public void setBlockNum(int blockNum) {this.blockNum = blockNum;}public MemoryBlock getPrev() {return prev;}public void setPrev(MemoryBlock prev) {this.prev = prev;public MemoryBlock getNext() {return next;}public void setNext(MemoryBlock next) {this.next = next;}public boolean inUse() {return inUse;}public void setUse() {inUse = true;}public void free() {inUse = false;}public int getBaseBlock() {return baseBlock;}public void setBaseBlock(int baseBlock) { this.baseBlock = baseBlock;}//分配内存块,如果可分配,则返回剩余内存块public MemoryBlock allocate(int blockNum) { if(this.blockNum - blockNum>0) {int newBase = baseBlock + blockNum;int newBlock = this.blockNum-blockNum;this.blockNum = blockNum;setUse();return new MemoryBlock(newBase, newBlock);}else if(this.blockNum - blockNum ==0) {this.blockNum = 0;}return null;}//判断内存块是否能合并public boolean merge(MemoryBlock memBlock) {if(baseBlock+blockNum==memBlock.getBaseBlock()) {setBlockNum(blockNum+memBlock.blockNum);memBlock.setBaseBlock(0);memBlock.setBlockNum(0);return true;}elsereturn false;}@Overridepublic String toString() {String inUse = null;if(inUse())inUse = "已分配";else inUse = "未分配";return"内存块 [基地址=" + baseBlock + ", 大小=" + blockNum +", " + inUse + "]";}}MemoryTable.java://虚类MemTable,提供内存链表的各种基本方法public abstract class MemoryTable {//MemoryBlock链表表头protected MemoryBlock memList;public MemoryTable(int blockNum) {memList = new MemoryBlock(0, blockNum);}//把newBlock插入到memBlock前面public void insertBefore(MemoryBlock memBlock, MemoryBlock newBlock){if(memBlock.getPrev() != null)memBlock.getPrev().setNext(newBlock);if(memList == memBlock)memList = newBlock;newBlock.setPrev(memBlock.getPrev());newBlock.setNext(memBlock);memBlock.setPrev(newBlock);}//在memBlock后插入newBlockpublic void insert(MemoryBlock memBlock, MemoryBlock newBlock) { if(memBlock.getNext() != null)memBlock.getNext().setPrev(newBlock);newBlock.setNext(memBlock.getNext());memBlock.setNext(newBlock);newBlock.setPrev(memBlock);}//删除块的连接关系,但不释放块public void remove(MemoryBlock memBlock) {if(memBlock == memList)memList = memBlock.getNext();if(memBlock.getNext()!=null)memBlock.getNext().setPrev(memBlock.getPrev());if(memBlock.getPrev()!=null)memBlock.getPrev().setNext(memBlock.getNext());}public void print() {MemoryBlock memBlock = memList;int i=0;while(memBlock != null) {System.out.print(i+" ");System.out.println(memBlock);i++;memBlock = memBlock.getNext();}}//合并邻接的空闲内存public void merge(MemoryBlock newBlock) {MemoryBlock memBlock = memList;while(memBlock != null) {if(!memBlock.inUse()) {if(memBlock.merge(newBlock)) {memBlock.setBlockNum( memBlock.getBlockNum() +newBlock.getBlockNum());remove(newBlock);break;}if(newBlock.merge(memBlock)) {newBlock.setBlockNum( newBlock.getBlockNum() + memBlock.getBlockNum());break;}}memBlock = memBlock.getNext();}}//分配内存(抽象函数)public abstract boolean allocate(int blockNum);//释放内存(抽象函数)public abstract boolean free(int baseBlock);}FirstFit.java:public class FirstFit extends MemoryTable{public FirstFit(int blockNum) {super(blockNum);}@Overridepublic boolean allocate(int blockNum) {MemoryBlock memBlock = memList;while(memBlock!=null) {if(!memBlock.inUse()) {if(memBlock.getBlockNum()>blockNum) {MemoryBlock newBlock = memBlock.allocate(blockNum);insert(memBlock, newBlock);return true;}else if(memBlock.getBlockNum()==blockNum) {memBlock.setUse();}}memBlock = memBlock.getNext();}return false;}//分配内存(类内使用)void freeMemory(MemoryBlock freeBlock) {MemoryBlock prev = freeBlock.getPrev();MemoryBlock next = freeBlock.getNext();freeBlock.free();while(!prev.inUse() && (prev.merge(freeBlock))) {prev.setBlockNum( prev.getBlockNum() +freeBlock.getBlockNum());remove(freeBlock);freeBlock = prev;if(freeBlock.getPrev()!=null)prev = freeBlock.getPrev();else return;}}if(freeBlock.getNext()!=null) {while(!next.inUse() && (freeBlock.merge(next))) {freeBlock.setBlockNum ( next.getBlockNum() +freeBlock.getBlockNum());remove(next);freeBlock = next;if(freeBlock.getNext()!=null)next = freeBlock.getNext();else return;}}}@Overridepublic boolean free(int baseBlock) {MemoryBlock memBlock = memList;while(memBlock != null) {if(memBlock.getBaseBlock() == baseBlock) {freeMemory(memBlock);return true;}memBlock = memBlock.getNext();}return false;}}BestFit.java:public class BestFit extends MemoryTable {private MemoryBlock usedMemory;public BestFit(int blockNum) {super(blockNum);usedMemory = null;}@Overridepublic boolean allocate(int blockNum) {MemoryBlock memBlock = memList;MemoryBlock minBlock = null;for(;memBlock!=null; memBlock = memBlock.getNext()) { if(!memBlock.inUse()&&(memBlock.getBlockNum()>=blockNum)) { minBlock = memBlock;break;}}if(minBlock != null) {remove(minBlock);if(minBlock.getBlockNum()!=blockNum) {MemoryBlock newBlock = minBlock.allocate(blockNum);insertUnused(newBlock);}insertUsed(minBlock);return true;}elsereturn false;}boolean freeMemory(MemoryBlock freeBlock) {if(freeBlock != null) {freeBlock.free();removeUsed(freeBlock);insertUnused(freeBlock);return true;}return false;}@Overridepublic boolean free(int baseBlock) {MemoryBlock memBlock = usedMemory;while(memBlock != null) {if(memBlock.getBaseBlock() == baseBlock) {freeMemory(memBlock);merge(memBlock);return true;}memBlock = memBlock.getNext();return false;}//在已分配链表删除public void removeUsed(MemoryBlock memBlock) {if(memBlock == usedMemory)usedMemory = memBlock.getNext();if(memBlock.getNext()!=null)memBlock.getNext().setPrev(memBlock.getPrev());if(memBlock.getPrev()!=null)memBlock.getPrev().setNext(memBlock.getNext());}//插入未分配链表void insertUnused(MemoryBlock newBlock) {if(memList == null)memList = newBlock;else {MemoryBlock memBlock = memList;MemoryBlock preBlock = null;while(memBlock!=null) {if(newBlock.getBlockNum()<=memBlock.getBlockNum()) { insertBefore(memBlock, newBlock);return;}preBlock = memBlock;memBlock = memBlock.getNext();}insert(preBlock, newBlock);}}//插入已分配链表void insertUsed(MemoryBlock newBlock) {if(usedMemory == null)usedMemory = newBlock;else {MemoryBlock memBlock = usedMemory;while(memBlock.getNext() != null)memBlock = memBlock.getNext();memBlock.setNext(newBlock);newBlock.setPrev(memBlock);}}public void print() {super.print();MemoryBlock memBlock = usedMemory;int i=0;while(memBlock != null) {System.out.print(i+" ");System.out.println(memBlock);i++;memBlock = memBlock.getNext();}}}WorstFit.java:public class WorstFit extends MemoryTable {//已分配链表private MemoryBlock usedMemory;public WorstFit(int blockNum) {super(blockNum);usedMemory = null;}@Overridepublic boolean allocate(int blockNum) {MemoryBlock maxBlock = memList;if(maxBlock.getBlockNum()<blockNum)return false;remove(maxBlock);if(maxBlock.getBlockNum()!=blockNum) {MemoryBlock newBlock = maxBlock.allocate(blockNum);insertUnused(newBlock);}insertUsed(maxBlock);return true;}boolean freeMemory(MemoryBlock freeBlock) {if(freeBlock != null) {freeBlock.free();removeUsed(freeBlock);insertUnused(freeBlock);}return false;}@Overridepublic boolean free(int baseBlock) {//已分配链表MemoryBlock memBlock = usedMemory;while(memBlock != null) {if(memBlock.getBaseBlock() == baseBlock) {freeMemory(memBlock);merge(memBlock);return true;}memBlock = memBlock.getNext();}return false;}public void removeUsed(MemoryBlock memBlock) {if(memBlock == usedMemory)usedMemory = memBlock.getNext();if(memBlock.getNext()!=null)memBlock.getNext().setPrev(memBlock.getPrev());if(memBlock.getPrev()!=null)memBlock.getPrev().setNext(memBlock.getNext());}void insertUnused(MemoryBlock newBlock) {if(memList == null)memList = newBlock;else {MemoryBlock memBlock = memList;MemoryBlock preBlock = null;while(memBlock!=null) {if(newBlock.getBlockNum()>=memBlock.getBlockNum()) { insertBefore(memBlock, newBlock);return;}preBlock = memBlock;memBlock = memBlock.getNext();}insert(preBlock, newBlock);}}void insertUsed(MemoryBlock newBlock) {if(usedMemory == null)usedMemory = newBlock;else {MemoryBlock memBlock = usedMemory;while(memBlock.getNext() != null)memBlock = memBlock.getNext();memBlock.setNext(newBlock);newBlock.setPrev(memBlock);}}public void print() {super.print();MemoryBlock memBlock = usedMemory;int i=0;while(memBlock != null) {System.out.print(i+" ");System.out.println(memBlock);i++;memBlock = memBlock.getNext();}}}测试用例:Main.java:public class Main {public static void main(String[] args) {testFirstFit();System.out.println();testBestFit();System.out.println();testWorstFit();}public static void testFirstFit() {MemoryTable mem = new FirstFit(1024);System.out.println("测试首次适应法:");mem.allocate(512);mem.allocate(256);mem.allocate(128);mem.print();mem.free(512);mem.free(768);mem.print();}public static void testBestFit() {MemoryTable mem = new BestFit(1024);System.out.println("测试最佳适应法:");mem.allocate(1);mem.allocate(2);mem.allocate(3);mem.print();mem.free(0);mem.free(1);mem.print();}public static void testWorstFit() {MemoryTable mem = new WorstFit(1024);System.out.println("测试最坏适应法:");mem.allocate(1);mem.allocate(2);mem.allocate(3);mem.print();mem.free(0);mem.free(3);mem.print();}}测试结果:测试首次适应法:分配 512 内存分配 256 内存分配 128 内存内存单元:0 内存块 [基地址=0, 大小=512, 已分配]1 内存块 [基地址=512, 大小=256, 已分配]2 内存块 [基地址=768, 大小=128, 已分配]3 内存块 [基地址=896, 大小=128, 未分配]释放 512 处内存释放 768 处内存内存单元:0 内存块 [基地址=0, 大小=512, 已分配]1 内存块 [基地址=512, 大小=512, 未分配]测试最佳适应法:分配 1 内存分配 2 内存分配 3 内存内存单元:0 内存块 [基地址=6, 大小=1018, 未分配]0 内存块 [基地址=0, 大小=1, 已分配]1 内存块 [基地址=1, 大小=2, 已分配]2 内存块 [基地址=3, 大小=3, 已分配]释放 0 处内存释放 1 处内存内存单元:0 内存块 [基地址=0, 大小=3, 未分配]1 内存块 [基地址=6, 大小=1018, 未分配]0 内存块 [基地址=3, 大小=3, 已分配]测试最坏适应法:分配 1 内存分配 2 内存分配 3 内存内存单元:0 内存块 [基地址=6, 大小=1018, 未分配]0 内存块 [基地址=0, 大小=1, 已分配]1 内存块 [基地址=1, 大小=2, 已分配]2 内存块 [基地址=3, 大小=3, 已分配]释放 0 处内存释放 3 处内存内存单元:0 内存块 [基地址=3, 大小=1021, 未分配]1 内存块 [基地址=0, 大小=1, 未分配]0 内存块 [基地址=1, 大小=2, 已分配]心得体会:1.使用类来进行一些方法的重用2.释放内存时,根据不同的分配方法进行相邻的内存合并3.链表应根据具体情况优化从而简化代码。
实验三基本存储器管理方案计划-存储器的分配与回收算法实现
实验三基本存储器管理-存储器的分配与回收算法◆实验名称:存储器的分配与回收算法实验◆仪器、设备:计算机◆参考资料:操作系统实验指导书◆实验目的:设计一个存储器的分配与回收算法管理方案,并编写模拟程序实现。
◆实验内容:1. 模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。
2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。
3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。
若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。
4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。
5. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。
◆实验要求:1.详细描述实验设计思想、程序结构及各模块设计思路;2.详细描述程序所用数据结构及算法;3.明确给出测试用例和实验结果;4.为增加程序可读性,在程序中进行适当注释说明;5.认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;6.实验报告撰写要求结构清晰、描述准确逻辑性强;实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。
◆实验过程记录(源程序、测试用例、测试结果及心得体会等实验代码如下:#include <iostream.h>int work[10][2]; //作业名字大小int idle[10][2]; //空闲区地址大小int free[10][3]; //已分配区域的名字地址大小int num=0,b=1,d,ch1,ch2;void init(){idle[0][0]=1;idle[0][1]=100;free[0][0]=0;free[1][1]=0;free[1][2]=0;work[0][0]=0;work[0][1]=0;for(int i=1;i <=9;i++){ //初始化数组idle[i][0]=0;idle[i][1]=0;free[i][0]=0;free[i][1]=0;free[i][2]=0;work[i][0]=0;work[i][1]=0;}}void jishu(){ //求空闲单元数for(int i=0;i <9;i++)if(idle[i][1]!=0)num++;}void jishu1(){ //求作业数for(int i=0;i <9;i++)if(work[i][1]!=0)b++;}void zuixian(){ //最先适应法jishu();for(int i=0;i <num;i++){for(int j=i;j <num-i-1;j++){if(idle[j][0]>idle[j+1][0]){int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}}void zuijia(){ //最佳适应法num=0;jishu();for(int i=0;i <num;i++){for(int j=i;j <num-i-1;j++){if(idle[j][1]>idle[j+1][1]) {int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}void zuihuai(){ //最坏适应法num=0;jishu();for(int i=0;i <num;i++){for(int j=i;j <num-i-1;j++){if(idle[j][1] <idle[j+1][1]){int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}}void huishou(int name){ //回收进程函数num=0;b=0;jishu();jishu1();int c=-1;for(int k=0;k <=b;k++){if(free[k][0]==name){c=k;break;}}if(c==-1)cout <<"要回收的作业不存在!" <<endl;else{for(int i=0;i <num;i++){ //将空闲单元排序{不包括新回收的}for(int j=i;j <num-i-1;j++){if(idle[j][0]>idle[j+1][0]){int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}for(int q=0;q <num;q++){ //将空单元排序{包括新回收的} if(free[c][1] <=idle[q][0]){for(int j=num;j>=q;j--){idle[j+1][0]=idle[j][0];idle[j+1][1]=idle[j][1];}idle[j][0]=free[c][1];idle[j][1]=free[c][2];b++;if(idle[j+1][0]==idle[j][0]+idle[j][1]){idle[j][1]=idle[j][1]+idle[j+1][1];for(int m=j+1;m <=num;m++){idle[m][0]=idle[m+1][0];idle[m][1]=idle[m+1][1];}idle[m][0]=0;idle[m][1]=0;b--;}if(idle[j-1][0]==idle[j][0]){idle[j-1][1]=idle[j-1][1]+idle[j][1];for(int n=j;j <=num;j++){idle[n][0]=idle[n+1][0];idle[n][1]=idle[n+1][1];}idle[n][0]=0;idle[n][1]=0;b--;}break;}}if(ch2==1)zuixian();if(ch2==2)zuijia();if(ch2==3)zuihuai();for(int p=c;c <b-1;c++){free[c][0]=free[c+1][0];free[c][1]=free[c+1][1];free[c][2]=free[c+1][2];work[c][0]=work[c+1][0];work[c][1]=work[c+1][1];}cout<<"该进程已被成功回收!"<<endl;.\ }}void fp(){int tag=0; //判断空闲区与请求区大小num=0;b=0;jishu();jishu1();for(int j=0;j <num;j++){if(work[b][1] <idle[j][1]){free[b][0]=work[b][0];free[b][1]=idle[j][0];free[b][2]=work[b][1];idle[j][0]=idle[j][0]+work[b][1];idle[j][1]=idle[j][1]-work[b][1];tag=1;break;}else if(work[b][1]==idle[j][1]){free[b][0]=work[b][0];free[b][1]=idle[j][0];.\ free[b][2]=work[b][1];tag=1;for(int i=j;i <=num-1;i++){idle[i][0]=idle[i+1][0];idle[i][1]=idle[i+1][1];}break;}else tag=0;}if(tag==0)cout <<"作业过大没有足够存储空间!" <<endl;}void print(){num=0;b=1;jishu();jishu1();cout <<"已分配表为:" <<endl;for(int i=0;i <=b;i++)if(free[i][2]!=0)cout <<"作业名:" <<free[i][0] <<" 内存起始地址:" <<free[i][1] <<" 占用内存空间:" <<free[i][2] <<endl;cout <<endl;cout <<"空闲区表为:" <<endl;for(int j=0;j <num;j++)if(idle[j][1]!=0)cout <<"起始地址:" <<idle[j][0] <<" 连续内存空间:" <<idle[j][1]<<endl;cout <<endl;}void main(){ //主函数运行上面定义的函数init();int n;cout <<"1.分配空间;2.回收空间;" <<endl;cin>>ch1;cout <<endl;cout <<"1.最先适应法;2.最佳适应法;3.最坏适应法;" <<endl;cin>>ch2;cout <<endl;if(ch1==1){cout <<"请输入要分配内存的作业名及占用内存大小:";cin>>work[b][0]>>work[b][1];cout <<endl;if(ch2==1){zuixian();fp();}else if(ch2==2){zuijia();fp();}else if(ch2==3){zuihuai();fp();}print();}cout <<"输入要回收的作业名:" <<endl;cin>>n;huishou(n);}实验截图:成功回收时:回收失败时:实验体会:本次实验的难度较大,尤其是回收进程,主要编写几个算法和回收程序,最佳,最优,最坏算法和回收算法,我用的是数组,有工作数组,空闲数组,已分配数组。
存储管理动态分区分配及回收算法
before=head2; after=head2->next; while(after) { if(after->adr==back2->adr+back2->size) {//和后边空闲区合并
void print(char choice)//输出空闲区队列信息
-9-
{ Node *p;
if(choice=='f'||choice=='F') p=head1->next;
else p=head2->next;
if(p) { printf("\n空闲区队列的情况为:\n");
-4-
if(back1->adr==before->adr+before->size) {//和前边分区合并 before->size+=back1->size; before->next=back1->next; free(back1); } else if(after&&back1->adr+back1->size==after->adr) {//和后边分区合并 back1->size+=after->size; back1->next=after->next; back1->id=after->id; free(after); after=back1; } printf("\t首先分配算法回收内存成功!!!\n"); } else printf("\t首先分配算法回收内存失败!!!\n");
操作系统实验报告-可变分区存储管理方式的内存分配回收
实验三可变分区存储管理方式的内存分配回收一.实验目的(1)深入了解可变分区存储管理方式的内存分配回收的实现。
二.实验内容编写程序完成可变分区存储管理方式的内存分配回收,要求有内存空间分配表,并采用最优适应算法完成内存的分配与回收。
三.实验原理在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是一个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被占用,而有的分区时空闲的。
为了方便主存空间的分配和去配,用于管理的数据结构可由两张表组成:“已分配区表”和“未分配区表”。
在“未分配表中”将空闲区按长度递增顺序排列,当装入新作业时,从未分配区表中挑选一个能满足用户进程要求的最小分区进行分配。
这时从已分配表中找出一个空栏目登记新作业的起始地址和占用长度,同时修改未分配区表中空闲区的长度和起始地址。
当作业撤离时已分配区表中的相应状态变为“空”,而将收回的分区登记到未分配区表中,若有相邻空闲区再将其连接后登记。
可变分区的回收算法较为复杂,当一个作业撤离时,可分为4种情况:其临近都有作业(A和B),其一边有作业(A或B),其两边均为空闲区。
尤其重要的是,在程序中利用“new类型T(初值列表)”申请分配用于存放T类型数据的内存空间,利用“delete指针名”释放指针所指向的内存空间。
四.实验部分源程序#include <iostream>using namespace std;typedef struct SNode { // Space Nodeint start,end; // 起始,结束int length; // 长度大小struct SNode *next; // 指向下一结点的指针}* SP;SP Head=(SP)malloc(sizeof(SNode)); // 全局变量,内存空间头结void DispSpace() { // 显示内存空间分配情况SP p=Head->next;cout<<"\n 空闲区说明表\n"<<"---地址--长度---\n";while (p){cout<<" "<<p->start<<" "<<p->length<<endl;p=p->next;}cout<<"----------------\n";}void Initial() { // 初始化说明表SP p,q;p=(SP)malloc(sizeof(SNode));q=(SP)malloc(sizeof(SNode));p->start=14; p->length=12; p->end=26;q->start=32; q->length=96; q->end=128; // 指导书上的作业分配Head->next=p; // 与头结点连接p->next=q;q->next=NULL;DispSpace();}void Allocation(int len) { // 分配内存给新作业SP p=Head->next,q;while (p){if (p->length < len)p=p->next;else if (p->length > len){p->start=p->start+len;p->length=p->length-len;cout<<"分配成功!\n";DispSpace(); return;}else{//当两者长度相等q=p->next;p->next=q->next;cout<<"分配成功!\n";DispSpace(); return;}}cout<<"分配失败!\n";DispSpace(); return;}void CallBack(int sta,int len) { // 回收内存SP p=Head,q=p->next,r; // 开始地址和长度p->end=0;int en=sta+len;while (q) {if (sta == 0) { // 初始地址为0if (en == q->start) { // 正好回收q->start=0;q->length=q->end;return;}else {r=(SP)malloc(sizeof(SNode));r->start=sta; r->length=len; r->end=en;p->next=r;r->next=q;return;}}else if ((p->end < sta) && (q->start > en)) { // 上邻区r=(SP)malloc(sizeof(SNode));r->start=sta; r->length=len; r->end=en;p->next=r;r->next=q;return;}else if ((p->end < sta) && (q->start == en)) { // 邻区相接q->start=sta;q->length=q->end-sta;return;}else if ((p->end == sta) && (q->start < en)) { // 下邻区p->end=en;p->length=en-p->start;return;}else if (p->end==sta && q->start==en) { // 邻区相接p->end=q->end;p->length=p->end-p->start;p->next=q->next;return;}else {p=p->next;q=q->next;}}}void main() {Initial();cout<<"现在分配大小为6K 的作业4 申请装入主存: ";Allocation(6); // 分配时参数只有长度//--------指导书测试数据演示----------cout<<"现回收作业 3 (起址10,长度4)\n";CallBack(10,4);DispSpace();cout<<"现回收作业 2 (起址26,长度6)\n";CallBack(26,6);DispSpace();//---------------演示结束-------------system("pause");}五.实验结果与体会我的体会:下面红色部分是赠送的总结计划,不需要的可以下载后编辑删除!2014年工作总结及2015年工作计划(精选)XX年,我工区安全生产工作始终坚持“安全第一,预防为主,综合治理”的方针,以落实安全生产责任制为核心,积极开展安全生产大检查、事故隐患整改、安全生产宣传教育以及安全生产专项整治等活动,一年来,在工区全员的共同努力下,工区安全生产局面良好,总体安全生产形势持续稳定并更加牢固可靠。
内存的分配和回收分区链实验报告按照这个内容来完成
一、实验目的理解分区式存储管理的基本原理,熟悉分区分配和回收算法。
即理解在不同的存储管理方式下,如何实现主存空间的分配与回收;并掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。
二、设备与环境1. 硬件设备:PC机一台2. 软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如VC \VC++\Java 等编程语言环境。
三、实验原理实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。
同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。
同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。
A、主存空间分配(1)首次适应算法在该算法中,把主存中所有空闲区按其起始地址递增的次序排列。
在为作业分配存储空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足要求的空闲区,从中划出与请求的大小相等的存储空间分配给作业,余下的空闲区仍留在空闲区链中。
(2)最佳适应算法在该算法中,把主存中所有空闲区按其起始地址递增的次序排列。
在为作业分配存储空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲区且该空闲区的大小比其他满足要求的空闲区都小,从中划出与请求的大小相等的存储空间分配给作业,余下的空闲区仍留在空闲区链中(3)最坏适应算法在该算法中,把主存中所有空闲区按其起始地址递增的次序排列。
在为作业分配存储空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲区且该空闲区的大小比其他满足要求的空闲区都大,从中划出与请求的大小相等的存储空间分配给作业,余下的空闲区仍留在空闲区链中。
B、主存空间回收当一个作业执行完成撤离时,作业所占的分区应该归还给系统。
存储管理动态分区分配及回收算法
存储管理动态分区分配及回收算法存储管理是操作系统中非常重要的一部分,它负责对计算机系统的内存进行有效的分配和回收。
动态分区分配及回收算法是其中的一种方法,本文将详细介绍该算法的原理和实现。
动态分区分配及回收算法是一种将内存空间划分为若干个动态分区的算法。
当新的作业请求空间时,系统会根据作业的大小来分配一个合适大小的分区,使得作业可以存储在其中。
当作业执行完毕后,该分区又可以被回收,用于存储新的作业。
动态分区分配及回收算法包括以下几个步骤:1.初始分配:当系统启动时,将整个内存空间划分为一个初始分区,该分区可以容纳整个作业。
这个分区是一个连续的内存块,其大小与初始内存大小相同。
2.漏洞表管理:系统会维护一个漏洞表,用于记录所有的可用分区的大小和位置。
当一个分区被占用时,会从漏洞表中删除该分区,并将剩余的空间标记为可用。
3.分区分配:当一个作业请求空间时,系统会根据作业的大小,在漏洞表中查找一个合适大小的分区。
通常有以下几种分配策略:- 首次适应(First Fit): 从漏洞表中找到第一个满足作业大小的分区。
这种策略简单快速,但可能会导致内存碎片的产生。
- 最佳适应(Best Fit): 从漏洞表中找到最小的满足作业大小的分区。
这种策略可以尽量减少内存碎片,但是分配速度相对较慢。
- 最差适应(Worst Fit): 从漏洞表中找到最大的满足作业大小的分区。
这种策略可以尽量减少内存碎片,但是分配速度相对较慢。
4.分区回收:当一个作业执行完毕后,系统会将该分区标记为可用,并更新漏洞表。
如果相邻的可用分区也是可合并的,系统会将它们合并成一个更大的分区。
总结来说,动态分区分配及回收算法是一种对计算机系统内存进行有效分配和回收的方法。
通过合理的分配策略和回收机制,可以充分利用内存资源,提高系统性能。
然而,如何处理内存碎片问题以及选择合适的分配策略是需要仔细考虑的问题。
存储器的分配与回收算法实现
存储器的分配与回收算法实现一、引言存储器的分配与回收算法是计算机操作系统中的重要内容之一。
它涉及到内存管理、进程管理等多个方面,对计算机系统的性能和稳定性都有着重要的影响。
本文将从存储器分配与回收算法的基本原理、常见算法及其实现方式等方面进行详细介绍。
二、存储器分配与回收算法基本原理1. 存储器分配在计算机系统中,进程需要使用一定数量的内存空间来运行。
因此,操作系统需要为每个进程分配一定数量的内存空间。
存储器分配就是指操作系统为进程分配内存空间的过程。
2. 存储器回收当一个进程不再需要使用某段内存空间时,操作系统需要将该段内存空间释放出来,以便其他进程使用。
这个过程称为存储器回收。
三、常见的存储器分配与回收算法1. 首次适应算法(First Fit)首次适应算法是最简单、最常用的一种内存分配方法。
该方法从低地址开始查找可用块,并选择第一个满足要求(大小大于或等于所需大小)的块进行分配。
优点:实现简单,效率高。
缺点:容易产生内存碎片,导致内存利用率低。
2. 最佳适应算法(Best Fit)最佳适应算法是一种比首次适应算法更为优化的算法。
该算法从所有可用块中选择最小的一个块进行分配。
优点:可以有效减少内存碎片,提高内存利用率。
缺点:实现复杂度高,效率较低。
3. 最差适应算法(Worst Fit)最差适应算法是一种与最佳适应算法相反的方法。
该方法选择可用块中最大的一个块进行分配。
优点:容易实现,效率较高。
缺点:会产生大量的内存碎片,降低了内存利用率。
4. 快速适应算法(Quick Fit)快速适应算法是一种基于链表结构的动态分配方法。
该方法将可用块按照大小分类,并将它们组织成多个链表。
当需要分配内存时,只需在对应大小的链表中查找可用块即可。
优点:能够快速地找到合适大小的空闲块,提高了效率和内存利用率。
缺点:实现复杂度较高,需要维护多个链表结构。
四、常见的存储器分配与回收算法实现方式1. 静态分配静态分配是指在程序运行之前就确定好内存的使用情况,将内存空间划分为不同的区域,并为每个区域分配固定大小的内存空间。
实验三 基本存储器管理系统-存储器的分配与回收算法实现
实验三基本存储器管理-存储器的分配与回收算法◆实验名称:存储器的分配与回收算法实验◆仪器、设备:计算机◆参考资料:操作系统实验指导书◆实验目的:设计一个存储器的分配与回收算法管理方案,并编写模拟程序实现。
◆实验内容:1. 模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。
2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。
3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。
若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。
4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。
5. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。
◆实验要求:1.详细描述实验设计思想、程序结构及各模块设计思路;2.详细描述程序所用数据结构及算法;3.明确给出测试用例和实验结果;4.为增加程序可读性,在程序中进行适当注释说明;5.认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;6.实验报告撰写要求结构清晰、描述准确逻辑性强;实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。
◆实验过程记录(源程序、测试用例、测试结果及心得体会等实验代码如下:#include <iostream.h>int work[10][2]; //作业名字大小int idle[10][2]; //空闲区地址大小int free[10][3]; //已分配区域的名字地址大小int num=0,b=1,d,ch1,ch2;void init(){idle[0][0]=1;idle[0][1]=100;free[0][0]=0;free[1][1]=0;free[1][2]=0;work[0][0]=0;work[0][1]=0;for(int i=1;i <=9;i++){ //初始化数组idle[i][0]=0;idle[i][1]=0;free[i][0]=0;free[i][1]=0;free[i][2]=0;work[i][0]=0;work[i][1]=0;}}void jishu(){ //求空闲单元数for(int i=0;i <9;i++)if(idle[i][1]!=0)num++;}void jishu1(){ //求作业数for(int i=0;i <9;i++)if(work[i][1]!=0)b++;}void zuixian(){ //最先适应法jishu();for(int i=0;i <num;i++){for(int j=i;j <num-i-1;j++){if(idle[j][0]>idle[j+1][0]){int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}}void zuijia(){ //最佳适应法num=0;jishu();for(int i=0;i <num;i++){for(int j=i;j <num-i-1;j++){if(idle[j][1]>idle[j+1][1]) {int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}void zuihuai(){ //最坏适应法num=0;jishu();for(int i=0;i <num;i++){for(int j=i;j <num-i-1;j++){if(idle[j][1] <idle[j+1][1]){int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}}void huishou(int name){ //回收进程函数num=0;b=0;jishu();jishu1();int c=-1;for(int k=0;k <=b;k++){if(free[k][0]==name){c=k;break;}}if(c==-1)cout <<"要回收的作业不存在!" <<endl;else{for(int i=0;i <num;i++){ //将空闲单元排序{不包括新回收的}for(int j=i;j <num-i-1;j++){if(idle[j][0]>idle[j+1][0]){int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}for(int q=0;q <num;q++){ //将空单元排序{包括新回收的} if(free[c][1] <=idle[q][0]){for(int j=num;j>=q;j--){idle[j+1][0]=idle[j][0];idle[j+1][1]=idle[j][1];}idle[j][0]=free[c][1];idle[j][1]=free[c][2];b++;if(idle[j+1][0]==idle[j][0]+idle[j][1]){idle[j][1]=idle[j][1]+idle[j+1][1];for(int m=j+1;m <=num;m++){idle[m][0]=idle[m+1][0];idle[m][1]=idle[m+1][1];}idle[m][0]=0;idle[m][1]=0;b--;}if(idle[j-1][0]==idle[j][0]){idle[j-1][1]=idle[j-1][1]+idle[j][1];for(int n=j;j <=num;j++){idle[n][0]=idle[n+1][0];idle[n][1]=idle[n+1][1];}idle[n][0]=0;idle[n][1]=0;b--;}break;}}if(ch2==1)zuixian();if(ch2==2)zuijia();if(ch2==3)zuihuai();for(int p=c;c <b-1;c++){free[c][0]=free[c+1][0];free[c][1]=free[c+1][1];free[c][2]=free[c+1][2];work[c][0]=work[c+1][0];work[c][1]=work[c+1][1];}cout<<"该进程已被成功回收!"<<endl;}}void fp(){int tag=0; //判断空闲区与请求区大小num=0;b=0;jishu();jishu1();for(int j=0;j <num;j++){if(work[b][1] <idle[j][1]){free[b][0]=work[b][0];free[b][1]=idle[j][0];free[b][2]=work[b][1];idle[j][0]=idle[j][0]+work[b][1];idle[j][1]=idle[j][1]-work[b][1];tag=1;break;}else if(work[b][1]==idle[j][1]){free[b][0]=work[b][0];free[b][1]=idle[j][0];free[b][2]=work[b][1];tag=1;for(int i=j;i <=num-1;i++){idle[i][0]=idle[i+1][0];idle[i][1]=idle[i+1][1];}break;}else tag=0;}if(tag==0)cout <<"作业过大没有足够存储空间!" <<endl; }void print(){num=0;b=1;jishu();jishu1();cout <<"已分配表为:" <<endl;for(int i=0;i <=b;i++)if(free[i][2]!=0)cout <<"作业名:" <<free[i][0] <<" 内存起始地址:" <<free[i][1] <<" 占用内存空间:" <<free[i][2] <<endl;cout <<endl;cout <<"空闲区表为:" <<endl;for(int j=0;j <num;j++)if(idle[j][1]!=0)cout <<"起始地址:" <<idle[j][0] <<" 连续内存空间:" <<idle[j][1]<<endl;cout <<endl;}void main(){ //主函数运行上面定义的函数init();int n;cout <<"1.分配空间;2.回收空间;" <<endl;cin>>ch1;cout <<endl;cout <<"1.最先适应法;2.最佳适应法;3.最坏适应法;" <<endl;cin>>ch2;cout <<endl;if(ch1==1){cout <<"请输入要分配内存的作业名及占用内存大小:";cin>>work[b][0]>>work[b][1];cout <<endl;if(ch2==1){zuixian();fp();}else if(ch2==2){zuijia();fp();}else if(ch2==3){zuihuai();fp();}print();}cout <<"输入要回收的作业名:" <<endl;cin>>n;huishou(n);}实验截图:成功回收时:回收失败时:实验体会:本次实验的难度较大,尤其是回收进程,主要编写几个算法和回收程序,最佳,最优,最坏算法和回收算法,我用的是数组,有工作数组,空闲数组,已分配数组。
操作系统实验报告三存储器管理实验
操作系统实验报告三存储器管理实验操作系统实验报告三:存储器管理实验一、实验目的本次存储器管理实验的主要目的是深入理解操作系统中存储器管理的基本原理和方法,通过实际操作和观察,掌握内存分配与回收的算法,以及页面置换算法的工作过程和性能特点,从而提高对操作系统资源管理的认识和实践能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。
三、实验内容1、内存分配与回收算法实现首次适应算法(First Fit)最佳适应算法(Best Fit)最坏适应算法(Worst Fit)2、页面置换算法模拟先进先出页面置换算法(FIFO)最近最久未使用页面置换算法(LRU)时钟页面置换算法(Clock)四、实验原理1、内存分配与回收算法首次适应算法:从内存的起始位置开始,依次查找空闲分区,将第一个能够满足需求的空闲分区分配给进程。
最佳适应算法:在所有空闲分区中,选择能够满足需求且大小最小的空闲分区进行分配。
最坏适应算法:选择空闲分区中最大的分区进行分配。
2、页面置换算法先进先出页面置换算法:选择最早进入内存的页面进行置换。
最近最久未使用页面置换算法:选择最近最长时间未被访问的页面进行置换。
时钟页面置换算法:给每个页面设置一个访问位,在页面置换时,从指针指向的页面开始扫描,选择第一个访问位为0 的页面进行置换。
五、实验步骤1、内存分配与回收算法实现定义内存分区结构体,包括分区起始地址、大小、是否已分配等信息。
实现首次适应算法、最佳适应算法和最坏适应算法的函数。
编写测试程序,创建多个进程,并使用不同的算法为其分配内存,观察内存分配情况和空闲分区的变化。
2、页面置换算法模拟定义页面结构体,包括页面号、访问位等信息。
实现先进先出页面置换算法、最近最久未使用页面置换算法和时钟页面置换算法的函数。
编写测试程序,模拟页面的调入和调出过程,计算不同算法下的缺页率,比较算法的性能。
存储器的分配与回收算法实现
存储器的分配与回收算法实现1. 引言在计算机系统中,存储器(Memory)是一种用于存储和检索数据的重要资源。
存储器的分配与回收算法实现是操作系统中的一项关键任务,它负责管理和组织存储器的分配与释放。
本文将深入探讨存储器的分配与回收算法实现的原理、常用算法及其优化方法。
2. 存储器的组织与分配2.1 存储器的组织存储器可以分为物理存储器和逻辑存储器。
物理存储器是计算机硬件中的实际存储器,如RAM(Random Access Memory)和ROM(Read-Only Memory);而逻辑存储器是在操作系统中抽象出来的概念,用于完成存储器的管理。
逻辑存储器可以通过分区、分页和段落等方式进行组织。
其中,分区是将物理存储器划分为若干个连续的大小相等或不等的区域,用于存放进程或数据;分页则将物理存储器划分为固定大小的页框,并将逻辑存储器划分为相同大小的页;段落则将物理存储器划分为不同大小的段,每个段可包含若干页。
2.2 存储器的分配方式存储器的分配方式通常包括固定分区分配和动态分区分配。
固定分区分配将物理存储器分为若干个固定大小的分区,每个分区可分配给一个进程或数据。
固定分区分配的特点是简单、高效,但会造成存储器的内部碎片。
动态分区分配则按需为进程或数据分配存储区域,可以更加灵活地利用存储器资源。
动态分区分配的主要算法包括首次适应算法、最佳适应算法和最坏适应算法等。
3. 存储器的回收算法存储器的回收算法是将不再使用的存储区域回收,并将其释放给其他进程使用的过程。
常用的存储器回收算法包括垃圾回收算法和页面置换算法。
3.1 垃圾回收算法垃圾回收算法是在动态内存分配中常用的一种回收算法,它通过自动检测和回收不再使用的存储空间,以避免内存泄漏和内存溢出等问题。
常见的垃圾回收算法包括引用计数法、标记-清除法和复制算法等。
•引用计数法:该算法通过记录每个对象被引用的次数来进行垃圾回收。
当一个对象被引用时,其引用计数加1;当一个对象不再被引用时,其引用计数减1。
计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告
计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告第一篇:计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告计算机操作系统实验报告实验二实验题目:存储器管理系别:计算机科学与技术系班级:姓名:学号:2一、实验目的深入理解动态分区存储管理方式下的内存空间的分配与回收。
二、实验内容编写程序完成动态分区存储管理方式下的内存分配和回收的实现。
具体内容包括:确定用来管理内存当前使用情况的数据结构;采用首次适应算法完成内存空间的分配;分情况对作业进行回收;编写主函数对所做工作进行测试。
三、实验原理分配:动态分区存储管理方式把内存除OS占用区域外的空间看作一个大的空闲区。
当作业要求装入内存时,根据作业需要内存空间的大小查询内存中各个空闲区,当从内存中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业要求划出一个分区装入该作业。
回收:作业执行完后,它所占用的内存空间被收回,成为一个空闲区。
如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。
四、实验方法实现动态分区的分配与回收,主要考虑三个问题:第一、设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区域(利用结构体类型数组来保存数据);第二、在设计的数据表格基础上设计内存分配算法(采用首次适应算法找合适的分区(对空闲分区表进行排序),分配时要考虑碎片问题);第三、在设计的数据表格基础上设计内存回收算法(分四种情况进行回收(上邻、下邻、上下邻和无相邻分区)。
五、实验步骤第一,设计记录内存使用情况的数据表格λ已分配分区表:起始地址、长度、标志(0表示“空表项”,1表示“已分配”)λ空闲分区表:起始地址、长度、标志(0表示“空表项”,1表示“未分配”)struct used_table { float address;//已分分区起始地址float length;//已分分区长度,单位为字节int flag;//已分配表区登记栏标志,用0表示空栏目,char zuoyename;};//已分配区表Struct free_table[ { float address;//空闲分区起始地址float length;//空闲分区长度,单位为字节int flag;//空闲分区表登记栏目用0表示空栏目,1表示未配};//空闲分区表第二,在设计的表格上进行内存分配λ首次适应算法:为作业分配内存,要求每次找到一个起始地址最小的适合作业的分区(按起始地址递增排序)。
存储管理动态分区分配及回收算法
存储管理动态分区分配及回收算法介绍存储管理是操作系统中一个重要的功能模块,负责管理计算机的内存资源。
本文将详细探讨存储管理中的动态分区分配及回收算法。
动态分区分配动态分区分配算法是指根据进程的内存需求,在内存中动态地创建分区,并将进程加载到相应的分区中。
下面是几种常见的动态分区分配算法。
1. 首次适应算法首次适应算法是最简单、最直观的动态分区分配算法。
它从内存的起始位置开始搜索,找到第一个能满足进程需求的分区即可。
具体步骤如下:1.初始化内存的空闲分区表,记录内存中每个空闲分区的起始地址和长度。
2.当一个进程需要分配内存时,遍历空闲分区表,找到第一个大小能满足进程需求的分区。
3.如果找到了合适的分区,将进程加载到该分区,并更新空闲分区表。
4.如果没有找到合适的分区,则提示内存不足。
首次适应算法的优点是简单、快速,但可能会导致碎片问题。
2. 最佳适应算法最佳适应算法是指选择与进程需求最接近的、且大小大于等于进程需求的分区。
具体步骤如下:1.初始化内存的空闲分区表。
2.当一个进程需要分配内存时,遍历空闲分区表,找到满足进程需求的最小分区。
3.如果找到了合适的分区,将进程加载到该分区,并更新空闲分区表。
4.如果没有找到合适的分区,则提示内存不足。
最佳适应算法能最大程度地减少碎片问题,但执行效率较低。
3. 最差适应算法最差适应算法是指选择与进程需求最接近的、且大小大于等于进程需求的最大分区。
具体步骤如下:1.初始化内存的空闲分区表。
2.当一个进程需要分配内存时,遍历空闲分区表,找到满足进程需求的最大分区。
3.如果找到了合适的分区,将进程加载到该分区,并更新空闲分区表。
4.如果没有找到合适的分区,则提示内存不足。
最差适应算法能最大程度地降低内存碎片,但执行效率相对较低。
4. 快速适应算法快速适应算法是一种基于空闲分区表大小的快速搜索算法。
具体步骤如下:1.初始化内存的空闲分区表。
2.当一个进程需要分配内存时,根据进程需求的大小,在空闲分区表中选择一个合适的分区。
存储管理动态分区分配及回收算法
存储管理动态分区分配及回收算法⼀、实验⽬的分区管理是应⽤较⼴泛的⼀种存储管理技术。
本实验要求⽤⼀种结构化⾼级语⾔构造分区描述器,编制动态分区匹配算法和回收算法模拟程序,并讨论不同算法的特点。
⼆、实验内容1.编写:First Fit Algorithm2.编写:Best Fit Algorithm3.编写 :空闲区回收算法三,提⽰和说明(⼀)主程序1、定义分区描述器node,包括 3个元素:(1)adr——分区⾸地址(2)size——分区⼤⼩(3)next——指向下⼀个分区的指针2、定义 3个指向node结构的指针变量:(1)head1——空闲区队列⾸指针(2)back1——指向释放区node结构的指针(3)assign——指向申请的内存分区node结构的指针3、定义 1个整形变量:free——⽤户申请存储区的⼤⼩(由⽤户键⼊)(⼆)过程1、定义check过程,⽤于检查指定的释放块(由⽤户键⼊)的合法性2、定义assignment1过程,实现First Fit Algorithm3、定义assignment2过程,实现Best Fit Algorithm4、定义acceptment1过程,实现First Fit Algorithm的回收算法5、定义acceptment2过程,实现Best Fit Algorithm的回收算法6、定义print过程,打印空闲区队列(三)执⾏程序⾸先申请⼀整块空闲区,其⾸址为0,⼤⼩为32767;然后,提⽰⽤户使⽤哪种分配算法,再提⽰是分配还是回收;分配时要求输⼊申请区的⼤⼩,回收时要求输⼊释放区的⾸址和⼤⼩。
(四)输出要求每执⾏⼀次,输出⼀次空闲区队列情况,内容包括:编号⾸址终址⼤⼩三、实验过程1.准备A.查阅相关资料;B.初步编写程序;C.准备测试数据;2、主要流程和源代码#include<iostream>#include<stdlib.h>using namespace std;#define Free 0 //空闲状态#define Busy 1 //已⽤状态#define OK 1 //完成#define ERROR 0 //出错#define MAX_length 32767 //最⼤内存空间为32767KB typedef int Status;int n = 0;typedef struct freearea//定义⼀个空闲区说明表结构{int ID; //分区号long size; //分区⼤⼩long address; //分区地址int state; //状态}ElemType;//线性表的双向链表存储结构typedef struct DuLNode //double linked list{ElemType data;struct DuLNode *prior; //前趋指针struct DuLNode *next; //后继指针}DuLNode, *DuLinkList;DuLinkList block_first; //头结点DuLinkList block_last; //尾结点Status alloc(int);//内存分配Status free(int); //内存回收Status First_fit(int, int);//⾸次适应算法Status Best_fit(int, int); //最佳适应算法void show();//查看分配Status Initblock();//开创空间表Status Initblock()//开创带头结点的内存空间链表{block_first = (DuLinkList)malloc(sizeof(DuLNode)); block_last = (DuLinkList)malloc(sizeof(DuLNode)); block_first->prior = NULL;block_first->next = block_last;block_last->prior = block_first;block_last->next = NULL;block_last->data.address = 0;block_last->data.size = MAX_length;block_last->data.ID = 0;block_last->data.state = Free;return OK;}//分配主存Status alloc(int ch){int ID, request;cout << "请输⼊作业(分区号):";cin >> ID;cout << "请输⼊需要分配的主存⼤⼩(单位:KB):";cin >> request;if (request<0 || request == 0){cout << "分配⼤⼩不合适,请重试!" << endl;return ERROR;}if (ch == 2) //选择最佳适应算法{if (Best_fit(ID, request) == OK) cout << "分配成功!" << endl; else cout << "内存不⾜,分配失败!" << endl;return OK;}else //默认⾸次适应算法{if (First_fit(ID, request) == OK) cout << "分配成功!" << endl; else cout << "内存不⾜,分配失败!" << endl;return OK;}}//⾸次适应算法Status First_fit(int ID, int request)//传⼊作业名及申请量{//为申请作业开辟新空间且初始化DuLinkList temp = (DuLinkList)malloc(sizeof(DuLNode)); temp->data.ID = ID;temp->data.size = request;DuLNode *p = block_first->next;while (p){if (p->data.state == Free && p->data.size == request) {//有⼤⼩恰好合适的空闲块p->data.state = Busy;p->data.ID = ID;return OK;break;}if (p->data.state == Free && p->data.size>request){//有空闲块能满⾜需求且有剩余"temp->prior = p->prior;temp->next = p;temp->data.address = p->data.address;p->prior->next = temp;p->prior = temp;p->data.address = temp->data.address + temp->data.size; p->data.size -= request;return OK;break;}p = p->next;}return ERROR;}//最佳适应算法Status Best_fit(int ID, int request){int ch; //记录最⼩剩余空间DuLinkList temp = (DuLinkList)malloc(sizeof(DuLNode)); temp->data.ID = ID;temp->data.size = request;temp->data.state = Busy;DuLNode *p = block_first->next;DuLNode *q = NULL; //记录最佳插⼊位置while (p) //初始化最⼩空间和最佳位置{(p->data.size>request || p->data.size == request)){q = p;ch = p->data.size - request;break;}p = p->next;}while (p){if (p->data.state == Free && p->data.size == request) {//空闲块⼤⼩恰好合适p->data.ID = ID;p->data.state = Busy;return OK;break;}if (p->data.state == Free && p->data.size>request) {//空闲块⼤于分配需求if (p->data.size - request<ch)//剩余空间⽐初值还⼩{ch = p->data.size - request;//更新剩余最⼩值q = p;//更新最佳位置指向}}p = p->next;}if (q == NULL) return ERROR;//没有找到空闲块else{//找到了最佳位置并实现分配temp->prior = q->prior;temp->next = q;temp->data.address = q->data.address;q->prior->next = temp;q->prior = temp;q->data.address += request;q->data.size = ch;return OK;}}//主存回收Status free(int ID){DuLNode *p = block_first;while (p){if (p->data.ID == ID){p->data.state = Free;p->data.ID = Free;if (p->prior->data.state == Free)//与前⾯的空闲块相连{p->prior->data.size += p->data.size;p->prior->next = p->next;p->next->prior = p->prior;}if (p->next->data.state == Free)//与后⾯的空闲块相连{p->data.size += p->next->data.size;p->next->next->prior = p;p->next = p->next->next;}break;}p = p->next;}return OK;}// 显⽰主存分配情况void show(){cout << "***********-----------------************" << endl; cout << "**** 主存分配情况 ****" << endl; cout << "***********-----------------************" << endl; DuLNode *p = block_first->next;while (p){cout << "分区号:";if (p->data.ID == Free) cout << "Free" << endl;else cout << p->data.ID << endl;cout << "起始地址:" << p->data.address << endl;cout << "分区⼤⼩:" << p->data.size << " KB" << endl; cout << "状态:";if (p->data.state == Free) cout << "空闲" << endl;else cout << "已分配!" << endl;cout << "-----------------------" << endl;p = p->next;}}//主函数int main(){int ch, d = 0;//算法选择标记cout << "1.⾸次适应算法 2.最佳适应算法 0.退出" << endl; cout << "请选择分配算法:";cin >> ch;if (ch == 0 || ch == 1 || ch == 2) d++;while (d == 0){cout << "请选择正确的数字0 ,1 或2" << endl;cin >> ch;if (ch == 0 || ch == 1 || ch == 2) d++;}if (ch == 0) exit(0);if (n == 0) Initblock(); //开创空间表int choice; //操作选择标记while (1){cout << "********************************************" << endl; cout << "** 1: 分配内存 2: 回收内存 **" << endl; cout << "** 3: 查看分配 0: 返回 **" << endl; cout << "********************************************" << endl; cout << "请输⼊您的操作:";cin >> choice;if (choice == 1)alloc(ch); // 分配内存n++;}else if (choice == 2) // 内存回收{int ID;cout << "请输⼊您要释放的分区号:"; cin >> ID;free(ID);n++;}else if (choice == 3){show();//显⽰主存n++;}else if (choice == 0){main(); //退出n++;}else //输⼊操作有误{cout << "输⼊有误,请重试!" << endl; continue;}}}四、实验结果3、遇到的主要问题和解决⽅法主要问题是在算法的结构的理解。
实验三 存储器的分配与回收算法实现(二维数组)教学提纲
实验三存储器的分配与回收算法实现(二维数组)实验三存储器的分配与回收算法◆实验名称:存储器的分配与回收算法实验◆仪器、设备:计算机◆参考资料:操作系统实验指导书◆实验目的:设计一个存储器的分配与回收算法管理方案,并编写模拟程序实现。
◆实验内容:1. 模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。
2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。
3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。
若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。
4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。
5. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。
◆实验要求:1.详细描述实验设计思想、程序结构及各模块设计思路;2.详细描述程序所用数据结构及算法;3.明确给出测试用例和实验结果;4.为增加程序可读性,在程序中进行适当注释说明;5.认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;6.实验报告撰写要求结构清晰、描述准确逻辑性强;实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。
◆实验过程记录(源程序、测试用例、测试结果及心得体会等实验代码如下:#include <iostream.h>int work[10][2]; //作业名字大小int idle[10][2]; //空闲区大小地址int free[10][3]; //已分配区域的名字地址大小int num=0,b=1,d,ch1,ch2;void init(){idle[0][0]=1;idle[0][1]=100;free[0][0]=0;free[1][1]=0;free[1][2]=0;work[0][0]=0;work[0][1]=0;for(int i=1;i <=9;i++){ //初始化数组idle[i][0]=0;idle[i][1]=0;free[i][0]=0;free[i][1]=0;free[i][2]=0;work[i][0]=0;work[i][1]=0;}}void jishu(){ //求空闲单元数for(int i=0;i <9;i++)if(idle[i][1]!=0)num++;}void jishu1(){ //求作业数for(int i=0;i <9;i++)if(work[i][1]!=0)b++;}void zuixian(){ //最先适应法jishu();for(int i=0;i <num;i++){for(int j=i;j <num-i-1;j++){if(idle[j][0]>idle[j+1][0]){int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1]; idle[j+1][1]=temp;}}}}void zuijia(){ //最佳适应法num=0;jishu();for(int i=0;i <num;i++){for(int j=i;j <num-i-1;j++){ if(idle[j][1]>idle[j+1][1]){ int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}}void zuihuai(){ //最坏适应法 num=0;jishu();for(int i=0;i <num;i++){for(int j=i;j <num-i-1;j++){ if(idle[j][1] <idle[j+1][1]){ int temp=idle[j][0];idle[j][0]=idle[j+1][0]; idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1]; idle[j+1][1]=temp;}}}}void huishou(int name){ //回收进程函数num=0;b=0;jishu();jishu1();int c=-1;for(int k=0;k <=b;k++){if(free[k][0]==name){c=k;break;}}if(c==-1)cout <<"要回收的作业不存在!" <<endl;else{for(int i=0;i <num;i++){ //将空闲单元排序{不包括新回收的} for(int j=i;j <num-i-1;j++){if(idle[j][0]>idle[j+1][0]){int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}for(int q=0;q <num;q++){ //将空单元排序{包括新回收的}if(free[c][1] <=idle[q][0]){for(int j=num;j>=q;j--){idle[j+1][0]=idle[j][0];idle[j+1][1]=idle[j][1];}idle[j][0]=free[c][1];idle[j][1]=free[c][2];b++;if(idle[j+1][0]==idle[j][0]+idle[j][1]){idle[j][1]=idle[j][1]+idle[j+1][1];for(int m=j+1;m <=num;m++){ idle[m][0]=idle[m+1][0];idle[m][1]=idle[m+1][1];}idle[m][0]=0;idle[m][1]=0;b--;}if(idle[j-1][0]==idle[j][0]){idle[j-1][1]=idle[j-1][1]+idle[j][1];for(int n=j;j <=num;j++){idle[n][0]=idle[n+1][0];idle[n][1]=idle[n+1][1];}idle[n][0]=0;idle[n][1]=0;b--;}break;}}if(ch2==1)zuixian();if(ch2==2)zuijia();if(ch2==3)zuihuai();for(int p=c;c <b-1;c++){free[c][0]=free[c+1][0];free[c][1]=free[c+1][1];free[c][2]=free[c+1][2];work[c][0]=work[c+1][0];work[c][1]=work[c+1][1];}cout<<"该进程已被成功回收!"<<endl;}}void fp(){int tag=0; //判断空闲区与请求区大小num=0;b=0;jishu();jishu1();for(int j=0;j <num;j++){if(work[b][1] <idle[j][1]){free[b][0]=work[b][0];free[b][1]=idle[j][0];free[b][2]=work[b][1];idle[j][0]=idle[j][0]+work[b][1];idle[j][1]=idle[j][1]-work[b][1];tag=1;break;}else if(work[b][1]==idle[j][1]){free[b][0]=work[b][0];free[b][1]=idle[j][0];free[b][2]=work[b][1];tag=1;for(int i=j;i <=num-1;i++){idle[i][0]=idle[i+1][0];idle[i][1]=idle[i+1][1];}break;}else tag=0;}if(tag==0)cout <<"作业过大没有足够存储空间!" <<endl;}void print(){num=0;b=1;jishu();jishu1();cout <<"已分配表为:" <<endl;for(int i=0;i <=b;i++)if(free[i][2]!=0)cout <<"作业名:" <<free[i][0] <<" 内存起始地址:" <<free[i][1] <<" 占用内存空间:" <<free[i][2] <<endl;cout <<endl;cout <<"空闲区表为:" <<endl;for(int j=0;j <num;j++)if(idle[j][1]!=0)cout <<"起始地址:" <<idle[j][0] <<" 连续内存空间:" <<idle[j][1] <<endl; cout <<endl;}void main(){ //主函数运行上面定义的函数init();int n;cout <<"1.分配空间;2.回收空间;" <<endl;cin>>ch1;cout <<endl;cout <<"1.最先适应法;2.最佳适应法;3.最坏适应法;" <<endl;cin>>ch2;cout <<endl;if(ch1==1){cout <<"请输入要分配内存的作业名及占用内存大小:";cin>>work[b][0]>>work[b][1];cout <<endl;if(ch2==1){zuixian();fp();}else if(ch2==2){zuijia();fp();}else if(ch2==3){zuihuai();fp();}print();}cout <<"输入要回收的作业名:" <<endl;cin>>n;huishou(n);}实验截图:成功回收时:回收失败时:实验体会:本次实验的难度较大,尤其是回收进程,主要编写几个算法和回收程序,最佳,最优,最坏算法和回收算法,我用的是数组,有工作数组,空闲数组,已分配数组。
主存储器空间的分配和回收实验报告
主存储器空间的分配和回收实验报告主存储器是计算机中一种重要的存储设备,它用于存储程序的指令和数据。
在计算机系统中,主存储器的空间分配和回收是一个关键的问题。
为了研究主存储器空间的分配和回收,我们进行了一系列实验。
实验目的:1.了解主存储器的空间分配和回收原理;2.掌握主存储器空间分配和回收的算法和方法;3.借助实验了解主存储器空间分配和回收对系统性能的影响。
实验步骤:1.设计一个模拟的主存储器,包括地址空间和物理存储空间。
我们将地址空间划分为多个固定大小的块,每个块对应一个页面。
2.实现主存储器的空间分配算法。
我们选择了最先适应算法,即从低地址开始寻找第一个可以容纳所需页面的空闲块。
3.实现主存储器的空间回收算法。
我们选择了简单的空闲块链表算法,即将回收的空间加入到一个空闲块链表中。
4.编写测试程序,模拟实际系统中的内存分配和回收操作。
测试程序包括创建新进程,分配内存空间,释放内存空间等操作。
5.对测试程序进行性能评测,比较不同算法和策略下的主存储器使用效率和系统性能。
实验结果:通过对实验数据的分析和对比,我们得出了以下结论:1.最先适应算法在空间分配方面具有较好的效果,能够快速找到合适的空闲块。
2.简单的空闲块链表算法能够有效地回收空间,减少内存碎片的产生。
3.不同的内存分配策略会对系统性能产生影响,合理选择内存管理算法是提高系统性能的关键。
结论:本次实验通过对主存储器空间的分配和回收进行实验研究,掌握了主存储器空间分配和回收的算法和方法,并通过实验结果对主存储器的性能进行了评估和分析。
实验结果表明最先适应算法和简单的空闲块链表算法是有效的方法,能够提高主存储器的使用效率和系统性能。
在实际系统中,我们需要根据具体情况选择合适的算法和策略,以满足系统的需求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三基本存储器管理-存储器的分配与回收算法◆实验名称:存储器的分配与回收算法实验◆仪器、设备:计算机◆参考资料:操作系统实验指导书◆实验目的:设计一个存储器的分配与回收算法管理方案,并编写模拟程序实现。
◆实验内容:1. 模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。
2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。
3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。
若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。
4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。
5. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。
◆实验要求:1.详细描述实验设计思想、程序结构及各模块设计思路;2.详细描述程序所用数据结构及算法;3.明确给出测试用例和实验结果;4.为增加程序可读性,在程序中进行适当注释说明;5.认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;6.实验报告撰写要求结构清晰、描述准确逻辑性强;实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。
◆实验过程记录(源程序、测试用例、测试结果及心得体会等实验代码如下:#include <iostream.h>int work[10][2]; //作业名字大小int idle[10][2]; //空闲区地址大小int free[10][3]; //已分配区域的名字地址大小int num=0,b=1,d,ch1,ch2;void init(){idle[0][0]=1;idle[0][1]=100;free[0][0]=0;free[1][1]=0;free[1][2]=0;work[0][0]=0;work[0][1]=0;for(int i=1;i <=9;i++){ //初始化数组idle[i][0]=0;idle[i][1]=0;free[i][0]=0;free[i][1]=0;free[i][2]=0;work[i][0]=0;work[i][1]=0;}}void jishu(){ //求空闲单元数for(int i=0;i <9;i++)if(idle[i][1]!=0)num++;}void jishu1(){ //求作业数for(int i=0;i <9;i++)if(work[i][1]!=0)b++;}void zuixian(){ //最先适应法jishu();for(int i=0;i <num;i++){for(int j=i;j <num-i-1;j++){if(idle[j][0]>idle[j+1][0]){int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}}void zuijia(){ //最佳适应法num=0;jishu();for(int i=0;i <num;i++){for(int j=i;j <num-i-1;j++){if(idle[j][1]>idle[j+1][1]) {int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}void zuihuai(){ //最坏适应法num=0;jishu();for(int i=0;i <num;i++){for(int j=i;j <num-i-1;j++){if(idle[j][1] <idle[j+1][1]){int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}}void huishou(int name){ //回收进程函数num=0;b=0;jishu();jishu1();int c=-1;for(int k=0;k <=b;k++){if(free[k][0]==name){c=k;break;}}if(c==-1)cout <<"要回收的作业不存在!" <<endl;else{for(int i=0;i <num;i++){ //将空闲单元排序{不包括新回收的}for(int j=i;j <num-i-1;j++){if(idle[j][0]>idle[j+1][0]){int temp=idle[j][0];idle[j][0]=idle[j+1][0];idle[j+1][0]=temp;temp=idle[j][1];idle[j][1]=idle[j+1][1];idle[j+1][1]=temp;}}}for(int q=0;q <num;q++){ //将空单元排序{包括新回收的} if(free[c][1] <=idle[q][0]){for(int j=num;j>=q;j--){idle[j+1][0]=idle[j][0];idle[j+1][1]=idle[j][1];}idle[j][0]=free[c][1];idle[j][1]=free[c][2];b++;if(idle[j+1][0]==idle[j][0]+idle[j][1]){idle[j][1]=idle[j][1]+idle[j+1][1];for(int m=j+1;m <=num;m++){idle[m][0]=idle[m+1][0];idle[m][1]=idle[m+1][1];}idle[m][0]=0;idle[m][1]=0;b--;}if(idle[j-1][0]==idle[j][0]){idle[j-1][1]=idle[j-1][1]+idle[j][1];for(int n=j;j <=num;j++){idle[n][0]=idle[n+1][0];idle[n][1]=idle[n+1][1];}idle[n][0]=0;idle[n][1]=0;b--;}break;}}if(ch2==1)zuixian();if(ch2==2)zuijia();if(ch2==3)zuihuai();for(int p=c;c <b-1;c++){free[c][0]=free[c+1][0];free[c][1]=free[c+1][1];free[c][2]=free[c+1][2];work[c][0]=work[c+1][0];work[c][1]=work[c+1][1];}cout<<"该进程已被成功回收!"<<endl;}}void fp(){int tag=0; //判断空闲区与请求区大小num=0;b=0;jishu();jishu1();for(int j=0;j <num;j++){if(work[b][1] <idle[j][1]){free[b][0]=work[b][0];free[b][1]=idle[j][0];free[b][2]=work[b][1];idle[j][0]=idle[j][0]+work[b][1];idle[j][1]=idle[j][1]-work[b][1];tag=1;break;}else if(work[b][1]==idle[j][1]){free[b][0]=work[b][0];free[b][1]=idle[j][0];free[b][2]=work[b][1];tag=1;for(int i=j;i <=num-1;i++){idle[i][0]=idle[i+1][0];idle[i][1]=idle[i+1][1];}break;}else tag=0;}if(tag==0)cout <<"作业过大没有足够存储空间!" <<endl; }void print(){num=0;b=1;jishu();jishu1();cout <<"已分配表为:" <<endl;for(int i=0;i <=b;i++)if(free[i][2]!=0)cout <<"作业名:" <<free[i][0] <<" 内存起始地址:" <<free[i][1] <<" 占用内存空间:" <<free[i][2] <<endl;cout <<endl;cout <<"空闲区表为:" <<endl;for(int j=0;j <num;j++)if(idle[j][1]!=0)cout <<"起始地址:" <<idle[j][0] <<" 连续内存空间:" <<idle[j][1]<<endl;cout <<endl;}void main(){ //主函数运行上面定义的函数init();int n;cout <<"1.分配空间;2.回收空间;" <<endl;cin>>ch1;cout <<endl;cout <<"1.最先适应法;2.最佳适应法;3.最坏适应法;" <<endl;cin>>ch2;cout <<endl;if(ch1==1){cout <<"请输入要分配内存的作业名及占用内存大小:";cin>>work[b][0]>>work[b][1];cout <<endl;if(ch2==1){zuixian();fp();}else if(ch2==2){zuijia();fp();}else if(ch2==3){zuihuai();fp();}print();}cout <<"输入要回收的作业名:" <<endl;cin>>n;huishou(n);}实验截图:成功回收时:回收失败时:实验体会:本次实验的难度较大,尤其是回收进程,主要编写几个算法和回收程序,最佳,最优,最坏算法和回收算法,我用的是数组,有工作数组,空闲数组,已分配数组。