Linux direct io使用
在linux 2.6内核上使用direct... [阅读更多]
在linux 2.6内核上使用direct... [阅读更多]
应用程序与物理内存本没有直接关系,因为应用程序看到的都是虚拟内存,至于这块虚拟内存到底映射哪块物理内存,应用程序并不关心,也没有能力关心。不过既然文章标题叫做“应用程序与物理内存之间的关系”就说明应用程序与物理内存之间虽然没有直接关系,但有间接关系;我们知道应用程序能够在运行时主动申请、释放的内存主要有Heap(malloc/free/…)、Mapping(mmap/munmap/…),这里就以Heap为例(因为前面曾详细分析过应用程序里的堆内存管理),看它们之间有如何微妙的间接关系。 当应用程序malloc一块内存时,如果应用程序自己管理的堆内存还有缓冲(这个不难理解,对于应用程序的内存申请,内核都比较大方,即使应用程序只申请4字节的内存,内核也会给它4KB,假设内存页大小为4KB),那么就直接使用了,无需再向内核讨要;否则的话,只有调用sbrk()或mmap()向内核讨要新的内存了,dlmalloc解析连载完整word文档里已经描述过,应用程序优先调用sbrk()以扩展当前Heap的连续空间,如果无法扩展(比如此时,前面待延伸的内存地址空间恰好被某个文件映射占用了),那就只有mmap()申请另外的一段地址空间。 以sbrk()为例,syscall到内核里对应的是do_brk()函数,带有两个参数,第一个为内存地址addr,第二个为增减的长度len,可正(比如:malloc)可负(比如:free),这个函数所做的工作只有一个,那就是根据进程请求情况进行判断并调整进程的vma(或增大或减小或拆分或合并等)并返回给进程对应的地址空间,当然这是成功的情况,如果vma判断调整失败,那就直接返回ENOMEM或其它错误码。 既然应用程序进行内存申请时没和物理内存扯上关系,那么当应用程序实际进行内存访问时,总该和物理内存扯上关系了吧?的确也是如此。当应用程序访问(读写)一个并没有对应物理地址的逻辑地址时,CPU就会产生一个中断号为14的中断,该中断将被内核捕获。查看源码的话,在这里: /*... [阅读更多]
在很久很久以前,我曾详细的分析过应用程序里的内存管理,也就是应用程序里的内存分配与释放过程,具体可以参考:dlmalloc解析连载完整word文档,这是站在应用程序角度来看的内存管理视图,更具体点说只是应用程序对自己所用到的堆空间内存的管理视图。 在不久之前,我又提到过Linux... [阅读更多]
就Linux应用程序而言,使用的都是虚拟地址,当应用程序读写一个指定的虚拟地址时,内存管理单元会自动进行虚拟地址到物理地址的转换。一个虚拟地址可以映射到多个物理地址,但当前映射到哪一个物理地址取决于当前的页表(Page... [阅读更多]
关于Linux Slab的简单介绍就是一种对相同大小内存对象的分配与释放的优化管理机制。下面主要介绍如何查看Linux系统上Slab... [阅读更多]
随着硬件的快速发展,大多数操作系统都已经在使用64位系统,对于Linux下X86-64的进程内存空间布局并没有Google到很好的资料,而对于32位系统倒有不少描述得非常清晰的文档,比如:【图解】Linux下C程序进程地址空间布局,linux... [阅读更多]
众所周知,踩内存是一个非常麻烦的问题,不管是在应用层或是内核层,关于踩内存的检测也有各种各样的工具,比如应用层的优秀开源valgrind,内核内置的kmemcheck等。关于这些工具的具体信息就不在这里做进一步描述了,本文主要简单介绍一下几种踩内存工具的工作原理。 一种最为简单的踩内存工具为通过给分配的内存前后多加上一小块内存,用于存放我们预先设定的值,比如Crc和Magic: 不管是应用程序(App)或是内核模块(Module),它们分配内存都是利用我们重载过的接口(malloc或kmalloc或new或其它等),这些接口分配比实际请求要大一点的内存,以便在前和后能空留出一个或几个字节存放检测值(也就是前面提到的Crc和Magic)。Magic可以是我们预先指定的特定值,比如0xC0,而Crc可以是某些条件(比如当前请求内存分配的进程的id、名、代码行等)的crc值。应用程序或是内核模块释放内存同样也是利用我们重载过的接口(free或kfree或delete或其它等),在这些接口里就可以做踩内存检测,如果发现Magic不再是我们预先指定的特定值,比如0xC0,则表示该块内存被踩了,而Crc呢?虽然没有固定的值,但也可以通过做同样的计算后做对比检测,或者我们还可以提前在分配内存时把这些值记录下来,比如可以设置一个hash表,把App... [阅读更多]
影响内存访问速度的因素主要有: 1.内存带宽:每秒读写内存的数据量,由硬件配置决定。 2.CACHE高速缓冲:CPU与内存之间的缓冲器,当命中率比较高时能大大提供内存平均访问速度。 3.TLB转换旁视缓冲:系统虚拟地址向物理地址转换的高速查表机制,转换速度比普通转换机制要快。 我们能够优化的只有第2点和第3点。由于CACHE的小容量与SMP的同步竞争,如何最大限度的利用高速缓冲就是我们的明确优化突破口(以常用的数据结构体为例): 1.压缩结构体大小:针对CACHE的小容量。 2.对结构体进行对齐:针对内存地址读写特性与SMP上CACHE的同步竞争。 3.申请地址连续的内存空间:针对TLB的小容量和CACHE命中。 4.其它优化:综合考虑多种因素 具体优化方法 1.压缩结构体大小 系统CACHE是有限的,并且容量很小,充分压缩结构体大小,使得CACHE能缓存更多的被访问数据,无非是提高内存平均访问速度的有效方法之一。 压缩结构体大小除了需要我们对应用逻辑做好更合理的设计,尽量去除不必要的字段,还有一些额外针对结构体本身的压缩方法。 1.1.对结构体字段进行合理的排列 由于结构体自身对齐的特性,具有同样字段的结构体,不同的字段排列顺序会产生不同大小的结构体。 大小:12字节 struct... [阅读更多]
把cu个人博客的这篇文章转载过来,呵呵。 目 录 1. 本文档介绍 2.边界标记法 3. 分箱式内存管理 4. 核心结构体malloc_state 5. 内存分配相关函数 5.1 函数dlmalloc 5.2 函数tmalloc_small 5.3... [阅读更多]