想做一个模拟操作系统内存管理的系统!

wolfzxq 2003-09-30 07:26:52
这个学期开始上操作系统的课,
想用可变分区的方式做一个模拟操作系统内存管理的系统,
采用的数据结构了FBC(Free Block Chain)
使用的语言为C++,
算法为首次适应法(First Fit)
自己做了一个,但效果不太理想
哪位以前也曾做过这样的系统可否指点一下,
最好有源代码。
...全文
138 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wolfzxq 2003-10-05
  • 打赏
  • 举报
回复
谢谢!
我先看一下。
回头再给分!
gzshd 2003-10-05
  • 打赏
  • 举报
回复
#include"iostream.h"
class list;
class listnode
{
friend class list;
public:
listnode()
{
link=NULL;
}
listnode(int item,int sie)
{
data1=item;
data2=sie;
link=NULL;
}

private:
int data1,data2;
listnode *link;
};
class list
{
public:
list()
{
first=last=new listnode();
}
~list()//析构函数
{
makeempty();
delete first;
}
void remove(int a1)//删除链表一个结点
{
if(a1<length()){
listnode *p=first;
int a2(0);
while(a1!=a2){
p=p->link;
a2++;
}
listnode *q;
q=p->link;
p->link=q->link;
q->link=NULL;
delete q;
}}
void insert(int a3,int a4,int a5)//在链表中插入一个接点
{
if(a5<=length()){
listnode *p=first;
int a2(0);
while(a5!=a2){
p=p->link;
a2++;
}
listnode *q=new listnode(a3,a4);
q->link=p->link;
p->link=q;
if(a5=length()){
last=q;}
}
}
int liyonglv()//返回内存利用率
{
listnode *p=first->link;
int a,b;
a=0;
while(p!=NULL){
a=a+p->data2;
p=p->link;
}
b=(800-a)/8;
return b;
}
void makeempty()//将链表置空
{
listnode *q;
while(first->link!=NULL){
q=first->link;
first->link=q->link;
delete q;
}
last=first;
}
int isempty()//判断链表是否为空,空返回1,不空返回0
{
if(first->link==NULL)
return 1;
else
return 0;
}
int length()//求连表的长度
{
listnode*p=first->link;
int count=0;
while(p!=NULL)
{
p=p->link;
count++;
}
return count;
}
listnode* Find(int i)//返回第i个接点的地址,找不到返回空
{
if(i<-1)
return NULL;
if(i==-1)
return first;
listnode *p=first->link;
int j=0;
while(p!=NULL&&j<i)
{
p=p->link;
j++;
}
return p;
}
void print()//返回链表中所有接点的值
{
listnode*p=first->link;
while(p!=NULL)
{
cout<<p->data1<<" "<<p->data2<<" | ";
p=p->link;
}cout<<endl;
}
int getdata1(int i)//返回连表第i个接点的值起始位置
{
listnode *p=Find(i);
if(p==NULL || p==first)return -1;
else return p->data1;
}
int getdata2(int i)//返回连表第i个接点的值的大小
{
listnode *p=Find(i);
if(p==NULL || p==first)return -1;
else return p->data2;
}
void setdata1(int a,int i)//将第i个接点的起始位置改为a
{
if(i<length()){
listnode *p=Find(i);
p->data1=a;
}
}
void setdata2(int a,int i)//将第i个接点的内存大小改为a
{
if(i<length()){
listnode *p=Find(i);
p->data2=a;
}
}
private:
listnode *first,*last;
};
list j,n;
void shuaxin(){
cout<<"进程队列 :";
j.print();
cout<<"内存空闲块队列:";
n.print();
cout<<"内存利用率:"<<n.liyonglv()<<"%"<<endl;
}
void tianjia(){
int u,y=n.length(),t=0;
cout<<"请输入添加进程所用的空间:";
cin>>u;
for(int i=0;i<y;i++){
if(u>n.getdata2(i)){
t=0;
}
else if(u==n.getdata2(i))
{
t=1;
int r,e=0;
r=n.getdata1(i);
n.remove(i);
if(j.isempty()==1)
{
j.insert(r,u,0);
}
else
{
for(int w=0;w<j.length();w++)
{
if(j.getdata1(w)>r)
{
j.insert(r,u,w);
e=1;
break;
}
}
if(e==0)
{
j.insert(r,u,j.length());
}
}
break;
}
else{
t=1;
int r=n.getdata1(i),e=0;
n.setdata1(n.getdata1(i)+u,i);
n.setdata2(n.getdata2(i)-u,i);
if(j.isempty()==1){
j.insert(r,u,0);
}
else{
for(int w=0;w<j.length();w++){
if(j.getdata1(w)>r){
j.insert(r,u,w);
e=1;
break;
}
}
if(e==0){
j.insert(r,u,j.length());
}
}
break;
}
}
if(t=0){
cout<<"没有足够内存空间"<<endl;
}
else{
shuaxin();
}
}
void shanchu(){
int l;
cout<<"请输入要删除第几个进程:";
cin>>l;
if(l>j.length()){
cout<<"输入错误,找不到该进程!"<<endl;
}
else{
int h=j.getdata1(l-1),g=j.getdata2(l-1);
j.remove(l-1);
if(n.isempty()==1){
n.insert(h,g,0);
}
else{
int f=0;
for(int i=0;i<n.length();i++)
{
if(h<n.getdata1(i)){
f=1;
n.insert(h,g,i);
if(i!=0)
{
if(n.getdata1(i)==n.getdata1(i-1)+n.getdata2(i-1))
{
n.setdata2(n.getdata2(i)+n.getdata2(i-1),i-1);
n.remove(i);
i=i-1;
}
}
if(i!=n.length()-1)
{
if(n.getdata1(i+1)==n.getdata1(i)+n.getdata2(i))
{
n.setdata2(n.getdata2(i+1)+n.getdata2(i),i);
n.remove(i+1);
}
}
break;
}
}
if(f==0){
n.insert(h,g,n.length());
int v=n.length();
if(n.getdata1(v)==n.getdata1(v-1)+n.getdata2(v-1))
{
n.setdata2(n.getdata2(v)+n.getdata2(v-1),v-1);
n.remove(v);
}
}
}
shuaxin();
}
}

