模拟内存分配器2

1. 要求

建立空闲块构成的链表,每个块包含该块的字节数和指向链表中下个块的指针。从每个块起始处存放它们。要分配指定大小的块时,采用最先适应算法,取出所需要的块,接着更新链表。该块被释放时,把该块添加到链表的尾部。

2. C程序

cpp 复制代码
#include <stdlib.h>
#include <sys/mman.h>
#include <stdio.h>
#define WSIZE 4   /* word size (bytes) */
#define DSIZE 8    /* double word size (bytes) */
#define OVERHEAD 12  /* overhead of header and footer (bytes) */
struct segment
{
   int  length;
   struct segment  *link;
} ;   
struct segment *head;
 
/* 声明结构函数allocblock()和无值型函数dealloc() */
struct segment *allocblock(int x);
void print(struct segment *phead);
struct segment *find_fit(int x);
void dealloc(struct segment *blo);
int main()
{
  int size;
  struct segment *freelist,*p,*q,*block1;
  size=100;
  head=NULL;
  freelist=(struct segment *)mmap( NULL,4096,PROT_READ|PROT_WRITE,
                                   MAP_PRIVATE|MAP_ANONYMOUS,-1,0 );
  if(freelist==MAP_FAILED) {
    printf("mmap faile");
  }
    /* 建立链表 */
  freelist->length=size;
  freelist->link=NULL;
  head=freelist;

  p=head+size+OVERHEAD;
  p->length=200;
  freelist->link=p;
  p->link=NULL;

  q=p+p->length+OVERHEAD;
  q->length=300;
  p->link=q;
  q->link=NULL;

  printf("before allocblock:\n");
  print(head);
  size=120;
  block1=allocblock(size);   // 分配一个size大小块block1
  if (block1 == NULL) {
      perror("allocblock faile");
      exit(1);
    }
  printf("The length of allocated block is %d\n",block1->length);
  printf("after allocblock:\n");
  print(head);
  dealloc(block1);    // 释放block1
  printf("after dealloc:\n");
  print(head);
  
  return 0;
}

struct segment *allocblock(int x)
{
  int i,temp;
  struct segment *bp;  
  if (x<=0)
    return NULL;
  else if (x<=DSIZE) 
    x=OVERHEAD+ WSIZE;
  else
    x=((x+(OVERHEAD)+(DSIZE-1))/DSIZE)*DSIZE;
  if((bp=find_fit(x))!=NULL){
    return bp;
  }
  else
  return NULL;
}

struct segment *find_fit(int x){
  struct segment *m,*n,*r;
  int temp;
  m=head;
  if(x<=head->length){
    if(((head->length)-x)<2*DSIZE)
      head=head->link;
    else{
      temp=m->length;
      m->length=x;
      head=m+x+12;
      head->length=temp-x-12;
      head->link=m->link;
    }
        
  }
  else{
      while(x>m->length){
        n=m; m=m->link;
        if (m==NULL) break; 
      }
      if (m!=NULL){
        if(((m->length)-x)<2*DSIZE)
          n->link=m->link;
        else{
          temp=m->length;
          m->length=x;
          r=m+x+12;
          r->length=temp-x-12;
          n->link=r;
          r->link=m->link;
        }
      }
      else
       return NULL;
  }
  return m;
 }

void print(struct segment *phead)
{   
  struct segment *p;
  p=phead;
  while (p!=NULL){
    printf("%d\n",p->length);
    p=p->link ;
  }
}

void dealloc(struct segment *blo)    
{
   struct segment *p;
   p=head;
   while(p->link!=NULL)
     p=p->link;
   p->link = blo;
   blo->link = NULL;
}   

3. 运行结果

before allocblock:

100

200

300

The length of allocated block is 136

after allocblock:

100

52

300

after dealloc:

100

52

300

136

相关推荐
广州灵眸科技有限公司14 小时前
瑞芯微(EASY EAI)RV1126B AI算法开发流程
人工智能·算法·机器学习
Rabitebla14 小时前
【C++】string 类:原理、踩坑与对象语义
linux·c语言·数据结构·c++·算法·github·学习方法
小雅痞15 小时前
[Java][Leetcode middle] 167. 两数之和 II - 输入有序数组
java·算法·leetcode
CN-Dust16 小时前
【C++】输入cin例题专题
java·c++·算法
数模竞赛Paid answer16 小时前
2025年MathorCup数学建模A题汽车风阻预测解题文档与程序
算法·数学建模·mathorcup
Old Uncle Tom1 天前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆1 天前
洛谷题单入门1 顺序结构
数据结构·算法·golang
生信碱移1 天前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
智者知已应修善业1 天前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
智者知已应修善业1 天前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机