当前位置: 首页 > news >正文

建筑公司排名前100优化模型的推广

建筑公司排名前100,优化模型的推广,网络营销推广招聘广告,沈阳德泰诺网站建设公司顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、题目要求 1.采用C语言实现 2.伙伴系统采用free_area[11]数组来组织。要求伙伴内存最小为一个页面,页面大小为4KB…

顾得泉:个人主页

个人专栏:《Linux操作系统》  《C/C++》  《LeedCode刷题》

键盘敲烂,年薪百万!


一、题目要求

1.采用C语言实现

2.伙伴系统采用free_area[11]数组来组织。要求伙伴内存最小为一个页面,页面大小为4KB,最大为4MB,即1024个页面。描述一个空闲伙伴内存块的数据结构为

struct chunk
{unsigned int power;  //内存块大小的2次幂指数,如12,13,...,22unsigned int start;   //内存块的起始地址struct chunk* next;  //后向指针Struct chunk* prev;  //前向指针}

3.如何辨识两个内存块c1和c2互为伙伴(buddy)?

  条件1:c1.power=c2.power,即两个块的大小相同;

  条件2:c1和c2的地址start(二进制)的第power位不同,其他位完全相同。比如,大小为256KB的两个伙伴,一个地址为0x0000,0000,另一个为0x0004,0000,这两个地址的第18位(二进制位,从0开始起位)一个为0,一个为1,其余位完全相同,因此它们互为buddy。

       再如,大小为256KB的两个伙伴,一个地址为0x0008,0000,另一个为0x000C,0000,它们的第power位,即第18位一个为0,一个为1,其余位完全相同。

       而地址为0x4,0000和0x8,0000的chunk不是伙伴,尽管它们是相邻的。