void chushihua(){
j.makeempty();
n.makeempty();
n.insert(100,700,0);
shuaxin();
}
void main(){
cout<<" 内存管理"<<endl;
cout<<"说明: 假设内存共800k,其中操作系统占内存100k."<<endl;
cout<<" 0 : 初始化"<<endl;
cout<<" 1 : 添加一个进程,并分配内存空间"<<endl;
cout<<" 2 : 删除一个进程,并撤消该内存空间"<<endl<<endl;
char p;
while(true){
cout<<"请输入一个命令:";
cin>>p;
switch(p){
case '0':chushihua();break;
case '1':tianjia();break;
case '2':shanchu();break;
default:cout<<"错误命令,请输入0或1或2!"<<endl;
}
}

}
wolfzxq 2003-10-03
  • 打赏
  • 举报
回复
eastsun兄,
你能否说得详细点呢?
wolfzxq 2003-10-03
  • 打赏
  • 举报
回复
好的。谢谢!
tommorrow1@163.com
eastsun 2003-10-03
  • 打赏
  • 举报
回复

做两个内存池,

建立最小内存页面,(设定一个最小内存页尺寸)

建立在页面中交换内存项的几个可靠的函数。

将内存对象分成三类:大于一个基本页面的,略小于一个基本页面的,远小于基本页面的。

将远小于基本页面的对象尽可能集中在几个页面进行分配。

对于大于一个页面的内存分配项建立详细的索引,而远小于基本页面的索引要尽可能简单。

两个内存池就可以模拟虚拟内存的实现,实现内存与硬盘交换的模拟。


yaoha2003 2003-10-02
  • 打赏
  • 举报
回复
我要,谢谢
yaoha2002@163.com
gzshd 2003-10-02
  • 打赏
  • 举报
回复
大三的时候写的,你要就留个邮箱吧
dawndu 2003-09-30
  • 打赏
  • 举报
回复
好像大家大学都是做这个啊,怀恋
wolfzxq 2003-09-30
  • 打赏
  • 举报
回复
xiaohyy(醉大饿极) ,你能不能给点提示呢?
xiaohyy 2003-09-30
  • 打赏
  • 举报
回复
呵呵。我以前读书的时候也是做的就是这个,用java和c写了两个版本(一个版本是帮别人做的),不过原码找不到了。。
klbt 2003-09-30
  • 打赏
  • 举报
回复
关注,帮你顶。

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