• 大小: 5KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2021-06-18
  • 语言: C/C++
  • 标签: C/C++  Linux  

资源简介

用C/C++语言模式Linux操作系统主存的分配与回收,希望采纳!

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
typedef struct QNode{
char name[10];
int address; //起始地址
    int flag; //状态,空闲0,分配1
    int length; //长度
    struct QNode *next; //指针指向下一个结点
}QNode;
typedef struct{
QNode *front; //指向头结点
QNode *rear; //指向尾结点
} LiQueue;
/*****************************初始化***************************/
void InitQueue(LiQueue *&q)
{
q=(LiQueue *)malloc(sizeof(LiQueue));//q是指针 
QNode *s;
s=(QNode *)malloc(sizeof(QNode));
s->address=0; //初始地址为0
s->flag=0; //初始状态为空闲
printf(“初始化主存空间的大小:“);
scanf(“%d“&s->length);
s->next=NULL;
q->front=q->rear=s;
}


/****************************内存分配**************************/
void enQueue(LiQueue *&qint lengthchar name[])//q是指针
{
QNode *s=q->front;
while(s->flag||s->length {
if(s==q->rear)
break;
else
s=s->next;
}
if(s==NULL||s->flag||s->length {
printf(“内存不足\n“);
}
else if(s->length==length)
    {
strcpy(s->namename);
s->flag=1;
}
else//空闲区长度大于所需长度
{
QNode *t;
t=(QNode *)malloc(sizeof(QNode));
t->address=s->address+length;//下一个节点的基地址 
t->flag=0;//下个节点未分配 
t->length=s->length-length;//剩余内存 
t->next=NULL;
s->flag=1;//上个节点表明已经分配 
s->length=length;//修改分别的长度 
strcpy(s->namename);//分配的进程名称 
if(s==q->rear)
{
q->rear=t;
s->next=t;
}
else 
{
t->next=s->next;
s->next=t;
}
}
getchar();
}
/******************************回收内存**************************/
void  ClearQueue(LiQueue *&q)
{
char name[10];
printf(“输入进程名:“); scanf(“%s“name);
QNode *s=q->front;//指向链表的头结点 

//判断是否释放的是头结点 
if(q->front->flag && !strcmp(q->front->namename)) //进程头结点
{
if(q->front->next!=NULL && !q->front->next->flag)//如果下一个结点空闲,结点合并
{
q->front->length+=q->front->next->length;
//断开第二个节点的连接,接上后面的节点 
q->front->next=q->front->next->next; 
q->front->flag=0;//
}
else //否则直接将结点状态改为空闲
q->front->flag=0;
}


else if(q->rear->flag && !strcmp(q->rear->namename))//进程在尾结点
{
QNode *t=q->front;
while(t!=q->rear)//查找上一个结点s
{
s=t;
t=t->next;
}
if(!s->flag)//如果上一个结点空闲结点合并
{
s->length+=q->rear->length;
q->rear=s;
s->next=NULL;

评论

共有 条评论