news 2026/9/15 7:12:34

模拟内存分配器2

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
模拟内存分配器2

1. 要求

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

2. C程序

#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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 14:11:59

开源小模型新选择:Qwen2.5-0.5B边缘计算部署趋势解析

开源小模型新选择&#xff1a;Qwen2.5-0.5B边缘计算部署趋势解析 1. 小模型为何突然火了&#xff1f; 你有没有遇到过这种情况&#xff1a;想在树莓派上跑个AI聊天机器人&#xff0c;结果发现动辄几十GB显存的“大模型”根本带不动&#xff1f;或者公司内网需要一个本地化智能…

作者头像 李华
网站建设 2026/9/11 20:56:36

保险理赔沟通分析:争议点情绪突变AI识别实战

保险理赔沟通分析&#xff1a;争议点情绪突变AI识别实战 在保险理赔服务中&#xff0c;客户与客服之间的沟通质量直接影响满意度和纠纷率。传统上&#xff0c;这类对话的质检依赖人工抽样&#xff0c;效率低、成本高&#xff0c;且难以捕捉细微的情绪波动。而一次语气的变化&a…

作者头像 李华
网站建设 2026/9/13 15:22:45

React Native Vision Camera性能调优:从卡顿到丝滑的实战指南

React Native Vision Camera性能调优&#xff1a;从卡顿到丝滑的实战指南 【免费下载链接】react-native-vision-camera &#x1f4f8; A powerful, high-performance React Native Camera library. 项目地址: https://gitcode.com/GitHub_Trending/re/react-native-vision-c…

作者头像 李华
网站建设 2026/9/15 14:24:46

Media Player Classic-HC完整使用指南:开源播放器的专业配置方法

Media Player Classic-HC完整使用指南&#xff1a;开源播放器的专业配置方法 【免费下载链接】mpc-hc Media Player Classic 项目地址: https://gitcode.com/gh_mirrors/mp/mpc-hc Media Player Classic-HC&#xff08;简称MPC-HC&#xff09;是一款基于GPL v3协议的开源…

作者头像 李华
网站建设 2026/9/3 2:23:51

终极指南:Flow Launcher离线插件高效安装全流程

终极指南&#xff1a;Flow Launcher离线插件高效安装全流程 【免费下载链接】Flow.Launcher :mag: Quick file search & app launcher for Windows with community-made plugins 项目地址: https://gitcode.com/GitHub_Trending/fl/Flow.Launcher 你是否想过在没有网…

作者头像 李华
网站建设 2026/9/14 18:51:28

后台服务常崩溃?SenseVoiceSmall内存泄漏排查与修复指南

后台服务常崩溃&#xff1f;SenseVoiceSmall内存泄漏排查与修复指南 你有没有遇到过这种情况&#xff1a;刚部署好的 SenseVoiceSmall 语音识别服务&#xff0c;一开始运行得好好的&#xff0c;结果跑着跑着就变慢&#xff0c;最后直接卡死或崩溃&#xff1f;尤其在长时间处理…

作者头像 李华