内存的申请和释放.doc_第1页
内存的申请和释放.doc_第2页
内存的申请和释放.doc_第3页
内存的申请和释放.doc_第4页
内存的申请和释放.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计计算算机机学学院院网网络络工工程程专专业业 操操作作系系统统课课程程设设计计 题 目 内存的申请和释放 班 级 网工 11102 班 姓 名 郭阳 学 号 201117030216 同组人姓名 起 迄 日 期 第一周 第二周 课程设计地点 E3 A513 指导教师 贺玉才 评阅意见 评阅意见 成绩评定 成绩评定 评阅人 评阅人 日期 日期 完成日期 2014 年 3 月 目录目录 一 概述一 概述 1 1 设计目的 1 2 开发环境 1 二 设计要求二 设计要求 1 三 实验基本原理三 实验基本原理 1 四 程序流程图四 程序流程图 2 1 整体程序流程图 3 2 内存分配ALLOCATE 流程图 4 五 源程序五 源程序 5 1 数据结构 5 2 主要功能函数 5 3 源程序代码 6 六 运行结果六 运行结果 16 1 测试用例与程序运行结果截图 16 2 内存分配正确测试 18 3 内存回收错误测试 18 4 内存回收正确测试用例 18 七 总结七 总结 21 八 参考文献八 参考文献 21 一 概述一 概述 1 设计目的 设计目的 了解操作系统的内存分配的方法 2 开发环境 开发环境 WINDOWS 环境 Visual C 6 0 二 设计要求二 设计要求 定义一个自由存储块链表 按块地址排序 表中记录块的大小 当请求分配内存时 扫 描自由存储块链表 知道找到一个足够大的可供分配的内存块 若找到的块的大小正好等 于所请求的大小时 就把这一块从自由链表中取下来 返回给申请者 若找到的块太大 即对其分割 并从该块的高地址不分往低地址部分分割 取出大小合适的块返还给申请者 愈小的低地址部分留在链表中 若找不到足够大的块 就从操作系统中请求另外一个足够 大的内存区域 并把它连接到自由块链表中 然后再继续搜索 释放存储块也要搜索自由链表 目的是找到适当的位置将要释放的块插进去 如果被释 放的块的任何一边与链表中的某一块临接 即对其进行合并操作 直到没有合并的临接块 为止 这样可以防止存储空间变得零碎 三 实验基本原理三 实验基本原理 分区存储管理是给内存中的进程划分适当大小的存储区 以连续存储各进程的程序和 数据 使各进程能并发地执行 最优适应分配算法扫描整个未分配区表或链表 从空闲区 中挑选一个能满足用户进程要求的最小分区进行分配 在可变分区模式下 在系统初启且用户作业尚未装入主存储器之前 整个用户区是一 个大空闲分区 随着作业的装入和撤离 主存空间被分成许多分区 有的分区被占用 而 有的分区时空闲的 为了方便主存空间的分配和去配 用于管理的数据结构可由两张表组 成 已分配区表 和 未分配区表 在 未分配表中 将空闲区按长度递增顺序排列 当装入新作业时 从未分配区表中挑选一个能满足用户进程要求的最小分区进行分配 这 时从已分配表中找出一个空栏目登记新作业的起始地址和占用长度 同时修改未分配区表 中空闲区的长度和起始地址 当作业撤离时已分配区表中的相应状态变为 空 而将收回 的分区登记到未分配区表中 若有相邻空闲区再将其连接后登记 可变分区的回收算法较 为复杂 当一个作业撤离时 可分为 4 种情况 其临近都有作业 A 和 B 其一边有作业 A 或 B 其两边均为空闲区 尤其重要的是 在程序中利用 new 类型 T 初值列表 申请分配用于存放 T 类型数据的内存空间 利用 delete 指针名 释放指针所指向的内存 空间 四 程序流程图四 程序流程图 1 整体程序流程图 整体程序流程图 2 内存分配 内存分配 allocate 流程图流程图 五 源程序五 源程序 1 数据结构 数据结构 1 内存块 struct space 定义内存空间结构体 long startaddress long length struct space next space pbc 2 作业块 struct work 定义进程结构体 char name 20 long startaddress long length struct work next work S 2 主要功能函数 主要功能函数 allocate 实现内存分配 并在当中调用 display pbc 以及 display S 两个函数显 示内存分配完后的空闲块链表和进程链表情况 requireback 实现内存回收 在满足情况的条件下调用 allocate 对用户申请的内存块 进行回收并在当中调用 display pbc 以及 display S 显示内存回收完后 的空闲块链表和进程链表情况 callback 按内存回收时的四种情况对内存进行回收 display pbc 对空闲块链表中的空闲块进行从小到大排序并显示空闲链情况 display S 对进程链表中的进程进行从小到大排序并显示进程链情况 main 创建并初始化空闲块链表和进程链链表 用户选择操作功能 3 源程序代码 源程序代码 include include include struct space 定义内存空间结构体 long startaddress long length struct space next space pbc 申明结构体指针 struct work 定义进程结构体 char name 20 long startaddress long length struct work next work S 申明结构体指针 void callback work r 申明 callback 函数原型 void display space pbc 申明 display 函数原型 void display work S void allocate 内存分配函数实现 work q w q new work 申请分配用于存放 work 类型的数据的内存空间 cout 请输入进程名和占用空间大小 q name q length if q length 0 判断输入进程的合法性 cout 进程错误 next NULL 进程链不为空 if strcmp w next name q name 0 判断进程名是否已经存在 cout 此进程名已经存在 next if w next NULL 进程名不存在 继续进行内存分 配 space p r p pbc r p while p next NULL p p next if p next NULL 空闲链中无大于所输入进程空间大小的空闲块 cout 空间不足 分配失败 startaddress p next startaddress 将该空闲块的起始地址赋给所输入的进程 q next S next S next q 将所输入的进程插入 work 链首 p next length q length if p next length 0 该空闲块空间有剩余 改变该空闲块的起始地 址 p next startaddress q length else 该空闲块空间无剩余 if p next next NULL 该空闲块不处于空闲链链尾 p next p next next 删除该空闲块 修改空闲链 else r next NULL 该空闲块处于空闲链链尾 修改空闲 链 delete p next 释放该空闲块的空间 display pbc 显示空闲链情况 display S 显示进程链情况 void requireback 用户申请进程回收函数 char name 20 cout name work p p S while p next NULL 进程链不为空 if strcmp p next name name 0 寻找与用户要求回收的进程名相同的进程 callback p 调用进程回收函数 回收进 程 return p p next if p next NULL cout 此进程不存在 next space p NULL q NULL long n n w length if pbc next NULL 空闲链为空 space f new space 申请分配用于存放 space 类型的数据的 内存空间 并将首地址赋给指 针 f f startaddress 0 初始该空间首地址 f length n 将所要回收的进程大小赋给该空间 f next NULL pbc next f 将该空间块插入空闲链中 t next w next delete w 释放空间 cout 回收完毕 next while p NULL p p next if q NULL 修改下邻起始地址 p length n 将该空闲块与下邻合并 t next w next 修改进程链 删除进程链中所要回收的进 程 delete w 释放空间 cout 回收完毕 startaddress n p startaddress q 为空 且该空间的结束地 址不是下临的结束地 址 space sp new space 申请分配用于存放 space 类型的数据 的内存空间 并将首地址赋给指针 sp sp startaddress w startaddress 将该空间的起始地址赋给 sp sp length n 将该空间的大小赋给 sp sp next pbc next 将 sp 插入空闲链中 pbc next sp t next w next 修改进程链 删除所回收的进程 delete w cout 回收完毕 startaddress q length w startaddress 修改空闲链 q length q length p length n 将该空闲块与上下邻合并 t next w next 修改进程链 删除所回收的进 程 delete w 释放空间 else if q NULL 修改下邻起始地址 p length n 将该空闲快与下邻合并 t next w next delete w else if q NULL 改变上邻的大小 将两个空闲块合 并 t next w next 修改进程链 删除所回收的进 程 delete w 释放空间 else 上下邻都不为空 space sp new space 申请分配用于存放 space 类型的数据 的内存空间 并将首地址赋给指针 sp sp startaddress w startaddress 将所回收的进程首地址赋给 sp sp length n 将缩回收的进程大小赋给 sp sp next pbc next pbc next sp 将 sp 插入空闲链链首 t next w next 修改进程链 删除所回收的进 程 delete w 释放空间 cout 回收完毕 next 空闲块从小到大排序 pbc next NULL while sa NULL sd pbc sf pbc next while sf NULL sf sf next sk sa next if sf NULL sd next sa sa next NULL else sa next sf sd next sa sa sk void display space pbc 空闲链显示函数实现 space p q r e p pbc next 空闲块从小到大排序 pbc next NULL while p NULL r pbc q pbc next while q NULL q q next e p next if q NULL r next p p next NULL else p next q r next p p e space t pbc next cout endl 可用空闲区 endl if t NULL cout 无空闲区了 endl return while t NULL cout 起始地址 startaddress 长度 length next void display work S 进程链显示函数实现 work p q r f p S next 进程链表排序 S next NULL while p NULL r S q S next while q NULL q q next f p next if q NULL r next p p next NULL else p next q r next p p f work t S next cout endl 已分配进程 endl if t NULL cout 内存中无进程 endl return while t NULL cout 进程名 name 起始地址 startaddress 长度 length next cout startaddress 0 初始化 p 的起始地址 p length 130 初始花 p 的大小 p next NULL pbc next p 将 pbc 作为 p 的头指针 创建空闲 链 S new work 创建进程链头指针 S next NULL int b cout 最佳适应算法模拟内存分配与回收 endl cout endl cout endl cout 功能选项 0 分配内存 1 回收内存 2 退出 endl cout endl while 1 循环选择功能 cout endl b switch b case 0 allocate break 功能 0 进行内存分配 case 1 requireback break 功能 1 进行内存回收 case 2 break 功能 2 退出 六 运行结果六 运行结果 1 测试用例与程序运行结果截图 测试用例与程序运行结果截图 程序运行结果 分配成

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论