内核版本 3.0 和 3.4.35 (不同内核版本的回写机制不同哦~)
Linux内核里负责回写脏页的线程称为
flusher线程
,它们以
“flush-”+“设备名”
来命名,例如”[flush-8:64]”(这里设备名是指用设备号拼接的字符串)。
在
BDI
(即backing device info)模块初始化(default_bdi_init())时会创建”[sync_supers]”和”[bdi_default]”两个线程。其中,
“[sync_supers]”线程
用来周期性(间隔同flusher线程)地同步系统中所有的superblocks(遍历全局super_blocks链表)。
“[bdi_default]”线程
则用来在必要时创建、启动和停止flusher线程。
系统中每新增一个bdi设备(例如硬盘)就会通过bdi_register()注册到全局的bdi_list链表中,
每个bdi设备都会有自己的flusher线程
,在某个设备需要回写脏页时,bdi_default线程就会为其创建”[flush-devname]”线程(bdi_forker_thread())并运行,如”[flush-8:64]”。flusher线程的处理函数为bdi_writeback_thread(),负责周期性地回写脏页,实际回写操作由wb_do_writeback()函数完成(其第二个参数为1会等IO完成才返回,为0则立即返回)。
flusher线程的回写的周期间隔为 dirty_writeback_interval,默认为5秒,可通过/proc/sys/vm/dirty_writeback_centisecs修改(kernel/sysctl.c),当然,如果其所属的bdi设备没脏页或者dirty_writeback_interval被置为0,线程就闲着了。
实际上我们主动调用sync()去刷脏页的时候,就是通过wakeup_flusher_threads()和sync_filesystem()来回写所有bdi设备的脏页(即脏的inodes的address_space)和所有的superblocks的。
上述内容涉及的代码均在mm/backing-dev.c、fs/fs-writeback.c里面。
在需要刷脏页的时候,一个硬盘上的flusher线程就会启动。上面说每个硬盘是单独的flusher线程,也就是说多个硬盘就会有多个这样的线程。注意这是以硬盘为单位而不是以分区为单位的,例如对于sda,”[flush-8:64]”中8:64是/dev/sda的设备号,而不是/dev/sda1或/dev/sda2的设备号,否则如果每个分区一个线程的话,每个线程回写时磁头就要较大幅度移动,很不划算。
1.
线程
的概念:
至今为止,
Linux
下还是没有“真正的
线程
”。谈到
线程
就不得不提到进程这概念,进程是系统
中
程序执行和资源分配的基本单位。每个进程都拥有自己的数据段,代码段和堆栈段,这就造成了进程在进行切换等操作时都需要有比较
负责
的上下文切换等动作.为了进一步减少处理机的空转时间支持多个处理器和减少上下文切换开销,进程在演化
中
出现了另一个
浏览器打开
内核
经常需要在后台执行一些操作,这种任务就可以通过
内核
线程
(kernle thread)完成,
内核
线程
是独立运行在
内核
空间的标准进程。
内核
线程
和普通的进程间的区别在于
内核
线程
没有独立的地址空间,mm指针被设置为
NU
LL;它只在
内核
空间运行,从来不切换到用户空间去;并且和普通进程一样,可以被调度,也可以被抢占。实际上,
内核
线程
只能由其他
内核
线程
创建,
linux
驱动模块
中
可以用kernel_threa...
浏览器打开
ps进程名有方括号的是
内核
级的进程,执行辅助功能(比如将缓存
写
入到磁盘);所有其他进程都是使用者进程。您会注意到,就算是在您新安装的(最小化的)系统
中
,也会有很多进程在运行。
在文档kernel-per-CPU-kthreads.txt
中
列出了多核处理器的
内核
线程
:
Name: ehca_comp/%u
Purpose: Pe
ri
odically process Infini
ba
nd-relat...
浏览器打开
发现大量jdb2进程占用io资源.jdb2进程是一个文件系统的
写
journal的进程
kthreadd:这种
内核
线程
只有一个,它的作用是管理调度其它的
内核
线程
。它在
内核
初始化的时候被创建,会循环运行一个叫做kthreadd的函数,该函数的作用是运行kthread_crea
te
_
li
st全局链表
中
维护的kthread。可以调用kthread_crea
te
创建一个kthread,它会被加入到kthr
浏览器打开
1. 什么是
页
高速缓存,作用是什么
概念:
Linux
内核
实现磁盘缓存的技术就叫
页
高速缓存。即把磁盘
中
的数据缓存到物理内存
中
,把对磁盘的访问转换为对物理内存的访问。(物理内存的最小单位为
页
,
页
高速缓存缓存的是内存
页
面,所以叫
页
高速缓存)
作用:减少对磁盘I/O的操作,提高系统性能
2. 为什么
页
高速缓存会带来性能的提高
访问物理内存的速度远远快于访问磁盘的速度(ns与ms的数量级差距)。所以
浏览器打开
1.头文件#inclu
de
&
lt
;
linux
/sched.h> //wake_up_process()#inclu
de
&
lt
;
linux
/kthread.h...
浏览器打开
#inclu
de
&
lt
;
linux
/
de
lay.h>
#inclu
de
&
lt
;
linux
/err.h>
#inclu
de
&
lt
;
linux
/kernel.h>
#inclu
de
&
lt
;
linux
/kthread.h>
#inclu
de
&
lt
;
linux
/mod
ul
e.h>
#inclu
de
&
lt
;
linux
/sched.h>
static struct task_struct *
te
st_TaskStruct;
int threadTas
浏览器打开
页
高速缓存是
linux
内核
实现的一种主要磁盘缓存,它主要用来减少对磁盘的IO操作,具体地讲,是通过把磁盘
中
的数据缓存到物理内存
中
,把对磁盘的访问变为对物理内存的访问。为什么要这么做呢?一,速度;二临时局部原理。有关这两个概念,相信熟悉操作系统的我们不会太陌生。
页
高速缓存是由RAM
中
的物理
页
组成的,缓存
中
的每一
页
都对应着磁盘
中
的多个块。每当
内核
开始执行一个
页
IO操作时,就先到高速缓存
中
找。这样就可以...
浏览器打开
将数据
写
到page c
ac
he
写
文件的时候其实是通过文件系统
写
到page c
ac
he
中
,然后再由相应的
线程
在适当的时机将page c
ac
he
中
的数据
写
到磁盘
中
。//fs/fat/file.c
const struct file_operations fat_file_operations = {
.aio_
write
= gene
ri
c_file_aio_
write
浏览器打开