[未写完](0x02)深入Linux内核架构总结----进程管理和调度



==============================
0.概述
1. 多任务、调度和进程管理
2. 物理内存的管理以及内核与相关硬件的交互
3. 用户空间的进程访问虚拟内存
4. 编写设备驱动程序
5. 模块机制以及虚拟文件系统
6. Ext文件系统属性和访问控制表的实现方式
7. 内核中网络的实现
8. 系统调用的实现方式
9. 内核对时间相关功能的处理
10. 页面回收和页交换的相关机制以及审计的实现
===============================

进程管理和调度

内核必须决定为各个进程分配多长时间,何时切换到下一个进程。这又引出了哪个进程是下 一个的问题。此类决策是平台无关的。

在内核从进程A切换到进程B时,必须确保进程B的执行环境与上一次撤销其处理器资源时完 全相同。例如,处理器寄存器的内容和虚拟地址空间的结构必须与此前相同。

这里的后一项工作与处理器极度相关。不能只用C语言实现,还需要汇编代码的帮助。

这两个任务是称之为调度器的内核子系统的职责。CPU时间如何分配取决于调度器策略,这与用于在各个进程之间切换的任务切换机制完全无关。

2.1 进程优先级

进程可以分为实时进程和非实时进程

> 硬实时进程有严格的时间限制,某些任务必须在指定的时限内完成

> 软实时进程是硬实时进程的一种弱化形式
大多数进程是没有特定时间约束的普通进程,但仍然可以根据重要性来分配优先级。

抢占式多任务处理(preemptive multitasking)

各个进程都分配到一定的时间段 可以执行。时间段到期后,内核会从进程收回控制权,让一个不同的进程运行,而不考虑前一进程所 执行的上一个任务。被抢占进程的运行时环境,即所有CPU寄存器的内容和页表,都会保存起来,因 此其执行结果不会丢失。在该进程恢复执行时,其进程环境可以完全恢复。时间片的长度会根据进程 重要性(以及因此而分配的优先级)的不同而变化。

完全公平调度器(completely fair scheduler)

2.2 进程生命周期

进程可能有以下几种状态。

 运行:该进程此刻正在执行。 

 等待:进程能够运行,但没有得到许可,因为CPU分配给另一个进程。调度器可以在下一次 任务切换时选择该进程。 

 睡眠:进程正在睡眠无法运行,因为它在等待一个外部事件。调度器无法在下一次任务切换 时选择该进程。 

抢占式多任务处理

Linux进程管理的结构中还需要另外两种进程状态选项:用户状态和核心态。

这反映了所有现代CPU都有(至少)两种不同执行状态的事实,其中一种具有无限的权利,而另一种则受到各种限制。

例如,可能禁止访问某些内存区域。这种区别是建立封闭“隔离罩”的一个重要前提,它维持着系统中现存的各个进程,防止它们与系统其他部分相互干扰。 进程通常都处于用户状态,只能访问自身的数据,无法干扰系统中的其他应用程序,甚至也不会注意到自身之外其他程序的存在。 如果进程想要访问系统数据或功能(后者管理着所有进程之间共享的资源,例如文件系统空间),则必须切换到核心态。显然这只能在受控情况下完成,否则所有建立的保护机制都是多余的,而且这种访问必须经由明确定义的路径。“系统调用”是在状态之间切换的一种方法

从用户状态切换到核心态的第二种方法是通过中断,此时切换是自动触发的。系统调用是由用户 应用程序有意调用的,中断则不同,其发生或多或少是不可预测的。处理中断的操作,通常与中断发 生时执行的进程无关。

内核的抢占调度模型建立了一个层次结构,用于判断哪些进程状态可以由其他状态抢占。 
 普通进程总是可能被抢占,甚至是由其他进程抢占。在一个重要进程变为可运行时,例如编辑器接收到了等待已久的键盘输入,调度器可以决定是否立即执行该进程,即使当前进程仍然在正常运行。对于实现良好的交互行为和低系统延迟,这种抢占起到了重要作用。 
 如果系统处于核心态并正在处理系统调用,那么系统中的其他进程是无法夺取其CPU时间的。 调度器必须等到系统调用执行结束,才能选择另一个进程执行,但中断可以中止系统调用。
 中断可以暂停处于用户状态和核心态的进程。中断具有高优先级,因为在中断触发后需要 尽快处理。 

2.3 进程表示

Linux内核涉及进程和程序的所有算法都围绕一个名为task_struct的数据结构建立,该结构定义在include/sched.h中。这是系统中主要的一个结构。见本人翻译的博客(528行) sched.h (版本4.16.7全部内容)

猜你喜欢

转载自blog.csdn.net/u011288483/article/details/80245083
今日推荐