OS 内存管理
来源:互联网 发布:java log4j日志 编辑:程序博客网 时间:2024/05/16 12:02
OS 内存管理
- 实验目的
- 通过实验加强对内存管理方法的理解和掌握。
- 实验内容
编写程序实现采用可变分区方法管理内存。 - 实验要求
1、在该实验中,采用可变分区方式完成对存储空间的管理(即存储空间的分配与回收工作)。
2、设计用来记录主存使用情况的数据结构:已分区表和空闲分区表或链表。
3、在设计好的数据结构上设计一个主存分配算法。
4、在设计好的数据结构上设计一个主存回收算法。其中,若回收的分区有上邻空闲分区和(或)下邻空闲分区,要求合并为一个空闲分区登记在空闲分区表的一个表项里。
5、(附加)若需要可以实现程序的浮动,对内存空间进行紧凑。 - 内存管理算法:
- 数据结构
- 模拟中申请一个较大的buff(char buf[1024]),模拟程序的内存非配地址为buf的编号(0-1023)。
- m {int pre;int len;int used;int flag;}
- pcb {int pid;m mem;}
- list mfree 空闲分区表
- list mused 已分配分区表
- 分配算法
遍历空闲分区表,满足即分配。 - 回收合并算法
合并类型- up & down
- up
- down
- just insert
- 紧缩操作
- 对空闲分区链表排序(升序)
- 复制分区内容从 buf[0]开始,并更新已分配表分区的起始地址
- 清空空闲分区表,插入buf剩余大小的一个分区
- 数据结构
code:
#include<iostream> #include<iostream> #include<cstring> #include<cstdio> #include<list>using namespace std;//管理的内存空间const int MAX=200;char buf[MAX];struct DM{ //上界+长度 int pre; int len; //使用标志 int used; //分配标志,flag=-1分配失败 int flag;};struct PCB{ int pid;//进程号 DM mem;//内存分配,表示从buf制定一段长度给该pcb //内存紧缩,仅考虑新创建进程内存不足时,对mem进行紧缩(copy)};//pcb中使用new list直接使用dm//内存管理list<DM>mused;list<DM>mfree;//进程信息list<PCB>pcb;//内存分配 MD.flag==-1:errorDM allocate(int len){ DM getone; getone.flag=-1; cout<<mfree.size()<<endl; //轮寻空闲分区表,满足即分配 for(list<DM>::iterator it=mfree.begin();it!=mfree.end();it++) { if(it->len>len) { cout<<it->len<<"-"<<len<<endl; getone.pre=it->pre; getone.len=len; getone.used=1; mused.push_back(getone); getone.flag=0; it->pre+=len; it->len-=len; if(it->len==0) mfree.erase(it); } } return getone;}//real time merge ,so do not need to iterate or recurse//free from used//内存释放与回收void del(DM m){ //从free list中查找pos=pre|pre+len //1.up merge //2.down merge //3.up&down merge //4.do not need to merge //查找上 和 下 相邻 cout<<"mem del..."<<endl; list<DM>::iterator up=mfree.end(); list<DM>::iterator next=mfree.end(); list<DM>::iterator cur=mused.end(); //在已分配分区表中,找到该分区 for(list<DM>::iterator it=mused.begin();it!=mused.end();it++) if(it->pre==m.pre) { cur=it; break; } //不存在该分区 if(cur==mused.end()) { cout<<"error:can not find mem in used"<<endl; return; } //空闲分区查找是否存在上空闲和下空闲分区 for(list<DM>::iterator it=mfree.begin();it!=mfree.end();it++) { if(it->pre+it->len==m.pre) up=it; else if(it->pre==m.pre+m.len) next=it; else if(up!=mfree.end()&&next!=mfree.end()) break; } //合并 四种类型 cout<<"merge type:"<<endl; if(up!=mfree.end()&&next!=mfree.end()) { cout<<"up & down"<<endl; up->len+=cur->len; up->len+=next->len; mfree.erase(next); //up down }else if(up!=mfree.end()) { cout<<"up"<<endl; up->len+=cur->len; //up }else if(next!=mfree.end()) { cout<<"down"<<endl; next->pre=cur->pre; next->len+=cur->len; //down }else { cout<<"insert"<<endl; mfree.push_back(*cur); } //在已分配表中删除该分区 mused.erase(cur);}bool ascend(DM a,DM b){ return a.pre<b.pre;}//紧缩操作void compact(){ cout<<"compact before:"<<endl; for(int i=0;i<100;i++) cout<<buf[i]<<" "; cout<<endl; //对used list 排序,从小开始紧缩 mused.sort(ascend); int pos=0; //直接对按地址从小到大排好序的分区移动 for(list<DM>::iterator it=mused.begin();it!=mused.end();it++) { strcpy(buf+pos,buf+it->pre); it->pre=pos; pos+=it->len; } //删除所有的空闲分区,重新添加整合后的一个空闲分区 mfree.clear(); DM mf; mf.pre=pos; mf.len=MAX-pos; mfree.push_back(mf); cout<<"compact after:"<<endl; for(int i=0;i<100;i++) cout<<buf[i]<<" "; cout<<endl;}/* * procedure: * loop: * create process and make sure the mem size * input some strings * when the mem size is not enough * then compact * * */void show(){ cout<<endl; cout<<"status:"<<endl; cout<<"pcb:\t mfree:\t mused:"<<endl; cout<<pcb.size()<<"\t"<<mfree.size()<<"\t"<<mused.size()<<endl; cout<<endl;}int main(){ DM membuf; membuf.pre=0; membuf.len=MAX; membuf.used=0; mfree.push_back(membuf); PCB pcb_tmp; int len,w,pid; char tmp[100]; show(); //freopen("in","r",stdin); while(true) { cout<<"------------------------"<<endl; cout<<"create 0 pidnum or kill 1 pidnum or compact 2 or 3 exit"<<endl; cin>>w; if(w==0) { cout<<"create process ,input(pid,mem size,brief)"<<endl; cin>>pcb_tmp.pid>>pcb_tmp.mem.len>>tmp; if(strlen(tmp)>pcb_tmp.mem.len) { //内存使用不能超出所申请的大小 cout<<"error:mem overflow"<<endl; continue; } //分配指定大小内存 pcb_tmp.mem=allocate(pcb_tmp.mem.len); if(pcb_tmp.mem.flag==0)//successful { //加入pcb管理 pcb.push_back(pcb_tmp); //copy 将进程内容复制到申请的内存中 strcpy(buf+pcb_tmp.mem.pre,tmp); cout<<"mem content:"<<buf+pcb_tmp.mem.pre<<endl; }else { cout<<"allocate mem error"<<endl; continue; } }else if(w==1) { //杀死进程,模拟内存回收 cout<<"input pid"<<endl; cin>>pcb_tmp.pid; cout<<"kill---"<<pcb_tmp.pid<<endl; list<PCB>::iterator it=pcb.begin(); //找到该pcb for( ;it!=pcb.end();it++) { if(it->pid==pcb_tmp.pid) { break; } } del(it->mem); pcb.erase(it); //free }else if(w==2) { //compact cout<<"compact"<<endl; compact(); }else break; show(); } //free all mems return 0;}
测试数据
input:01 10 aaa02 10 bbb 03 10 ccc 04 10 ddd 1 223output:测试内存浮动status:pcb: mfree: mused:0 1 0------------------------create 0 pidnum or kill 1 pidnum or compact 2 or 3 exitcreate process ,input(pid,mem size,brief)1200-10mem content:aaastatus:pcb: mfree: mused:1 1 1------------------------create 0 pidnum or kill 1 pidnum or compact 2 or 3 exitcreate process ,input(pid,mem size,brief)1190-10mem content:bbbstatus:pcb: mfree: mused:2 1 2------------------------create 0 pidnum or kill 1 pidnum or compact 2 or 3 exitcreate process ,input(pid,mem size,brief)1180-10mem content:cccstatus:pcb: mfree: mused:3 1 3------------------------create 0 pidnum or kill 1 pidnum or compact 2 or 3 exitcreate process ,input(pid,mem size,brief)1170-10mem content:dddstatus:pcb: mfree: mused:4 1 4------------------------create 0 pidnum or kill 1 pidnum or compact 2 or 3 exitinput pidkill---2mem del...merge type:insertstatus:pcb: mfree: mused:3 2 3------------------------create 0 pidnum or kill 1 pidnum or compact 2 or 3 exitcompactcompact before:a a a b b b c c c d d d compact after:a a a c c c d d d d d d status:pcb: mfree: mused:3 1 3------------------------create 0 pidnum or kill 1 pidnum or compact 2 or 3 exit
阅读全文
0 0
- OS复习-内存管理
- OS 内存管理
- Symbian OS内存管理介绍
- UC/OS - II内存管理
- UC/OS II 内存管理
- iOS - OS X 内存管理
- uC/OS-II的内存管理
- 〖Symbian OS内存管理介绍〗
- OS中的内存管理的发展历史
- µC/OS-II内存管理
- os内存使用管理之linux篇
- OS开发之底层内存管理笔记
- uC/OS II内存管理 详细分析
- os经典面试题总结--内存管理
- iOS与OS X内存管理
- [笔记分享] [OS] Linux的内存管理
- uC/OS 的任务管理,内存管理,时间管理
- iOS/OS X内存管理:借助工具解决内存问题
- 全网爬取6500多只基金|看看哪家基金最强
- 在Node.js中使用RabbitMQ系列二 任务队列
- hdu 2046 骨牌铺方格(Fibonacci)
- L
- 切换用户和修改密码
- OS 内存管理
- 标签控件的使用
- LInux学习笔记 --NFS
- 在Node.js中使用RabbitMQ系列一 Hello world
- 【Unity_UWP】Unity 工程发布win10 UWP 时的本地文件读取 (下篇)
- MySQL入门——修改数据表2:往指定的表中添加多列数据(字段)
- 多进程共享/同步
- UGUI学习(三)登录界面Text,Image,Button,Inputfield应用
- 玩转git命令行