免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1846 | 回复: 8
打印 上一主题 下一主题

[内存管理] 关于小容量内存的申请 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-31 00:11 |只看该作者 |倒序浏览
1、假设依靠malloc申请一个32字节的动态内存,那内核是拿什么来管理这块内存的呢,使用结构体 page 管理吗?(那开销不是很大吗?)

2、如何实现线性地址向这小块物理内存的映射呢?(32字节,自然不是一页)

3、如果申请了这种小块的内存,对于一个进程而言,线性区是否还能连续呢?

论坛徽章:
0
2 [报告]
发表于 2012-08-31 01:22 |只看该作者
我说的是伙伴系统

论坛徽章:
0
3 [报告]
发表于 2012-08-31 02:19 |只看该作者
就是不明白:这个这个分配出来的小内存,如何在线性地址空间与物理内存空间中相互映射的

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2012-08-31 09:10 |只看该作者
回复 3# scutwyz
先看一下 Linux 内存管理相关的介绍吧


   

论坛徽章:
0
5 [报告]
发表于 2012-08-31 09:28 |只看该作者
看了好些了,确实介绍了从线性地址向物理地址的映射方法。。。。

但是,那是基于页表的。。。

小内存的块连一页都没有占用到,怎么映射呢?

论坛徽章:
0
6 [报告]
发表于 2012-08-31 10:12 |只看该作者
回复 5# scutwyz


你的几个问题,看看malloc的具体实现(sbrk),具体看堆的增长,及kernel sbrk/brk的实现。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
7 [报告]
发表于 2012-09-01 16:18 |只看该作者
回复 1# scutwyz
看看slab/slub/slob吧

   

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
8 [报告]
发表于 2012-09-01 18:55 |只看该作者
从大到小:
先是伙伴系统管理页  页是物理页,从物理地址到虚拟地址就是通过你说的页表映射发生的。
小内存用不了一页,那就用一页中的一部分,如16字节,32字节,这样是通过slab子系统管理的
假设你申请32字节内的是通过32字节这个链表里申请的,如果32字节这个链表里的物理页不够了,那么会通过slab的管理系统自动向系统请求物理页以扩张这个链表
所以你用malloc返回的是虚拟地址,而不是自己传入一个虚拟地址和物理地址来获得内存,因为slab只是从链表中找到这个物理块,然后返回这个内存的虚拟地址

论坛徽章:
0
9 [报告]
发表于 2012-09-02 08:56 |只看该作者
回复 1# scutwyz

不能打击楼主的学习积极性啊

1、假设依靠malloc申请一个32字节的动态内存,那内核是拿什么来管理这块内存的呢,使用结构体 page 管理吗?(那开销不是很大吗?)

这个malloc是c lib库提供的。malloc成功后,并没有分配真正的内存页,仅仅是分配了虚拟地址。真正的物理页通过page fault分配。

2、如何实现线性地址向这小块物理内存的映射呢?(32字节,自然不是一页)

就是楼上同学所说的SLAB了。伙伴系统分配物理内存是以页为单位的。当然,这是Linux的实现。事实上,在Linux的伙伴系统建立之前,先是按照region的方式负责分配内存,使用一块就加入到已分配region链表中,之后又用bitmap的方式,以页对齐的方式,使用一页对应bit位就标记为1,伙伴系统建立后,就开始用伙伴系统了。之前以region和bitmap的方式就全部不再使用。废话有点多,见谅

3、如果申请了这种小块的内存,对于一个进程而言,线性区是否还能连续呢?

准确来说,32字节的物理内存或是虚拟地址肯定都是连续的(映射是以一个物理页框为最小单元的)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP