logo头像

野渡's小小知识乐园

第9章 虚拟内存之C程序中常见的内存相关错误

第9章 虚拟内存之C程序中常见的内存相关错误

对C/C++程序员来说,管理和使用虚拟存储器可能是个困难的, 容易出错的任务。与存储器有关的错误属于那些令人惊恐的错误, 因为它们在时间和空间上, 经常是在距错误源一段距离之后才表现出来。 将错误的数据写到错误的位置, 你的程序可能在最终失败之前运行了好几个小时,且使程序中止的位置距离错误的位置已经很远啦。而避免这种噩梦的最好方法就是防范于未然。 本节主要介绍《深入理解计算机系统》中介绍的 C程序中常见的内存操作有关的10种典型编程错误, 以便以后随时查看,复习。…

第9章 虚拟内存之动态内存分配与垃圾收集

第9章 虚拟内存之动态内存分配与垃圾收集

虽然可以mmap和munmap函数来创建和删除虚拟内存的区域,但是C程序员还是会觉得当需要额外的虚拟内存时,用动态内存分配器更方便,也有更好的可移植性。 动态内存分配器维护着一个进程的虚拟内存区域,称为堆。对于每个进程,内核维护着一个变量brk,它指向堆的顶部。分配器将堆视为一组不同大小的块的集合来维护。每个块就是一个连续的虚拟内存片,要么是已分配的,要么是空闲的。已分配的块显式地保留为供应用程序使用,空闲块保持空闲,直到它显式地被应用所分配。一个已分配的块保持已分配状态,直到它被释放,这种释放要么是应用程序显式执行的,要么是内存分配器自身隐式执行的。 分配器有两种基本风格,显式分配器要求应用显式释放分配的块,而隐式分配器(也叫做垃圾收集器)则要求分配器检查不再使用的块并释放。本文将对显示分配器和隐式分配器做更深入的讨论。…

第9章 虚拟内存之Linux内存系统

第9章 虚拟内存之Linux内存系统

本节按照书籍实例,用一个实际系统的案例研究来总结虚拟内存的讨论,这是一个运行于Linux的Inter Core i7。需要注意的是,虽然我们说64位系统,而且处理器体系也允许64位的虚拟地址空间,但是实际上,Core i7现在只是支持48位(256TB)虚拟地址空间和52位(4PB)物理地址空间,兼容支持32位(4GB)地址空间。…

第9章 虚拟内存

第9章 虚拟内存

为了更有效地管理内存并且少出错,现代系统提供了一种对主存的抽象概念,叫做虚拟内存(VM)。虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的俺没交互,它为每个进程提供了一个大的、一致的和私有的地址空间。通过一个很清晰的机制,虚拟地址内存提供了三个重要的能力: 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。 它为每个进程提供了一致的地址空间,从而简化了内存管理。 它保护了每个进程的地址空间不被其他进程破坏。 …