在操作系统中,文件数据是存储在磁盘上的,而每次应用程序想要读取数据的时候,如果都和磁盘进行交互,速度会非常慢,不仅是读请求会慢,写操作也是一样的,向磁盘中直接写入数据也需要很大的时延。
为了提升磁盘的读写效率,操作系统在磁盘之上,通过了一个page cache(页缓存),页缓存其实是内存的一种,他就是可以将数据缓存到内存中,从而减少对磁盘的实际读写操作。
通过在内存中缓存数据,操作系统可以更快速地响应文件操作请求,因为访问内存的速度比访问磁盘快得多。
页缓存中的“页”(page)是指计算机内存管理中的基本单位。在大多数操作系统中,内存被分成固定大小的块,这些块通常称为“页”。页的大小通常是2的幂,例如4 KB或8 KB。
有了page cache之后,一次读操作的过程如下:
这里面读取到数据大小并不是用多少取多少,而是采用预读**的方式,额外读取一些数据,预读的大小一般都是以页为单位的。如果请求读取的数据量小于一页(通常4k),操作系统通常仍会读取完整的一页。
如果应用程序请求的数据量大于一页,操作系统可能会一次性读取多个连续的页,以减少后续的磁盘I/O操作。
有了page cache之后,一次写操作的过程如下:
当向文件中写入数据时,,然后从文件中读取数据到页缓存,并且把新数据写入到页缓存中。对于被修改的页缓存,内核会定时把这些页缓存刷新到文件中。
脏页写入磁盘的触发条件一般有以下几个:
1、页缓存的大小达到一定阈值时,操作系统会触发写入操作,将部分或全部脏页写入磁盘。
*
*2、系统内存压力增大时,操作系统也可能会主动将脏页写入磁盘,以释放内存空间。
*
*3、文件系统的同步操作(如fsync、sync命令)会强制将所有脏页写入磁盘,以确保数据持久化。
操作系统将脏页中的数据写入磁盘也不是一条一条写入的,通常是按页或多个页的块进行整体写入。写入完成后,这些页会被标记为“干净页”(clean pages),表示数据已经同步到磁盘。
page cache 的优点非常明显,也很容易理解:
提高性能:按照页去读取和写入磁盘,操作减少了对磁盘的频繁I/O操作,提高文件读取和写入的速度。
减少磁盘损耗:磁盘I/O次数少了,还能有助于延长磁盘的使用寿命。
然而,page cache 也有一些潜在的缺点:
1、内存占用:缓存数据需要占用内存资源,如果系统内存有限,可能会影响其他应用程序的性能。
2、数据丢失风险:由于数据在写入磁盘前暂时存储在内存中,如果系统在数据同步到磁盘前崩溃,未写入的数据可能会丢失。