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

西安网站建设选任我行网络/如何利用网络进行推广和宣传

西安网站建设选任我行网络,如何利用网络进行推广和宣传,小偷程序做的网站能用吗,学大数据专业后悔死了引言 今天,我们来分析_S_chunk_alloc函数 接下来我们看_S_chunk_alloc函数对具体内存块的分配 nobjs都是20,这是固定的数字。然后还传入我们申请的字节数。 也就是该chunk的个数和该chunk的大小 然后把chunk块的内存池起始地址返回 我们进入到_S_chu…

引言

今天,我们来分析_S_chunk_alloc函数
在这里插入图片描述
在这里插入图片描述
接下来我们看_S_chunk_alloc函数对具体内存块的分配
nobjs都是20,这是固定的数字。然后还传入我们申请的字节数。
也就是该chunk的个数和该chunk的大小
然后把chunk块的内存池起始地址返回

我们进入到_S_chunk_alloc函数

在这里插入图片描述

正常流程的内存分配

我们一步一步来解析下去
__total_bytes计算内存池的总字节数
__bytes_left就是剩余的字节数
在这里插入图片描述
因为初始化都是0,所以end-start=0
然后就到else代码段里执行
S_heap_size是0,0右移4位还是0

在这里插入图片描述
然后执行malloc了,按字节数开辟内存( * 2),对于8字节的大小来说,开辟了40个chunk块

然后执行:开辟内存
在这里插入图片描述
在这里插入图片描述
如果_S_start_free为0,就是开辟内存失败。
在这里插入图片描述
我们先假设开辟内存成功了。然后执行:
在这里插入图片描述
_S_heap_size+=320,现在就是320了。(因为我们假设申请8字节的)
然后让_S_end_free到末尾
在这里插入图片描述
然后执行return,又是对当前函数的递归调用。
因为一刚开始,相应大小字节的chunk块根本就没有,就得首先分配chunk块内存池,分配好内存池之后,然后又启动当前函数,现在就是8字节的chunk块内存池已经分配好了。
在这里插入图片描述
现在__bytes_left=320

320>160,进入这个if语句:
在这里插入图片描述
在这里插入图片描述
如图所示:
在这里插入图片描述
相当于把前面20块chunk使用起来,后20块chunk备用。
最后把第一个chunk地址返回会去。

全局调用流程梳理看看:
在这里插入图片描述

deallocate内存归还释放函数

在这里插入图片描述
传入的第一个 参数就是要归还chunk块的起始地址,第二个参数是归还的chunk的字节数

如果归还的字节数大于128字节,那么当时分配的时候就是通过一级空间配置器malloc来分配,没有从内存池来分配,所以释放的时候也是通过free来释放。
在这里插入图片描述

else ,就是小于等于128字节,当时也是从内存池分配出去的,所以,归还的时候,也应该归还到内存池中。
首先得定位到静态链表中的第一维的元素下标位置
在这里插入图片描述
举个例子。如下图,假如前2个chunk块都分配出去了。
在这里插入图片描述
现在要归还。首先__q指向归还的节点,
在这里插入图片描述
然后加锁,
在这里插入图片描述
第1句做的事情如图所示:
在这里插入图片描述

第2句做的事情如图所示:
在这里插入图片描述
全局梳理看看:
在这里插入图片描述

继续讲解_S_chunk_alloc内存分配

在这里插入图片描述
假设它把前20个chunk块分配完了,第20chunk块的头部是空指针,如果把第20个chunk块分配出去了,相当于把第20块的头部的空指针赋值给了第一维数组的元素值。

然后再去分配的话,result还是0了:
在这里插入图片描述
160= =160,进入if
在这里插入图片描述
就是后20个chunk块的首地址返回回去。
在这里插入图片描述

如果又都用完了,前面都是0,if和else进不去,然后又进入else
在这里插入图片描述
40+20=60 开辟60个chunk块。因为使用的比较多,重新开辟的更多一点。

我们再看其他情况

如果现在分配8个字节,
在这里插入图片描述
后20个chunk块也是按8字节计算的。
在这里插入图片描述
假如说,我们申请了几个8字节的chunk,现在要申请16字节的,
在这里插入图片描述
16*20=320
__total_bytes就是320,此时,__bytes_left=160字节。
160<320
不进入if语句
160>16(size)
进入else if
在这里插入图片描述
它在分配其他字节数的chunk。并没有直接分配,而是在看,在之前分配过的备用的内存池
在这里插入图片描述
160>16(size)
进入
在这里插入图片描述
160/16=10
nobjs成10了
也就是说,刚才分配的时候,是按8字节分配的,现在一除,
在这里插入图片描述
现在变成10个chunk,一个chunk16个字节。
在这里插入图片描述
然后return result
然后会调用refill,把节点连起来。

在这里插入图片描述

我们再举一个例子,假如说,我们申请了几个8字节的chunk,现在要申请128字节的chunk,
很明显,160>128
进入

在这里插入图片描述
160/128=1
nobjs就是1了
在这里插入图片描述
在这里插入图片描述
现在备用内存池还剩余32字节,假如我们现在还想要申请40字节的chunk块,现在40字节大小对应的数组的第一维元素是空值,进入refill函数的chunk_alloc函数
40x20=800字节
备用空间剩余32个字节
32 小于800
32<40

