关于操作系统的内存管理问题,100分请高手,答案好的再加100分!急!就今天!请最好用C或C++编写。谢谢!

[复制链接]
查看11 | 回复3 | 2010-4-18 21:20:46 | 显示全部楼层 |阅读模式
#include #include #include struct program{
char name[30];
long start;
long length;
struct program *next;};struct space{
long start;
long length;
struct space *next;};void creat(); void allot();void back();void callback(program *r); void sort(space *L);void sort(program *S); void display(space *L); void display(program *S);space *L;program *S;void creat(){
L=new space;
space *p=new space;
p->start=0;
p->length=128;
p->next=NULL;
L->next=p;
S=new program;
S->next=NULL;} void allot(){
program *q;
q=new program;
cout>q->name>>q->length;
if(q->lengthnext!=NULL&&p->next->lengthlength)
{
r=p;
p=p->next;
}
if(p->next==NULL)
{
coutstart=p->next->start;
q->next=S->next;
S->next=q;
p->next->length-=q->length;
if(p->next->length!=0)
p->next->start+=q->length;
else
{
if(p->next->next!=NULL)
p->next=p->next->next;
else
{
r->next=NULL;
delete p->next;
}
}
}
display(L);
display(S);}
void back(){
char name[30];
cout>name;
program *p;
p=S;
while(p->next!=NULL)
{
if(strcmp(p->next->name, name)==0)
{
callback(p);
return;
}
p=p->next;
}
if(p->next==NULL)
coutnext;
space *p,*q;
long n;
n=r->length;
if(L->next==NULL)
{
space *w=new space;
w->start=0;
w->length=n;
w->next=NULL;
L->next=w;
t->next=r->next;
delete r;
coutnext;
while(p!=NULL&&p->startstart)
{
q=p;
p=p->next;
}
if((q->start+q->length==r->start)&&(r->start+n==p->start)) //上下均空
{
q->next=p->next;
q->length=q->length+p->length+n;
t->next=r->next;
delete r;
}
else if(r->start+n==p->start)//下邻空
{
p->start-=n;
p->length+=n;
t->next=r->next;
delete r;
}
else if(q->start+q->length==r->start)
{
q->length+=n;
t->next=r->next;
delete r;
}
else
{
space *sp=new space;
sp->start=r->start;
sp->length=n;
sp->next=L->next;
L->next=sp;
t->next=r->next;
delete r;
}
coutnext;
coutstartlengthnext;
}}
void display(program *S){
sort(S);
program *p=S->next;
coutnamestartlengthnext;
}
coutnext, *q, *r; if(p!=NULL) {
r=p->next;
p->next=NULL;
p=r;
while(p!=NULL)
{
r=p->next;
q=L;
while(q->next!=NULL&&q->next->startstart)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
}}
void sort(program *S)
//链表排序{
program *p=S->next, *q, *r; if(p!=NULL) {
r=p->next;
p->next=NULL;
p=r;
while(p!=NULL)
{
r=p->next;
q=S;
while(q->next!=NULL&&q->next->startstart)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
}}void main(){
creat();
int a;
cout>a;
if(a>2||alength next;}//如果找不到有足够空间的分区if( p == NULL ) return ERR_NOADEQUACYAREA;USED_TABLE x = new USED_AREA;x->address = p->address;x->length = jobsize;x->flag = jobname;x->next = NULL;//如果该分区大于作业需求,空间大小减去作业大小if( p->length > jobsize ){ p->length -= jobsize; p->address += jobsize;}//如果该分区等于作业大小,删除该分区else{ if( p == freeTable )
freeTable = NULL; else
q->next = p->next; delete p;}//作业加入“作业表”中USED_TABLE r = usedTable;USED_TABLE t = r;while( r != NULL && r->address address ){ t = r; r = r->next;}if( usedTable == NULL ) usedTable = x;else{ x->next = r; t->next = x;}return ERR_ALLOCATED;}//回收作业空间//jobname: 作业名int Reclaim( int jobname ){if( usedTable == NULL ) return ERR_NOJOBS;USED_TABLE p = usedTable;USED_TABLE q = p;while( p != NULL && p->flag != jobname ){ q = p; p = p->next;}//如果没有该作业if( p == NULL ) return ERR_NOSUCHJOB;//回收后的空间加入到空闲区FREE_TABLE r = freeTable;FREE_TABLE t = r;FREE_TABLE x;while( r != NULL && r->address address ){ t = r; r = r->next;}x = new FREE_AREA;x->address = p->address;x->length = p->length;x->next = NULL;if( r == freeTable ){ x->next = r; freeTable = x; t = freeTable;}else{ x->next = r; t->next = x;}//合并分区while( t->next != NULL && t->address + t->length == t->next->address ){ t->length += t->next->length; r = t->next; t->next = t->next->next; delete r;}//删除该作业if( p == usedTable ){ usedTable = usedTable->next;}else q->next = p->next;delete p;return ERR_RECLAIMED;}int Init(){freeTable = new FREE_AREA;freeTable->address = 0;freeTable->length = 1024;freeTable->next = NULL;return 1;}void jobrequest(){int jobname;int jobsize;cout> jobname;cout> jobsize;if( Allocate( jobname , jobsize ) == ERR_ALLOCATED ) cout>jobname;int result = Reclaim( jobname );if( result == ERR_RECLAIMED ) coutaddress; else
x = 0x7fffffff; if( q )
y = q->address; else
y = 0x7fffffff; if( x addresslengthnext; } if( x > y ) {
coutaddresslengthflagnext; }}cout"; cin>>choose; switch( choose ) { case 0:
exitFlag = true;
break; case 1:
jobrequest();
break; case 2:
jobreclaim();
break; case 3:
freeTablePrint();
break; }}}
回复

使用道具 举报

千问 | 2010-4-18 21:20:46 | 显示全部楼层
太天真了
回复

使用道具 举报

千问 | 2010-4-18 21:20:46 | 显示全部楼层
不容易
回复

使用道具 举报

千问 | 2010-4-18 21:20:46 | 显示全部楼层
操作系统的课程设计嘛~~学计算机不能太懒啊~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行