《c专家编程》学习笔记(二)
2016-05-16 10:21
731 查看
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分配的内存,或释放仍在使用中的内存,或释放一个无效的指针。
相关文章推荐
- python requests sslv3 alert handshake failure
- 用实例分析H264 RTP payload(RTSP参数分析)
- 【bzoj1603】【 Usaco2008 Oct】打谷机 (阅读理解) 题解&代码
- GitBook的安装与使用
- 详解Java中的对象克隆
- Java 如何有效地避免内存溢出:善于利用软引用和弱引用
- Eclipse 文档注释,属性或者方法的文档注释
- Thinkphp显示系统常量信息的方法(php的用法)
- 关于Java的字符串
- php调试
- 在ASP.NET 2.0中操作数据之五十:为GridView控件添加Checkbox
- eclipse中使用maven库添加jar包时,出现jar包冲突的解决方案
- C# Windows API
- Python点滴(四)—pandas快速入门使用
- thinkPHP简单遍历数组方法分析
- 初识php
- .Net中导出数据到Excel(asp.net和winform程序中)
- python脚本网页点击抢购京东乐视2(现在好像不用抢购了)
- Ruby 元编程 第二版随笔(二)
- Swing【java】