在这里插入图片描述

进入下面的else方法
在这里插入图片描述
320右移4位,总共分配60个40字节的chunk块

越申请越大,因为如下
在这里插入图片描述
32>0,这个32字节也不能浪费
在这里插入图片描述
对齐。直接给了32的位置了。
在这里插入图片描述

在这里插入图片描述

内存分配失败的处理流程

如果malloc开辟失败的话:
在这里插入图片描述
假如我们现在又想申请40字节的chunk块。
原本计划开辟60个40字节的chunk块。

现在进入if语句。
定义了一个i变量和一个二级指针,想遍历数组,obj*p可以访问chunk块的头

在这里插入图片描述
for循环,从40开始,每次加8,遍历,最后到128字节的元素位置。
_p做的事情就是访问相应一维数组元素的内容(访问的是对应的链表)。
内存分配失败,证明系统的内存不够用,所以不用遍历40前面的元素,因为也放不了40,所以直接从40开始向后遍历,
_p到40的位置,是空的,假设我们在48的元素位有开辟内存,_p到48的位置。

在这里插入图片描述
系统没内存申请给40的了,就看它后面的元素有没有chunk块,有就让给它。
48的位置有!!!
在这里插入图片描述
在这里插入图片描述
然后return 进行递归调用
48>40
在这里插入图片描述
取40字节出来。

在这里插入图片描述
将来这个40字节的chunk也就归还到40的名下。

等下次要申请16字节,16>8,不够用,要重新分配,然后看:
在这里插入图片描述

现在备用的内存池空闲剩余8个字节,最后把这个8字节接到8字节的chunk块下面
使用得干干净净!
在这里插入图片描述
如果一直遍历到128字节的chunk块,都没有剩余的,_p为空,让malloc申请。
在这里插入图片描述

最后的问题

我们继续看看:
在这里插入图片描述
在这里插入图片描述
刚才分配失败,现在马上接着分配malloc会不会失败
有可能失败有可能成功,因为多线程,其他线程有可能释放内存了。

成功了result不为空,直接返回。如果失败了,调用_S_oom_malloc
我们进去_S_oom_malloc看看
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
有一个函数指针,指向返回值是void不带形参的函数。

底层开辟内存失败的话,我们可以设置回调函数,它会帮我们调用回调函数,回调函数就是写可以释放资源的代码,让系统调用回调函数释放一些空间。
在这里插入图片描述
如果用户没有设置回调函数,就抛出new操作开辟失败。
如果用户有预先设置回调函数,就会调用用户的回调函数(开发者预估到的预先节约资源的方法)
然后系统再启动malloc。如果还是开辟失败,就再调用回调函数,以此类推,直到调用成功。

如果用户想要预置回调函数,就要考虑清楚这个回调函数真的可以释放出有效的内存空间资源吗?否则就是死循环。

开辟成功后,然后就返回到_S_chunk_alloc函数
在这里插入图片描述

借鉴的地方

在这里插入图片描述

实现的优点

在这里插入图片描述

http://www.lbrq.cn/news/1309033.html

相关文章:

  • 群晖系统可以做网站吗/seo分析与优化实训心得
  • 中文商城响应式html网站模板/最好用的手机优化软件
  • 做购物网站需要什么资质/关键词歌词林俊杰
  • php动态网站设计/上海网站建设哪家好
  • 安徽网络公司排名/seo推广的方法
  • 佛山微网站推广/百度一下百度主页度
  • 深圳市建设注册执业资格中心网站/百度收录官网
  • 临沂企业网站建站模板/成都门户网站建设
  • 国外商业网站设计/四川网络推广推广机构
  • 网站建设平台哪个部门管/百度保障平台 客服
  • 烟台网站建设的公司/品牌营销策略分析
  • 有个网站发任务 用手机可以做/苏州seo按天扣费
  • B2B网站建设哪家好/松原市新闻
  • 做销售网站的公司哪家最好/网络营销的特点包括
  • 网站建设中主页指的是/百度客服人工服务电话
  • python 自己做网站/seo关键字怎么优化
  • 代码生成器在线/排名优化公司哪家靠谱
  • 怎样建设文章网站/高端seo服务
  • 南山做网站联系电话/全网最好的推广平台
  • 软件开发流程有哪些步骤/seo排名优化课程
  • 有专门学做衣服网站/百度客服人工
  • 想自己做网站流程/肇庆百度快照优化
  • 深圳网站建设怎样容易/交换链接或称互惠链接
  • 做美陈网站/口碑营销策划方案
  • 推广网站优化怎么做/电脑培训零基础培训班
  • 做剧情网站侵权吗/培训心得体会总结
  • 真人做爰片免费观看网站/2023年新冠疫情最新消息
  • 做模板网站简单吗/域名归属查询
  • 现在自己做网站卖东西行么/网络营销以什么为中心
  • html动漫网站模板下载/无锡网站优化
  • MyBatis 之配置与映射核心要点解析
  • 能行为监测算法:低成本下的高效管理
  • 广州 VR 森林防火系统功能探究​
  • 鸿蒙网络编程系列58-仓颉版TLS数字证书查看及验签示例
  • 【数据结构】栈与链表的区别
  • 【第二章自定义功能菜单_MenuItemAttribute_顶部菜单栏(本章进度1/7)】