01.Linux核心概念
Linux内核学习资料:https://github.com/0voice/linux_kernel_wiki
品读 Linux 0.11 核心代码 :https://github.com/sunym1993/flash-linux0.11-talk
# 01.什么是CPU缓存
# 1.1 CPU缓存的来历
- 众所周知,CPU是计算机的大脑,它负责执行程序的指令,而内存负责存数据, 包括程序自身的数据。
- 在很多年前,CPU的频率与内存总线的频率在同一层面上,内存的访问速度仅比寄存器慢一些。
- 上世纪90年代被打破了,CPU的频率大大提升,但内存总线的频率与内存芯片的性能却没有得到成比例的提升。
- 所以,为了解决CPU运算速度与内存读写速度不匹配的矛盾,就出现了CPU缓存。
# 1.2 CPU缓存的概念
CPU缓存是位于CPU与内存之间的临时数据交换器,它的容量比内存小的多但是交换速度却比内存要快得多。
CPU缓存一般直接跟CPU芯片集成或位于主板总线互连的独立芯片上。
为了简化与内存之间的通信,高速缓存控制器是针对数据块,而不是字节进行操作的。
高速缓存其实就是一组称之为缓存行(Cache Line)的固定大小的数据块组成的,典型的一行是64字节。
# 1.3 CPU缓存的意义
- CPU往往需要重复处理相同的数据、重复执行相同的指令
- 如果这部分数据、指令CPU能在CPU缓存中找到,CPU就不需要从内存或硬盘中再读取数据、指令,从而减少了整机的响应时间
- 所以,缓存的意义满足以下两种局部性原理:
- 时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。
- 空间局部性(Spatial Locality):如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。
# 02.mmap内存映射
# 2.1 系统常规读写文件
1)常规程序读取文件过程
- 进程调用库函数向内核发起读文件请求,调用系统open()和read()方法
- read()函数根据传入的文件路径,在目录项模块中检索,找到该文件的inode;
- 通过inode找到文件对应的address_space,在address_space中访问该文件的页缓存树
- 1)如果页缓存命中,那么直接返回文件内容
- 2)如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页
- 3)同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页
2)常规写入文件过程
- 和读文件一致,在address_space中查询对应页的页缓存是否存在
- 如果页缓存命中,直接把文件内容修改更新在页缓存的页中,写文件就结束了
- 这时候文件修改位于页缓存,并没有写回到磁盘文件中去
- 如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页
- 同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页
- 一个页缓存中的页如果被修改,那么会被标记成脏页,有两种方式可以把脏页写回磁盘
- 1)手动调用sync()或者fsync()系统调用把脏页写回
- 2)pdflush进程会定时把脏页写回到磁盘
注:可以体会到,常规I/O读写文件比人会耗时,所以向kafka等对读写性能要求高的,必然需要其他方案
# 2.2 mmap基础概念
- mmap是一种内存映射文件的方法,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。
- 实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存。
- 而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。
- 相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。
mmap就是将文件映射到内存上,进程直接对内存进行读写,然后就会反映到磁盘上。
# 2.3 mmap和常规文件操作的区别
常规文件操作:
1)磁盘 —> 2)页缓存 —> 3)用户主存
两次数据拷贝mmap操作:
1)磁盘 —> )用户主存
一次数据拷贝
注:mmap实质是用户空间和内核空间的数据直接交互,省去了空间不同数据不通的繁琐过程,因此mmap效率更高
# 2.4 mmap优点总结
- 1、
对文件的读取操作跨过了页缓存
,减少了数据的拷贝次数,用内存读写取代I/O读写,提高了文件读取效率 - 2、实现了用户空间和内核空间的高效交互方式,两空间的各自修改操作可以直接反映在映射的区域内
- 3、提供进程间共享内存通信的方式,通过各自对映射区域的改动,达到进程间通信和进程间共享的目的。
# 03.系统缓存
- file cached表示系统的缓存内存大小,
- 当用户需要读取文件中的数据时,操作系统会先分配内存,然后将数据从存储器读入到内存中,最后将内存中的数据分发给用户;
- 当用户需要往文件中写数据时,操作系统会先分配内存接收用户的数据,然后再将数据从内存写到磁盘中
- 而Linux cache机制就是对这些由操作系统内核分配,并用来
存储文件数据的内存进行管理
- 如果系统内存充足,缓存在内存中的文件数据是可以在内存中长时间驻留的
- 如果有其他的进程访问这部分的数据,就不需要访问磁盘
- 所以在内存充足的情况下,系统的cache大小是会越来越大的;
- 当系统的内存不足,Linux内存回收机制就会把cache的内存进行回收,以缓解内存压力
上次更新: 2024/3/13 15:35:10