Linux内存知识:
内存和进程的关系:
创建进程时,系统会为每个进程分配一个4G大小的虚拟地址空间,且每个进程都有3G的用户空间和1G的内核空间
1.32位操作系统中表示一个地址需要32bit,因此最大可表示的地址数量为pow(2,32)
2.在同一时刻,一个cpu中只有一个进程在运行,cpu只能看见正在运行的进程对应的4G虚拟地址空间,进程间的切换会导致正在使用的虚拟地址的切换
3.3G用户空间的私有的,1G的内核空间是共有的,且内核空间与物理内存空间的映射是位移映射,直接是虚拟地址-3G(可以这么做是因为映射到物理内存却总是从最低地址0x00000000开始,这也解释了“1G的内核空间是共有的”),用户空间与物理内存空间的映射方式是分页或者分段的。
4.由于内存分页,操作系统去获取数据的时候一般是按照一页一页的去获取。面向内存友好的代码是可以充分利用这一机制来提高效率的,比如遍历二维数组时的方式
日常io操作所触发的流程
当我们在应用程序中调用read等操作时,首先到达VFS虚拟文件系统(这个是具体文件系统的接口层,为了屏蔽不同文件系统的差别),如果在此时命中了文件cache,则会直接获取到数据,否则会去请求磁盘io,读取磁盘的数据到内存(这一步效率和硬件效率有很大的关系),再将数据拷贝到用户空间,这里可以使用mmap来进行io操作,没有缓存的情况下只需要一次数据拷贝
文件cache的说明:
在 Linux 的实现中,文件 Cache 分为两个层面,一是 Page Cache,另一个 Buffer Cache,每一个 Page Cache 包含若干 Buffer Cache。内存管理系统和 VFS 只与 Page Cache 交互,内存管理系统负责维护每项 Page Cache 的分配和回收,同时在使用 memory map 方式访问时负责建立映射;VFS 负责 Page Cache 与用户空间的数据交换。而具体文件系统则一般只与 Buffer Cache 交互,它们负责在外围存储设备和 Buffer Cache 之间交换数据。
参考文章:
Linux中虚拟地址
Linux内存分页
磁盘io那些事(美团)
Linux内存
Linux内核的文件cache管理机制
网友评论