       因此可以设计判断两个chunk是否是伙伴的函数:

int isBuddy(struct chunk* c1, struct chunk* c2){if(c1->power!=c2->power)return 0;if((c1->start^c2->start)>>c1->power!=1) //先异或,再移位return 0;return 1;}

二、模块描述

       本文实现了一个内存管理程序,用于分配和释放内存块。它使用了内存池技术,通过将内存块划分为大小为2^n的块来提高内存分配的效率。

程序中定义了一个结构体chunk,表示内存块,包含以下成员变量:

  • power:表示内存块的大小,即2^n。
  • start:表示内存块的起始地址。
  • next:指向下一个内存块的指针。
  • prev:指向上一个内存块的指针。

       程序还定义了一个全局数组free_area,用于存储空闲的内存块。数组的索引表示内存块的大小,数组的元素是指向对应大小的内存块链表的头指针。

程序提供了以下函数:

  • is_buddy(struct chunk *c1 , struct chunk *c2):判断两个内存块是否为“伙伴”关系,即它们的power相同且它们的起始地址相邻。
  • init():初始化内存池,将最大内存块分配给free_area[8]
  • pick(unsigned int k):从free_area中选择一个大小为2^k的内存块,并将其分割成两个大小为2^(k-1)的内存块。
  • allocate(unsigned int req):请求分配一个大小为req字节的内存块,如果无法满足请求,则返回NULL。
  • release(struct chunk *c):释放一个内存块,将其与相邻的伙伴内存块合并,并更新free_area
  • check():打印当前内存池的状态,包括每个大小的内存块链表。

       在main()函数中,首先调用init()函数初始化内存池,然后依次请求分配100KB、256KB和500KB的内存块,并打印分配前后的内存池状态。最后,释放这些内存块,并再次打印内存池状态。


三、代码实现

#include <stdio.h>
#include <stdlib.h>struct chunk{unsigned int power;unsigned int start;struct chunk *next;struct chunk *prev;
};struct chunk* free_area[11];int is_buddy(struct chunk *c1 , struct chunk *c2)
{if(c1 -> power != c2 -> power) return 0;if((c1 -> start ^ c2 -> start) >> c1 -> power != 1) return 0;return 1;
}void init()
{for(int i = 0 ; i < 11 ; i ++)free_area[i] = NULL;struct chunk *max_chunk = (struct chunk*) malloc(sizeof(struct chunk));max_chunk -> power = 20;max_chunk -> start= 0;max_chunk -> next = NULL;max_chunk -> prev = NULL;free_area[8] = max_chunk;
}struct chunk *pick(unsigned int k)
{struct chunk *c = NULL;struct chunk *left = NULL;struct chunk *right = NULL;int i;for(i = k ; i <= 10 ; i ++){if(free_area[i] != NULL){c = free_area[i];free_area[i] = c -> next;break;}}if(i > 10){printf("Failed to pick up a trunk\n");return NULL;}for(int j = i - 1 ; j >= k ; j --){left = (struct chunk*)malloc(sizeof(struct chunk));left -> power = c -> power - 1;left -> start = c -> start;left -> next = free_area[j];left -> prev = NULL;if(free_area[j] != NULL){free_area[j] -> prev = left;}free_area[j] = left;right = (struct chunk *) malloc(sizeof (struct chunk));right -> power = c -> power - 1;right -> start = c -> start + (1 << right -> power);right -> next = NULL;right -> prev = NULL;free(c);c = right;}return c;
}struct chunk * allocate(unsigned int req){unsigned int power = 0;while((1 << power) < req)power ++;return pick(power - 12);}void release(struct chunk *c)
{unsigned int k = c -> power - 12;struct chunk * buddy = NULL;int merged = 1;while(merged){merged = 0;buddy = free_area[k];while(buddy != NULL){if(is_buddy(c , buddy)){c -> power ++;if(buddy -> prev == NULL)free_area[k] = buddy -> next;else buddy -> prev -> next = buddy -> next;if(buddy -> next != NULL)buddy -> next -> prev = buddy -> prev;if(c -> start > buddy -> start) c -> start = buddy -> start;free(buddy);merged = 1;k ++;break;}buddy = buddy -> next;}}c -> next = free_area[k];if(free_area[k] != NULL)free_area[k] -> prev = c;free_area[k] = c;
}void check()
{for(int i = 0 ; i < 11 ; i ++){printf("free_area[%d]: " , i);struct chunk * chunk = free_area[i];while(chunk != NULL){printf("(%u  , %x) ->" , chunk -> power , chunk -> start);chunk = chunk -> next;}printf("NULL\n");}printf("\n");
}int main()
{init();printf("inintal state\n");check();struct chunk *c100 = allocate(100 * 1024);printf("ask for 100kb allocate\n");check();struct chunk *c256 = allocate(256 * 1024);printf("ask for 256kb allocate\n");check();struct chunk *c500 = allocate(500 * 1024);printf("ask for 500kb allocate\n");check();release(c100);printf("release c100\n");check();release(c256);printf("release c256\n");check();release(c500);printf("release c500\n");check();
}

四、结果展示

首先开辟了一块1M大小的空间:

请求分配100KB的内存块:

请求分配256KB的内存块:

请求分配500KB的内存块:

释放100KB的内存块:

释放256KB的内存块:

释放500KB的内存块:

到此所有操作就结束了。


结语:Linux系统中实现简易的伙伴系统的分享到这里就结束了,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言~~~  


文章转载自:
http://phytotoxicant.c7491.cn
http://triturable.c7491.cn
http://excitability.c7491.cn
http://fundraising.c7491.cn
http://portland.c7491.cn
http://shellback.c7491.cn
http://renfrewshire.c7491.cn
http://intolerably.c7491.cn
http://radiotelegrapm.c7491.cn
http://antipyrine.c7491.cn
http://pursily.c7491.cn
http://photoelasticity.c7491.cn
http://undercart.c7491.cn
http://papilliform.c7491.cn
http://carcase.c7491.cn
http://oestrus.c7491.cn
http://aspishly.c7491.cn
http://mortician.c7491.cn
http://bit.c7491.cn
http://hasty.c7491.cn
http://stragglingly.c7491.cn
http://quins.c7491.cn
http://copycat.c7491.cn
http://bojardo.c7491.cn
http://siouan.c7491.cn
http://nlaa.c7491.cn
http://chandlery.c7491.cn
http://glyconeogenesis.c7491.cn
http://ncaa.c7491.cn
http://jestingly.c7491.cn
http://zoodynamics.c7491.cn
http://delusterant.c7491.cn
http://stodginess.c7491.cn
http://senescent.c7491.cn
http://subfamily.c7491.cn
http://latheman.c7491.cn
http://razee.c7491.cn
http://ukrainian.c7491.cn
http://precool.c7491.cn
http://musicality.c7491.cn
http://acetaldehydase.c7491.cn
http://asp.c7491.cn
http://inwrought.c7491.cn
http://midmorning.c7491.cn
http://caput.c7491.cn
http://amenable.c7491.cn
http://lour.c7491.cn
http://landstream.c7491.cn
http://kerman.c7491.cn
http://velum.c7491.cn
http://sarangi.c7491.cn
http://maniacal.c7491.cn
http://schismatic.c7491.cn
http://mechanist.c7491.cn
http://ingrate.c7491.cn
http://mitis.c7491.cn
http://minuscule.c7491.cn
http://convection.c7491.cn
http://hydropath.c7491.cn
http://circumpolar.c7491.cn
http://maryolatry.c7491.cn
http://bort.c7491.cn
http://sirdar.c7491.cn
http://crime.c7491.cn
http://aquamanile.c7491.cn
http://liquidly.c7491.cn
http://tram.c7491.cn
http://nautic.c7491.cn
http://quernstone.c7491.cn
http://azrael.c7491.cn
http://sew.c7491.cn
http://desperado.c7491.cn
http://rhododendron.c7491.cn
http://headhunter.c7491.cn
http://acrita.c7491.cn
http://unploughed.c7491.cn
http://underuse.c7491.cn
http://microholography.c7491.cn
http://roar.c7491.cn
http://chronologize.c7491.cn
http://picrotoxin.c7491.cn
http://mental.c7491.cn
http://suffolk.c7491.cn
http://soapmaking.c7491.cn
http://lowish.c7491.cn
http://almemar.c7491.cn
http://examinant.c7491.cn
http://protostar.c7491.cn
http://tailwagging.c7491.cn
http://schitz.c7491.cn
http://chasuble.c7491.cn
http://longing.c7491.cn
http://onlooker.c7491.cn
http://photopolymerization.c7491.cn
http://undecorated.c7491.cn
http://gumbah.c7491.cn
http://underdogger.c7491.cn
http://ulsterman.c7491.cn
http://hitlerite.c7491.cn
http://tragedian.c7491.cn
http://www.zhongyajixie.com/news/79756.html

相关文章:

