《c专家编程》学习笔记(二)

1、虚拟内存

虚拟内存的基本思路是使用廉价但缓慢的磁盘来扩充快速但昂贵的内存。

操作系统负责具体细节,使得每个进程都以为自己拥有整个地址空间的独家访问权,这个幻觉依靠虚拟内存实现。所有进程共享机器的物理内存,当内存用完时就用磁盘保存数据。在进程运行时,数据在磁盘和内存之间来回移动

内存管理硬件负责把虚拟地址翻译为物理地址,并让一个进程始终运行于系统的真实内存中。应用程序程序员只看到虚拟地址,并不知道自己的进程在磁盘和内存之间来回切换。

虚拟内存通过“页”的形式组织。页就是操作系统在磁盘和内存之间移来移去或者进行保护的单位,一般为几K字节。进程只能操作位于物理内存中的页面。当进程引用一个不在物理内存中的页面时,MMU产生一个页错误。

2、cache存储器

cache位于内存和CPU之间,是一种极快的存储缓冲区,特点是容量小、价格高、速度快。

cache包括一个地址的列表以及他们的内容。所有对内存的读取和写入操作都要经过cache。

处理器需要从一个特定的地址提取数据时,这个请求首先递交给cache。如果数据已经存在于cache中,他就可以立即被提取。否则,cache向内存传递这个请求,于是就要进行较缓慢的访问内存操作。内存读取的数据以行为单位,在读取的同时也装入到cache中。

这里写图片描述

3、检测内存泄露的步骤:

(1)首先使用swap命令观察还有多少可用的交换空间:

/usr/sbin/swap -s

在一两分钟内键入该命令三到四次,看看可用的交换区是否在减少。如果发现不断有内存被分配且从不释放,一个可能的解释就是有个进程出现了内存泄露。
(2)、确定可疑的进程,看看它是否该为内存泄露负责。你可能已经知道哪个进程是罪魁祸首,不然可以使用pa -lu用户名命令来显示所有进程的大小。同样数次重复这个命令,可以发现任何动态分配内存的进程的大小都在增长。如果一个进程看上去不断增长而从不缩小,就有可能出现了内存泄露。

4、总线错误

总线错误几乎都是由于未对齐的读或写引起的。它之所以称为总线错误,是因为出现未对齐的内存访问请求时,被堵塞的组件就是地址总线。对齐(alignment)的意思就是数据项只能存储在地址是数据项大小的整数倍的内存位置上。

段错误(segmentation violation)通常是由于内存管理单元(负责支持虚拟内存的硬件)的异常所致,而该异常则通常是由于解除引用一个未初始化或非法值的指针引起的

通常导致段错误的几个直接原因:
(1)、解除引用一个包含非法值的指针;
(2)、解除引用一个空指针(常常由于从系统程序中返回空指针,并未经检查就使用);
(3)、在未得到正确的权限时进行访问。例如,试图往一个只读的文本段存储值就会引起段错误。
(4)、用完了堆栈或者堆空间。

在绝大多数情况下,总线错误意味着CPU对进程引用内存的一些做法不满,而段错误则是MMU对进程引用内存的一些情况发出抱怨。

最终可能导致段错误的常见编程错误是:
(1)坏指针值错误:在指针赋值之前就用它来引用内存,或者向库函数传送一个坏指针,或者对指针进行释放之后再访问它的内容。
(2)改写错误:越过数组边界写入数据,在动态分配的内存两端之外写入数据,或改写一些堆管理数据结构。
(3)指针释放引起的错误:释放同一个内存块两次,或者释放一块未曾使用malloc分配的内存,或释放仍在使用中的内存,或释放一个无效的指针。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值