pdflush进程详解

pdflush进程是Linux系统中负责脏页回写的重要组件,它通过定时机制、内存不足时的响应、脏页比例超过阈值以及用户调用sync系统调用来管理磁盘写入。系统管理员可以通过调整/proc/sys/vm的相关参数,如dirty_ratio和dirty_writeback_centisecs,来控制pdflush的行为,以平衡磁盘I/O和系统性能。

以下转自:http://blog.youkuaiyun.com/kofshower/article/details/7357968

大家知道,在linux操作系统中,写操作是异步的,即写操作返回的时候数据并没有真正写到磁盘上,

而是先写到了系统cache里,随后由pdflush内核线程将系统中的脏页写到磁盘上,在下面几种情况下,
系统会唤醒pdflush回写脏页:

1 、定时方式:
     定时机制定时唤醒pdflush内核线程,周期为/proc/sys/vm/dirty_writeback_centisecs ,单位
是(1/100)秒,每次周期性唤醒的pdflush线程并不是回写所有的脏页,而是只回写变脏时间超过
/proc/sys/vm/dirty_expire_centisecs(单位也是1/100秒)。
注意:变脏的时间是以文件的inode节点变脏的时间为基准的,也就是说如果某个inode节点是10秒前变脏的,
pdflush就认为这个inode对应的所有脏页的变脏时间都是10秒前,即使可能部分页面真正变脏的时间不到10秒,
细节可以查看内核函数wb_kupdate()。

2、 内存不足的时候:
    这时并不将所有的dirty页写到磁盘,而是每次写大概1024个页面,直到空闲页面满足需求为止。

3 、写操作时发现脏页超过一定比例:
    当脏页占系统内存的比例超过/proc/sys/vm/dirty_background_ratio 的时候,write系统调用会唤醒
pdflush回写dirty page,直到脏页比例低于/proc/sys/vm/dirty_background_ratio,但write系统调
用不会被阻塞,立即返回。当脏页占系统内存的比例超过/proc/sys/vm/dirty_ratio的时候, write系
统调用会被被阻塞,主动回写dirty page,直到脏页比例低于/proc/sys/vm/dirty_ratio,这一点在
2.4内核中是没有的。

4 、用户调用sync系统调用:
    这是系统会唤醒pdflush直到所有的脏页都已经写到磁盘为止。


以下转自:http://blog.youkuaiyun.com/fireroll/article/details/19155657

一、简介 
由于页高速缓存的缓存作用,写操作实际上会被延迟。
当页高速缓存中的数据比后台存储的数据更新时,那么该数据就被称做脏数据。
在内存中累积起来的脏页最终必须被写回磁盘。

在以下两种情况发生时,脏页被写回磁盘:
.  当空闲内存低于一个特定的阈值时,内核必须将脏页写回磁盘,以便释放内存。 
.  当脏页在内存中驻留时间超过一个特定的阈值时,内核必须将超时的脏页写回磁盘,
   以确保脏页不会无限期地驻留在内存中。
 
上面两种工作的目的完全不同。
实际上,在老内核中,这是由两个独立的内核线程分别完成的。
但是在2.6内核中,由一群内核线程—pdflush后台回写例程—统一执行两种工作。