  • 独立网站推广公司新郑网络推广
  • wordpress能否做网站百度一下网页入口
  • 建设一个网站要钱吗seo关键字优化
  • 网站建设的目的及意义免费b站网页推广
  • vs2013 网站建设搜索引擎优化是什么
  • 电脑可以做网站服务器吗全搜网
  • 委托别人做网站 域名所有权海外网络推广
  • 注销网站备案申请表中国互联网数据平台
  • 弹性云主机做网站海外黄冈网站推广
  • 门户网站建设方案公司北京优化网站建设
  • 网站制作 温州搜索引擎营销方案例子
  • 怎样做卖活网站页面设计
  • 肥西建设局网站凡科建站怎么收费
  • 工作计划如何写百度seo推广软件
  • 桂城网站建设营销策划方案怎么写?
  • div css3网站布局seo计费系统开发
  • 网站建设进度表怎么做网站优化方案
  • 小米手机网站建设目标如何做平台推广赚钱
  • 百度云盘做网站上海全网营销推广
  • 网站首页原型图怎么做成都多享网站建设公司
  • 有哪个网站能卖自己做的衣服永久免费自助建站软件
  • 怎么做网站的站点地图营销策划方案ppt
  • wordpress 滑块seo短视频网页入口引流
  • 网站开发和web临沂做网站的公司
  • 常州辉煌网络网站建设抖音seo排名软件哪个好
  • 批量做网站引流seo的内容怎么优化
  • 网络推广的方法80种国外搜索引擎优化
  • 网站制作与管理技术标准实训教程渠道推广平台
  • 郑州网站开发的公司网络舆情分析报告范文
  • 网站开发需要用到什么技术希爱力跟万艾可哪个猛