1.Cache 和 Buffer的区别
buffer缓冲 cache是缓存。
写缓冲,读缓存。
简单点说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
linux有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过sync命令手动清空缓冲。
缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。
其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
2.虚拟内存文件映射mmap
mmap概念
mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。
硬盘上文件的位置与进程逻辑地址空间 中一块大小相同的区域之间的一一对应,
用程序通过read,write,ioctl来访问硬件设备,它们都要经过两次的数据拷贝,(硬盘->内核->用户)
一次是用户空间和内核空间的数据拷贝,另外一次是内核空间和硬件之间的数据拷贝,
目的:
将硬件物理地址映射到用户虚拟地址空间,由2次数据拷贝变成1次数据拷贝!
特点:
实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,
即完成了对文件的操作而不必再调用read,write等系统调用函数。
相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。
原理
mmap内存映射的实现过程,总的来说可以分为三个阶段:
- 应用进程启动映射,在进程的虚拟地址空间中,寻找一段空闲的满足要求的连续的虚拟地址作为映射区域;
- 调用系统函数mmap,实现文件物理地址和进程虚拟地址的一一映射;
- 应用进程对映射区域访问,引发缺页异常,实现文件内容到物理内存(主存)的拷贝;
共享内存的使用实现原理
两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间
1、共享内存允许两个或更多进程共享一个给定的存储区,因为数据不需要再客户进程和服务进程之间复制。所以这是最快的一种ipc。
2、使用共享内存时需要注意:多个进程对共享内存的同步访问。
3、通常用信号量实现对共享内存的同步访问。
享内存段被映射进进程空间之后,存在于进程空间的什么位置?共享内存段最大限制是多少?
Linux进程地址空间 && 进程内存布局: 存在于 mmap区 (堆栈之间)
查看最大限制
$ sysctl kern.ipc.shmmax
$ cat /proc/sys/kernel/shmmax
在/proc/sys/kernel/目录下,记录着系统V共享内存的一下限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,