linux 32 bit 的操作系统进程的地址空间是3+1模式,3G是用户地址空间,1G是内核地址空间。
内核的虚拟地址空间又分为直接映射区、动态内存映射区、永久内存区、固定内存映射区。
其中直接映射区是指16~896M的那一段,动态内存映射区也就是高端内存区。
1G的内核虚拟地址空间,好像是说linux内核地址空间只能最大访问1G的物理内存,但是高端内存区可以映射的物理内存可以是所有的物理内存。
linux中的mmap的方式,实际上它的地址空间是需要占用虚拟地址空间的
linux所有的物理内存都是通过系统的页表来管理的,在系统初始化的时候,就已经建立了页表
linux 64bit的操作系统用户进程的地址空间和内核地址空间都是128T
linux在进行用户态和内核态切换时,将进程的pgd放入CR3寄存器
过去看linux内核中有关内存子系统时,总感觉有些枯燥,不是那种看得见和摸得着的东西
但现在发现可以通过proc文件系统可以来体会内存子系统中的一些概念
proc文件系统的/proc/sys/vm下一些变量可以对应到linux内存子系统中的概念
(1)dirty_ratio、dirty_background_ratio、dirty_writeback_centisecs、dirty_expire_centisecs
当文件系统中缓存的脏页数据量达到dirty_background_ratio时,就会触发pdflush内核线程来刷新数据到外存,这个值默认是10%
此时这个刷新到外存并不会阻塞应用进程的写IO,一旦这个数量到达了ditry_ratio,这个刷新的过程就会阻塞应用进程的IO,这个值默认是40%,小于该值,则相应的刷新调用会立刻返回,不会阻塞。
直到脏页低于dirty_ratio。
dirty_writeback_centisecs和dirty_expire_centisecs控制的是这个pdflush的工作频率
后者表示定时器的超时时间,这个主要是内核用来显式地刷新脏了很久的页的超时时间
前者就是在超时之后,再过dirty_writeback_centisecs执行相关的刷新
(2)dirty_caches、lowmem_reserve_ratio
由于文件系统总是将一些页、inode信息、dentry缓存起来
dirty_caches是控制缓存清理的级别,哪些保留,哪些清理
lowmem_reserve_ration主要控制的是预留多少的空闲内存
(3)overcommit_memory
这个主要控制内存的申请
阅读(882) | 评论(0) | 转发(0) |