现在的位置: 首页 > 综合 > 正文

Expert C Programming阅读笔记 VII

2017年12月15日 ⁄ 综合 ⁄ 共 753字 ⁄ 字号 评论关闭
好长时间不写blog,一次写完
Chapter 7

Intel 80x86的内存模型
UNIX中的“段”指二进制数据中的相关内容。
Intel x86中的段是将地址空间分为64KB的块。

虚拟内存
虚拟内存通过页面组织,一个页面是OS维护的一小块(几个KB)的内存。一个页面可以被送到磁盘中,也可以被调出。如果程序不运行,可能内存映像被交换到磁盘中。在Solaris中,只有用户程序被交换出,核心始终在内存中。
进程只能访问内存中的页面。如果页面在内存外,则MMU(内存管理器)产生一个page-fault错误。内核检查内存引用是否合理,若不合理,则segment fault,否则从磁盘中调出内存页面。这个过程对于进程来说不透明的。

CPU Cache
CPU的缓存较内存更快。提高缓存命中率能够有效的提升程序的速度。

数据段和堆
--
高地址端

堆栈段(向下)
空洞
堆(向上)

(BSS段)
数据段
代码段
未引用地址
低地址端
--
堆上的对象是匿名的。需要用指针来引用它们。
堆上可能由于申请和释放而产生碎片。
(附注:在K&R TCPL中的最后部分提到了一种处理方法,就是在堆上寻找满足申请要求的最大空闲空间,如果找到则使用,否则调用brk来调整堆的大小。)

内存泄漏
程序在结束时操作系统会自动回收资源,但是有时候并不能如此做下去。需要成对使用malloc和free。常见的两类堆错误是:
1、释放或者重写正在使用的内存块(memory corruption)
2、不释放无用的内存块(memory leak)
一个有趣的函数alloca可以在堆栈上申请内存,在程序块结束时释放这些内存。

段错误
段错误的一些可能原因:
1、解引用野指针
2、解引用空指针
3、访问不具有权限的内存块(e.g.试图写只读的代码段)
4、堆栈或者堆空间已经耗尽
可以用signal系统来捕获段错误。

抱歉!评论已关闭.