Linux 文件系统 IO (二)

一、磁盘的数据怎么写入Page Cache?

答案是通过缺页中断的方式写入。

缺页中断:缺页中断是当 CPU 访问虚拟地址时,发现对应的页面未加载到物理内存而引发的硬件异常。这一机制依赖 ** 页表(Page Table)** 实现虚拟地址到物理地址的映射。当页表中目标页面的有效位(Present Bit)为 0 时,硬件会触发缺页中断,将控制权转交给操作系统处理。

1、缺页中断的作用

  • 页面调入内存:当应用程序访问的页面不在内存中时,缺页中断会触发操作系统将缺失的页面从磁盘加载到内存中。这样做的好处是,不需要将整个文件或数据集一次性全部加载到内存中,而是按需加载,只加载应用程序实际需要的页面。这样可以节省磁盘I/O开销,避免了无谓的磁盘读取操作,提高了系统的性能。
  • 页面替换策略:当内存中的页面已满时,如果应用程序访问一个新的页面,操作系统需要选择一个页面进行替换,将其换出到磁盘上,为新的页面腾出空间。缺页中断提供了一个时机,让操作系统可以根据页面替换算法选择合适的页面进行替换,以保证内存中的页面是最有用的页面,提高内存的利用率。
  • 延迟写策略:在写回策略下,当应用程序对一个脏页进行写操作时,脏页的写回操作不会立即进行,而是推迟到后续的某个时刻进行。这样可以将多次写操作合并为一次写操作,减少了磁盘写入的次数,降低了磁盘I/O开销。
  • 页面预读取:为了进一步减少磁盘I/O开销,操作系统可以利用缺页中断的时机进行页面预读取。当应用程序访问一个页面时,操作系统可以预先加载一些相邻的页面到内存中,以提前满足应用程序的访问需求。这样可以减少后续的缺页中断和磁盘读取操作,提高了系统的响应速度。
  • 权限检查和处理:缺页中断还可以用于检查应用程序对页面的访问权限。操作系统可以根据页面的访问权限(例如只读、读写等)来判断应用程序的访问是否合法,并根据需要进行相应的处理。

2、缺页中断的处理流程

中断处理程序:当发生缺页中断时,CPU会暂停当前应用程序的执行,并跳转到操作系统的中断处理程序。这个中断处理程序负责处理缺页中断。
中断处理程序的执行:中断处理程序会首先保存当前应用程序的上下文信息,包括寄存器的值和程序计数器等。然后,它会根据缺页中断的原因进行相应的处理。
页面调入内存:如果缺页中断是由于应用程序访问的页面不在内存中引起的,操作系统会触发页面调入内存的过程。它会根据页面表中的信息,确定需要调入的页面的位置和大小,并从磁盘上读取相应的页面数据。
磁盘I/O操作:在页面调入内存的过程中,操作系统会进行磁盘I/O操作,将需要的页面数据从磁盘读取到内存中。这包括了磁盘寻道、读取数据和数据传输等操作。
更新页表:当页面数据成功加载到内存中后,操作系统会更新页表,将该页面的状态设置为已加载,并将页面的物理地址映射到对应的虚拟地址。
恢复上下文和重新执行应用程序:当页面调入内存完成后,中断处理程序会恢复之前保存的应用程序的上下文信息,并将控制权返回给应用程序。应用程序会继续执行之前被中断的指令,但这次访问的页面已经在内存中了,不会再触发缺页中断。

二、Page Cache的工作原理

1、当应用程序打开一个文件并读取其中的数据时,操作系统会将文件的内容读取到内存中,并将其缓存为一个或多个页(通常是4KB大小的页)。
2、这些缓存的页被存储在一个被称为Page Cache的内存区域中,它是内核管理的一部分。
3、当应用程序再次访问相同的文件时,操作系统首先检查Page Cache中是否存在这些页的副本。如果存在,操作系统会直接从Page Cache中返回数据,而不需要再次访问磁盘。
4、如果应用程序对文件进行写操作,数据会被写入到Page Cache中的脏页(dirty page)。脏页表示该页的内容已经被修改,但还没有写回到磁盘。
5、当系统内存压力较大或需要释放内存时,内核会触发缓存刷新(cache flushing)操作,将脏页从Page Cache写回到磁盘中。
6、回写策略是为了确保缓存数据的一致性和避免数据丢失而设计的。当Page被标记为dirty时,表示该Page中的数据已经被修改过,这些数据需要被写回到磁盘上的,Linux提供了以下两种回写策略:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值