page cache在linuxvfs 中是比较重要的一层,其功能就不详细介绍了。主要介绍了几个关键性函数,容易帮助了解page cache里的整体逻辑和流程
先看一下page 的结构体
page_cache_get() 主要是调用函数get_page
主要page里的计数器+1,表示page引用的reference 次数
page_cache_release() 的核心函数 put_page_testzero
显然是page的计数器-1, page的引用被释放
page 的flags 参数, 在page 的结构体里定义了flags参数,用bit位来标识page的状态,定义在page-flags.h文件里
这是在32位机 和 64位 系统的关于flags 定义
32 bit -------------------------------| FIELDS | FLAGS |
64 bit | FIELDS | ?????? FLAGS |
63 32 0
从bit0-bit19是常用的,其他位保留给了mapping zone, node and SPARSEMEM
SetPageUptodate 原子设置bit PG_uptodate 状态为1,表示改页被更新
#define SetPageUptodate(page)set_bit(PG_uptodate, &(page)->flags)
ClearPageUptodate 原子设置bit PG_uptodate 状态为0,表示页没有被更新
#define ClearPageUptodate(page)clear_bit(PG_uptodate, &(page)->flags)
TestSetPageLocked 设置原子设置page locked状态,并返回改变前的原来状态
__lock_page 函数
将当前进程设置成Task_uninterruptible状态,并将进程挂载到 wait对队列中,如果PG_Locked的状态为1时,触发sync_page的方法,只有在sync_page方法中才会调用schedule()调度当前进程,直到PG_locked的状态为0,注意当执行完__wait_on_bit_lock 的时候PG_locked仍然是1,因为__wait_on_bit_lock是用test_and_set_bit来进行while条件判断的,最后将进程设置成TASK_RUNNING 状态,把该进程从wait
队列中移除。
unlock_page 函数
设置PG_Locked 的状态是0,遍历等待队列,执行唤醒函数
其中func的定义是
在autoremove_wake_function里,调用sched.c 的default_wake_function -> try_to_wake_up
将等待队列里的线程状态置为 TASK_RUNNING 并放置到运行队列中去
分享到:
相关推荐
至于`linux-ftools`这个压缩包,它可能包含了一些用于Linux系统分析和维护的工具。这些工具可能涵盖了内存分析、文件系统检查、性能监控等方面,可以帮助用户更深入地理解并优化Linux系统的内存使用。使用这些工具前...
### Linux 0.11 源码分析 #### 前言 Linux 0.11 是一个早期版本的 Linux 内核,发布于 1991 年末。这一版本对于想要深入了解 Linux 内核工作原理的学习者来说非常有价值。本文将对 Linux 0.11 的源代码进行深入分析...
Linux系统中的Cache机制主要是为了提高文件读写的效率而设计的。在Linux中,Cache主要以页面Cache...而理解Linux内核的Cache机制和相关函数,对于深入理解Linux内核的文件系统、内存管理以及提高系统性能都有重要意义。
`ftools`可能是一个自定义或第三方开发的工具集合,专门针对Linux系统设计,用于管理和分析系统的缓存数据。在编译安装`ftools`之前,通常需要先安装`GCC`(GNU Compiler Collection),因为`GCC`是Linux下广泛使用...
RSS+PageTable+SlabInfo+HugeMem+Cache = 2800MB PSS+PageTable+SlabInfo+HugeMem = 2496MB PSS+PageTable+SlabInfo+HugeMem+Cache = 2607MB 通过linux脚本计算系统的各项内存占用总数,包括: RSS、PSS、Page...
例如,mmap()函数用于创建进程地址空间与文件的映射,read()和write()用于常规的文件读写,get_page()和put_page()用于Page Cache的分配和释放。通过这些API,应用程序可以有效地利用Cache机制,提高其执行效率。 ...
Linux内核内存Cache机制是操作系统优化性能的关键组成部分,它...通过深入源码分析,可以更详细地了解Cache的工作原理,例如如何实现LRU更新、如何触发页面的淘汰等。对于Linux内核的学习者来说,这是一项重要的技能。
`laravel-page-cache` 是一个专门为Laravel应用程序设计的扩展,旨在优化网站速度,通过预先渲染整个页面并存储其内容来减少数据库查询和视图渲染的时间。下面将详细探讨这个话题。 ### Laravel页面缓存简介 ...
### Linux 0.11 内核源码分析 #### 概述 《[Linux的内核及其内核源码分析] Linux 0.11》是一本介绍Linux早期版本内核实现细节的经典著作,适合Linux内核学习的初学者。本书通过详细剖析Linux 0.11 版本的内核源码...
通过分析这个源码,我们可以深入理解Linux内核中的文件处理机制。 首先,Linux内核中的`file`结构体是文件操作的核心,它包含了与文件相关的一系列信息,如文件描述符、文件状态标志、文件位置指针、打开文件的函数...
在Linux内核中,缓存分为多种类型,如页缓存(Page Cache)、dentry缓存和inode缓存等。它们共同构成了Linux内核的内存管理系统,帮助减少磁盘I/O,提高系统响应速度。 二、页缓存(Page Cache) 页缓存是Linux内核...
为了解决这个问题,"Full Page Cache"(FPC)插件应运而生,它是Magento性能优化的重要工具之一。 Full Page Cache 插件的核心功能是通过缓存整个页面来显著提高网站的加载速度。在传统的Web应用中,每次用户请求...
实验环境 CentOS Linux release 7.3.1611 (Core) 3.10.0-514.6.1.el7.x86_64 一、概念介绍 linux系统中通常使用free命令来查看内存使用情况,free命令主要是从/proc/meminfo文件中读取的内存数据然后进行简单...
为了提升文件系统访问速度,Linux内核会利用空闲内存来缓存文件数据(称为Page Cache)和其他类型的缓存(如Buffer Cache)。这样做的目的是减少磁盘I/O操作,从而提高系统性能。 然而,在某些情况下,用户可能会...
### Linux操作系统中内存buffer和cache的区别 #### 一、引言 在Linux操作系统中,内存管理是一项关键的技术,它直接影响到系统的性能和稳定性。本文将详细介绍Linux系统中内存buffer和cache的区别及其工作原理,...
Linux 的整体系统架构如图 1 所示,其中页缓存(Page Cache)位于文件系统(FS)与块设备层之间。更准确地说,它位于虚拟文件系统(VFS)和实际文件系统(如 ext3 或 xfs)之间。此外,I/O 调度器则位于块设备层之下...
通过分析和学习Linux 0.11的源码,开发者可以深入了解操作系统的基本构造和工作原理,如内存管理、进程调度、中断处理、文件系统和网络通信等。这对于提升系统编程能力、理解操作系统底层机制以及开发自己的操作系统...
《Linux内核函数详解》是针对Linux内核中核心功能函数的一次深入解析,涵盖了大量与文件系统、内存管理和页缓存等相关的重要概念和技术。这个资料集合为理解Linux内核的工作原理提供了极大的帮助,具有很高的参考...
在cachefiles源码中,我们可以看到以下关键结构和函数: - `cache_file`:表示一个缓存文件对象,包含文件的元数据和缓存状态。 - `cache_operation`:定义了缓存操作的接口,如读、写、删除等。 - `cache_set`:...