<think>我们之前讨论过fclose和close不会刷新内核缓冲区(页缓存),那么进程退出时是否会刷新内核缓冲区? 答案:不会。进程退出时(无论是正常退出还是异常退出),内核不会自动将页缓存中的数据刷新到磁盘。 解释: 1. 进程退出时会关闭所有打开的文件描述符(相当于对每个文件描述符调用close()),但close()本身不刷新内核缓冲区。 2. 内核缓冲区(页缓存)的管理独立于进程,由内核统一管理。数据写入页缓存后,由内核的刷新机制(如达到时间间隔、内存不足等)决定何时写入磁盘。 3. 因此,如果进程退出前有数据仅在内核缓冲区而未写入磁盘,这些数据不会因为进程退出而丢失,它们仍然存在于页缓存中,等待内核后续写入磁盘(除非系统崩溃)。 但是,有一种情况需要注意:如果进程使用了stdio库(FILE*),那么在进程正常退出(例如通过exit()或从main返回)时,会调用所有已打开流的fclose(),这会刷新stdio的用户缓冲区到内核缓冲区(但同样不会刷新内核缓冲区到磁盘)。 总结: - 进程退出不会导致内核缓冲区刷新到磁盘。 - 要确保数据持久化,必须显式调用fsync()或fdatasync()。 示例: 如果进程在写入数据后崩溃(没有调用fsync),数据可能还在页缓存中,系统重启后这部分数据可能丢失(如果系统崩溃的话)。 因此,进程退出时不会刷新内核缓冲区(即不会将数据写入磁盘),但会确保用户空间的缓冲区(如stdio缓冲区)被刷新到内核缓冲区(如果是通过正常退出调用fclose的话)。 注意:异常退出(如被信号杀死)可能不会执行fclose,因此用户空间的缓冲区也可能丢失。 所以,关键点: - 用户空间缓冲区:正常退出时,通过fclose刷新到内核缓冲区;异常退出时,可能丢失。 - 内核空间缓冲区:进程退出(无论正常还是异常)都不会刷新到磁盘,但数据仍在内核的页缓存中,由内核决定何时写回磁盘。 §§相关问题§§ 1. 如果进程异常终止(如被`kill -9`杀死),那么该进程打开的文件描述符对应的内核缓冲区中的数据会丢失吗? 2. 系统崩溃(如断电)与进程崩溃对内核缓冲区中的数据持久性有什么不同影响? 3. 除了显式调用`fsync()`,还有哪些方法可以确保数据在进程退出后立即持久化到磁盘? 4. 内核在什么条件下会自动将页缓存中的数据刷新到磁盘?有哪些参数可以调整这个行为? 5. 使用`mmap`进行文件写入时,进程退出会对映射区的数据造成什么影响?数据会刷新到磁盘吗?</think>### Linux 进程退出时的内核缓冲区处理机制 在 Linux 系统中,进程退出时对内核缓冲区(页缓存)的处理如下: #### 1. **核心结论** - **不会自动刷新内核缓冲区**:进程退出(无论是正常退出还是异常终止)**不会**触发内核缓冲区数据刷新到磁盘 - **缓冲区数据保留**:已写入内核缓冲区的数据会继续保留在页缓存中 - **数据持久化依赖**:磁盘写入由内核的刷新机制独立管理,与进程生命周期无关 #### 2. **详细行为分析** | 退出类型 | 用户空间缓冲区 | 内核缓冲区(页缓存) | |----------------|--------------------------|--------------------------| | **正常退出** | 自动刷新(通过 `exit()` 调用 `fclose()`) | ❌ 不刷新 | | **异常终止** | 可能丢失(如 `kill -9`) | ❌ 不刷新 | | **系统崩溃** | 全部丢失 | 全部丢失 | #### 3. **关键机制说明** 1. **文件描述符关闭**: - 进程退出时内核自动关闭所有打开的文件描述符(等效于 `close()`) - `close()` 仅释放描述符资源,**不刷新**关联的页缓存 2. **页缓存生命周期**: ```mermaid graph LR A[进程写入数据] --> B[进入内核页缓存] B --> C{进程退出} C -->|不触发| D[页缓存保留] D --> E[内核定期刷新] E --> F[磁盘持久化] ``` 3. **刷新触发条件**: - 内核线程 `pdflush`/`kworker` 定期刷新(默认 30 秒) - 页缓存达到内存压力阈值 - 显式调用 `sync()`/`fsync()` - 文件系统卸载(`umount`) #### 4. **数据丢失风险场景** ```c // 危险写入示例 FILE *fp = fopen("data.log", "a"); fprintf(fp, "Important transaction"); // 进入 stdio 缓冲区 // 缺少 fflush() 和 fsync() exit(0); // 正常退出:刷新 stdio 缓冲区到页缓存,但页缓存未刷新到磁盘 // 若此时系统崩溃,数据将丢失 ``` #### 5. **安全写入最佳实践** ```c // 安全写入流程 void write_guaranteed(const char* data) { FILE *fp = fopen("critical.dat", "a"); fprintf(fp, "%s", data); fflush(fp); // 刷新 stdio 缓冲区 fsync(fileno(fp)); // 强制页缓存到磁盘 fclose(fp); } ``` > **关键事实**:Linux 内核设计将缓冲区管理与进程生命周期解耦。页缓存是**系统级资源**,由内核统一管理,不受单个进程退出影响。数据最终持久化依赖于内核的异步刷新机制或显式同步调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值