GNU C library 笔记(2)

 

内容:Memory

1. 几个基本概念,page、frame、paging、segment。
进程分配内存的两种模式,一个使用 exec 系列函数,一个使用 programmatically(malloc 等函数)。
重要的 segment 有 text segment(存放代码等等,一般在进程的生命周期中不变)、data segment
(存放数据,能用一些函数来调整大小,不过低位端位置不变)、stack segment(随着使用的堆栈
变大而变大,但不变小...)

2. 内存的静态分配和自动分配。前者是对于 static 变量或全局变量,一旦开始就分配,即一直存在到最后。
后者是临时变量,如调用函数。值得注意的是:

In GNU C, the size of the automatic storage can be an expression that
varies. In other C implementations, it must be a constant.


3. 内存的动态分配不为 C 语言本身支持,不像 C++。基本方法是

void * malloc (size_t size)

分配到的内存没有初始化(calloc 会做清零,clear allocate),因此能用 memset 来
进行初始化。分配后应检测返回指针是否为 NULL。malloc 返回的一个块多数情况下对齐
(这样能存储任意类型的数据)过了,地址为 8 的倍数(64 位系统里面是 16 的倍数),
在一些特别情况下(page 的边界)能利用 memalign、posix_memalign、vlign 来返回
对齐(2 的幂次)的内存块。free 的内存非常少被返还给操作系统,多数情况被留作后面
malloc 使用。如果需要调整已 malloc 的块的大小,使用 realloc。glibc 不会将分配的块
对 2 的幂次进行向上取整。

4. 一次性分配非常大的内存(大于一个 page)会使用向 2 的幂次取整的策略,使用 mmap
相关的函数 mallopt,这种分配得到的内存在 free 时会返回给操作系统。

5. 怎么调整 malloc 的行为?使用 mallopt 调整一些参数的值(malloc.h),如
M_TRIM_THRESHOLD(返回给 OS 的内存的一个阈值)、M_MMAP_THRESHOLD
(大于此值的内存分配请求使用 mmap 系统调用)等等。

6. 分配的内存来自堆(heap),能用

int mcheck ( void (*abortfn) ( enum mcheck_status status))

来检查分配内存的一致性,调用在 malloc 之前。

enum mcheck_status mprobe ( void *pointer)

为特定的一块内存做检查。这都是 GNU extension。(mcheck.h)

7. 为了方便调试,glibc 为用户提供了 malloc 等等函数的钩子(hook),如 __malloc_hook
对应的是个函数指针,

void *function (size_t size, const void *caller)

其中 caller 是调用 malloc 返回值的接受者(一个指针的地址)。另外有 __malloc_initialize_hook
函数指针,仅仅会调用一次(第一次分配动态内存时)。(malloc.h)

8. 一些使用 mallo

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值