本文共 11413 字,大约阅读时间需要 38 分钟。
第3章 内核组件
内建的内核线程 使用ps命令可以查看系统中正在运行的内核线程(也称为内核进程)。内核线程的名字被一个方括号括起来了: bash> ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 22:36 ? 00:00:00 init [3] root 2 0 0 22:36 ? 00:00:00 [kthreadd] root 3 2 0 22:36 ? 00:00:00 [ksoftirqd/0] root 4 2 0 22:36 ? 00:00:00 [events/0] root 38 2 0 22:36 ? 00:00:00 [pdflush] root 39 2 0 22:36 ? 00:00:00 [pdflush] root 29 2 0 22:36 ? 00:00:00 [khubd] root 695 2 0 22:36 ? 00:00:00 [kjournald] ... root 3914 2 0 22:37 ? 00:00:00 [nfsd] root 3915 2 0 22:37 ? 00:00:00 [nfsd] ... root 4015 3364 0 22:55 tty3 00:00:00 -bash root 4066 4015 0 22:59 tty3 00:00:00 ps -ef [ksoftirqd/0] 内核线程是实现软中断的助手。软中断是由中断发起的可以被延后执行的底半部。在第4章《打下基础》将对底半部和软中断进行详细的分析,这里的基本理论是让中断处理程序中的代码越少越好。中断处理时间越小,系统屏蔽中断的时间会越短,这会降低时延。Ksoftirqd的工作是确保高负荷情况下,软中断既不会饥饿,又不至于压垮系统。在对称多处理器(SMP)及其上,多个线程实例可以并行地运行在不同的处理器上,为了提高吞吐率,系统为每个CPU都创建了一个ksoftirqd线程(ksoftirqd/n,其中n代表了CPU序号)。 events/n (其中n代表了CPU序号)实现了工作队列,它是另一种在内核中延后执行的手段。内核中期待延迟执行工作的程序可以创建自己的工作队列,或者使用缺省的events/n工作者线程。第4章也对工作队列进行了深入分析。 pdflush 内核线程的任务是对页高速缓冲中的脏页进行写回(flush out)。页高速缓冲会对磁盘数据进行缓存,为了提供性能,实际的磁盘写操作会一直延迟到pdflush后台程序将脏数据写回磁盘才进行。当系统中可用的空闲内存低于门限,或者页变成脏页后一段时间。在2.4内核中,这2个任务分配被bdflush和kupdated这2个单独的线程完成。你可能会注意到ps的输出中有2个pdflush的实例,如果内核感觉到现存的实例已经在满负荷运转,它会创建1个新的实例以服务磁盘队列。当你的系统有多个磁盘,而且要频繁访问它们的时候,这种方式会提高吞吐率。 在以前的章节中我们已经看到,kjournald是通用内核日志线程,它被EXT3等文件系统使用。 Linux 网络文件系统(NFS)通过一套名为nfsd的内核线程实现。 |
函数 | 作用 |
INIT_LIST_HEAD() | 初始化表头 |
list_add() | 在表头后增加一个元素 |
list_add_tail() | 在链表尾部增加一个元素 |
list_del() | 从链表中删除一个元素 |
list_replace() | 用另一个元素替代链表中的某一元素 |
list_entry() | 遍历链表中的所有结点 |
list_for_each_entry()/ list_for_each_entry_safe() | 被简化的链表递归接口 |
list_empty() | 检查链表是否为空 |
list_splice() | 将2个链表联合起来 |