操作系统之存储管理
2012-02-07 15:01
344 查看
按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。
当一个作业执行完成撤离时,作业所占的分区应该归还给系统,归还的分区如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。例如,在上述中列举的情况下,如果作业2撤离,归还所占主存区域时,应与上、下相邻的空闲区一起合成一个大的空闲区登记在空闲区说明表中。
运行截图:
当一个作业执行完成撤离时,作业所占的分区应该归还给系统,归还的分区如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。例如,在上述中列举的情况下,如果作业2撤离,归还所占主存区域时,应与上、下相邻的空闲区一起合成一个大的空闲区登记在空闲区说明表中。
#include <iostream> #include <algorithm> #include <vector> using namespace std; class memory { public: int id; int start; int length; int state; memory() { } void init(int s,int l,int st) { start=s; length=l; state=st; } bool allo(int size) { if(size<=length) { start=start+size; length=length-size; return true; } return false; } }; class job { public: int id; char name; int start; int size; memory m; job() { } }; int cmp(const memory & a,const memory & b) { if(a.start<b.start) return 1; else return 0; } int main() { int a,b; vector <memory> mp; memory mem[10]; memory tm; vector <job> jp; job j; mem[0].init(5,10,0);mem[1].init(20,120,0); mem[2].init(160,40,0);mem[3].init(220,10,0); mem[4].init(250,20,0);mem[5].init(300,80,0); mem[6].init(400,60,0);mem[7].init(480,300,0); mem[8].init(850,150,0);mem[9].init(1200,60,0); for(int i=0;i<10;i++) { mp.push_back(mem[i]); } sort(mp.begin(),mp.end(),cmp); for(i=0;i<mp.size();i++) { mp[i].id=i+1; } cout<<'\t'<<'\t'<<"欢迎来到存储管理系统"<<endl; while(1) { cout<<"1.显示分区"<<endl<<"2.分配作业"<<endl<<"3.回收作业"<<endl<<"4.返回上一层"<<endl<<"5.退出"<<endl; cin>>a; switch(a) { case 1: cout<<'\t'<<'\t'<<"显示分区情况"<<endl; cout<<"分区"<<'\t'<<"首地址"<<'\t'<<"长度"<<'\t'<<"状态"<<endl; for(i=0;i<mp.size();i++) { cout<<mp[i].id<<'\t'<<mp[i].start<<'\t'<<mp[i].length<<'\t'<<mp[i].state<<endl; } break; case 2: cout<<"请输入要分配作业的id,名称,大小"<<endl; cin>>j.id>>j.name>>j.size; for(i=0;i<mp.size();i++) { if(mp[i].state==0) if(mp[i].allo(j.size)) { j.start=mp[i].start-j.size; tm.init(j.start,j.size,1); j.m=tm; mp.push_back(tm); break; } } sort(mp.begin(),mp.end(),cmp); for(i=0;i<mp.size();i++) { mp[i].id=i+1; } jp.push_back(j); break; case 3: cout<<'\t'<<'\t'<<"显示作业"<<endl; cout<<"id"<<'\t'<<"名称"<<"首地址"<<'\t'<<"大小"<<'\t'<<endl; for(i=0;i<jp.size();i++) cout<<jp[i].id<<'\t'<<jp[i].name<<'\t'<<jp[i].start<<'\t'<<jp[i].size<<endl; cout<<"请选择要删除作业的id"<<endl; cin>>b; for(i=0;i<jp.size();i++) { if(b==jp[i].id) { for(int x=0;x<mp.size();x++) //释放内存 { if(mp[x].start==jp[i].start) { if(x!=mp.size()) { if(mp[x+1].state==0) { mp[x].length=mp[x].length+mp[x+1].length; mp[x].state=0; for(int z=x+1;z<mp.size()-1;z++) mp[z]=mp[z+1]; mp.pop_back(); } if(x!=0) { if(mp[x-1].state==0) { mp[x-1].length=mp[x-1].length+mp[x].length; for(int z=x;z<mp.size()-1;z++) mp[z]=mp[z+1]; mp.pop_back(); } } } mp[x].state=0; } } for(x=0;x<mp.size();x++) //重新标号 { mp[x].id=x+1; } for(x=i;x<jp.size()-1;x++) jp[x]=jp[x+1]; jp.pop_back(); } } break; case 4: break; case 5: cout<<"谢谢"<<endl; return 1; default: break; } } return 1; }
运行截图:
相关文章推荐
- 操作系统---存储管理
- 内功修炼之操作系统学习(四:存储管理)
- 操作系统--存储管理
- 操作系统 - 存储管理相关知识整理
- 操作系统--分页存储管理中逻辑地址转换为物理地址
- 操作系统中文件存储空间的管理
- 操作系统知识整理2:存储管理
- 操作系统页面存储管理系统
- 操作系统中存储管理的基本原理
- c++ 计算机操作系统虚拟页式存储管理系统仿真实现
- 实验五 操作系统之存储管理
- 操作系统之存储管理详解
- 操作系统存储管理之分段存储
- 实验五 操作系统之存储管理
- 操作系统存储管理之虚拟存储与分页式虚拟存储系统
- 【操作系统】分页存储管理方式
- 【操作系统】分段存储管理方式
- 【操作系统】可变分区存储管理,模拟实现
- 3.1存储管理操作系统
- 【操作系统】3、存储管理