Linux 内核架构
前言
这本资料是我的一次尝试,看看自己能坚持多久,是不是能够真正的学会努力,是不是喜欢linux,喜欢技术。Linux是开源界的一个很大的成就,人民不用付费就可以使用基础性的软件:操作系统,每当想起这个世界上有那么多的人和我一起工作,这样的工作是不是非常的有趣呢?这样的工作是不是是非的有意义呢,会不会认识更多的人呢?会不会找到那些心头未解的难题呢?
我不知道准确的答案,但是,如果不做,那么似乎就可能一直也得不到答案,我需要时间,我需要经历,我需要答案。
那么,开始吧。
注意本文只是根据自己的理解,很多觉得没有必要的例子并没有和原著一模一样的翻译。
第一章 进程管理和调度
所有的现代操作系统都能支持多进程并发—至少在用户看来如此。如果一个系统只有一个cpu的话,那么一个特定时间只可以运行一段程序。在多处理器系统,能够真正同时执行的进程(程序)数目和物理的cpu数目有关。通过在不同应用之间的快速切换,内核和处理器能够建立了一种多进行同时执行的假象,这种切换的时间间隔如此的小,用户不可能察觉到。
上面提到的系统管理方式引出了下面几个问题:
n 除非明显的需要,应用之间不能相互影响。例如:应用A的错误不能传染给应用B。由于linux是多用户的操作系统,另外一个需求是:一个应用不能访问(读或者修改)其他应用的内存区域,否则访问其他用户的数据将会很容易实现。
n cpu的使用时间分配在不同应用之间应该尽可能的公平。
n 内核需要知道分配给每个应用多少时间,何时切换到下一个应用,哪一个应用是“下一个”。并且这些是和平台有关的。
n 当一个应用A被切换出,应用B被切换入。系统必须保证,应用B的执行环境和之前它被切换出的时候一样,例如寄存器内容,栈指针等。这也和处理器类型有关。
1 进程优先级
并非所有的进程都是同样重要的,对于进程优先级这个话题,相信读者大都已经非常熟悉了,很多不同的需要都有自己的优先级区分方法。作为一个粗略的划分,进程可以被分成实时进程和非实时进程。
u 硬实时进程。这是一种要求严格的相应时间的进程,例如飞机着陆时候的刹车按钮对应的程序,这个程序对应的进程必须在非常短时间内相应,否则可能错过着陆时机,进而坠毁。硬实时进程的要点是进程响应的时间不能超过一定的时间。Linux本身并不支持硬实时进程。
u 软实时进程。软实时进程比硬实时进程要“软”。即同样的需要结果快速响应,但如果没有响应也不会“世界末日”。
u 大部分进程都是“普通”进程。他们没有特别的时间限制,但是也可以被设置成相应的优先级来表示比其他进程更重要或者更不重要。
下图形象的展示了一个cpu时间分配的过程。每当一个进程被分给的时间被用完了,内核选择一个新的进程,保存当前进程和寄存器内容,页表内容等。然而这个模型并没有考虑到以下: 1 如果一个进程并没有什么要做的,它只是在等待着硬盘读入信息,那么切换到这个进程就没有意义,可能的cpu操作就是不断地测试硬盘的寄存器是否已经读完了需要的数据。显然这样的切换时没有意义的,是“吃亏的”。2 linux是支持多种进程优先级分配策略的,下图显然没有考虑到这个问题。
这个一个圆饼图~
调度器的实现一直是内核开发人员考虑的焦点之一,尤其在算法层面。Linux可能面对众多不同的工作环境,例如:小型嵌入式自动控制环境。近几年调度器大体上被重写过两次。
l 在版本2.5的开发中,大O的调度器代替了之前的调度器,这个调度器的特点是可以一直保持常量的时间进行调度,而不论有多少个物理处理器。
l 在版本2.6.23的开发中,一个完全公平的调度器被合并到内核代码中,它和之前的版本简直是南辕北辙的。类似像交互式任务应该被给予更高的优先级的启发式规则被完全抛弃。这个调度器希望尽可能的实现理想调度。它更适合给多个调度实体调度,而不是单个,例如多个用户的不同进程可以获得更平均的时间。
2 进程生存周期
进程并不是一直都能被执行,某些时刻他可能在等待外设的操作,例如硬盘的读写。有三种进程的基本状态:
l 运行
l 等待
l 睡眠
系统的进程表中会记载这些进程的状态,以助在以后的调度时候选择候选的运行进程。也会有一组睡眠进程队列,他们都在等待着某一个外部事件的发生,在适当的时间,他们会被唤醒。