摘要:一、内存共享共享内存是linux下父子进程除了文件描述符之外的另一个更加具有亲缘性的共享机制了。和文件描述符共享不同,这种内存的共享它的共享性更强,因为内存的范围很大,共享的粒度可以精确到不同的数据结构。这个说法可能有些危言耸听,而且大家会觉得这个不是事实。老实说,它的确只是部分事实。在unix类系
阅读全文
摘要:一、问题 对于mmap将内容映射到地址空间,从而让应用程序可以像操作内存一样来操作文件内容,这是操作系统为用户态程序提供的一个便利,它的确可以将繁琐的文件操作转换为码农喜闻乐见的内存操作,更重要的是它可以将文件内容的读写达到按需加载,只有在真正使用到文件内容的时候才会触发文件内容的读取,当然写回也是
阅读全文
摘要:一、现象及问题 在两台同样环境上同样部署的进程,通过top工具查看两个进程的内存使用情况,可以看到的是,两个进程占用的虚拟地址空间大小相同,但是占用物理页面进程差别极大,可以认为不是一个数量级上的。通过free工具看到系统中可用内存比较少,但是buffers和caches的数量都非常大。按照常规理解
阅读全文
摘要:基于2.6.32内核 一、现象 在x86_64的64位操作系统环境下,一个程序执行coredump,从coredump文件可以看到,导致coredump的问题是由于执行new操作时分配内存失败导致的。这个问题看起来让人有些莫名惊诧,用掉64bit下的所有虚拟地址空间,这是什么概念(这个惊诧可以用莱芜
阅读全文
摘要:一、用户态地址分配主要路径 用户态所有地址空间的申请主要经过mmap系统调用,也有一些是基于brk系统调用,对于mmap系统调用,它在某些条件下会执行申请空间合理性的判断,而brk则是一定进行合理性判断,下面是mmap相关的一些代码do_mmap_pgoff,它主要就是在于如果新分配的空间是私有可写
阅读全文
摘要:一、文件映射和匿名页面相比,文件映射算是比较幸福的一种映射方式了,它可以依靠每个文件都有的address_space结构来引伸出自己需要的信息,例如,所有映射了这个页面的page可以指向文件对应的inode的address_space结构。在vma侧,它们可以在address_space中建立一个自
阅读全文
摘要:一、基础数据结构及面临的问题页面结构struct page对于反向映射的实现使用了两个成员:一个是表示映射挂靠位置的内核级唯一结构。对于匿名映射来说,这个结构为一个全局的anon_vma结构;对于文件映射结构来说,这个指针指向的是一个表示地址空间的address_space结构,这个结构也就是我们通
阅读全文
摘要:一、共享内存及传统sys v IPC机制这个机制在SYS V系统中最早引入,是为了提高进程间通讯效率的一种新的机制,不同的进程可以通过不同的逻辑地址来操作相同的物理地址,这样相当于在地址空间隔离的基础上大家建立DMZ(非军事化区),不同的进程在这里毫不戒备,大家坦诚交流,直接操作内存,这样一个进程的
阅读全文
摘要:一、如何看到sysV IPC shm文件名1、file_system_type.get_sb修改正如上篇所说,在用户态无法看到可shm文件的名称,不同的挂载点使用不同的dentry,而对于tmpfs文件,它的readdir的系统实现就是通过dcache_readdir函数来实现的,但是这个dentr
阅读全文
摘要:一、块读取和文件读取在前一篇文章的最后,说明了通过/dev/hda1直接访问块设备使用的缓冲区和通过/path/to/file/in/block访问文件并不共享页面缓冲,假设两者中通过一种途径修改了这个设备某个块的内容,然后另一方使用的还是自己缓冲的、未更新的页面内容,此时就会出现不一致。当然这个东
阅读全文
摘要:一、匿名页面这些内存页面保存了一些通常所说的机动性最强的内容,或者可以认为是银行的活期存款,这些内存可以随时被使用,随时被归还。例如用户通过malloc-->>mmap申请的内存,或者通过brk/sbrk扩大的堆空间。相对于mmap文件、文件系统元数据之类的内容,这些空间对用户来说最为顺手,也最为常
阅读全文
摘要:一、块设备这里从文件和页面管理的角度来看块设备。在Linux系统下,根据“一切皆文件”的思想,可以把一个磁盘当做一个文件来读取。为了看一个磁盘,例如第一块硬盘,可以通过hexdump这种通用的工具来显示一个硬盘的原始数据(没有验证是否需要root权限),例如对于一个文件系统来说[root@Harry
阅读全文