日期:2014-05-16  浏览次数:20891 次

Linux内核探讨-- 第二章

      本文是个人分析《Linux内核设计与实现》而写的总结,欢迎转载,请注明出处:

                                                                                 http://blog.csdn.net/dlutbrucezhang/article/details/12185125

      第二章 --进程调度

      上一章已经详细的介绍了进程和进程管理的概念,这一章的主题在操作系统能否“完美”的工作方面占有最主要的地位。很明显,根据名字我们就能看出来,就是内核去调度进程的执行。怎样去调度进程?为什么会是那样?好吧,这篇文章就是介绍这些主题的。

1.多任务

      现在的操作系统都是多任务的,也就说多个任务(进程)能够并发的执行。注意,这里用到的词是“并发”,而不是并行。并发:是指多个任务轮流占用资源执行,但是它们之间的切换是快速的,看起来就好像是同时执行一样。由于处理器的限制,即使在内存中现在有100个进程,而且都不阻塞,同一时间,它们也只能有一个进程处于运行状态,其余的是就绪状态。
      多任务操作系统分为两种:抢占式多任务和非抢占式多任务。由于非抢占式多任务效率极其低下,特别是平衡不了实时进程和普通进程之间的关系,几乎退出了现在的市场。我们平时用的操作系统普遍支持抢占。因为,这样不仅使得计算机的反应加快,更能保证高吞吐量的实现。它的含义也就是字面上的解释,即一个进程在执行的过程中,另一个“有资格”的进程打断它的执行(称之为抢占),变成运行状态的过程。

2.I/O消耗型和处理器消耗性的进程

      在操作系统运行的过程中,存在两种表现不同的进程。I/O消耗性表现为,大部分时间是在等待I/O传输的完成,很少一部分时间是在使用CPU,这里最经典的例子就是输入法;处理器消耗性进程是指很少的时间等待I/O的完成,大部分时间是利用CPU的运算,这里经典的例子是图像处理程序和Matlab计算程序。
      这样也就会存在一些矛盾的地方。应该给谁多一些的处理器时间,怎样分配是比较合理的。也许你会说,既然处理器消耗性的进程需要更多的处理器时间,应该给他分配更多的CPU,但是,如果不给I/O消耗型的进程分配更多的处理器时间,那么它的反应会相当的慢,举一个夸张的例子,当你向键盘输入一个字符之后,一秒之后才在显示器上显示,这显然是我们不能接受的。相反,计算程序即使是多一秒或者甚至是多十秒完成,我们似乎都是可以接受的,毕竟我们在等待计算完成时已经等了很久。所以,在Linux中实现的策略是给I/O消耗性的进程分配更多的处理器时间。

3.进程优先级

      不同的进程是有不同的优先级的,这似乎很正常。因为,在不同的时间里,肯定有进程要求尽快能得到执行的机会。这里的优先级也是分为两种的。
      3.1 实时优先级
              它的优先级范围从 0 -- 99,数字越大,优先级越高,能尽快得到处理的机会就会越到,而且通常这意味着它也能获得更多的处理器时间。
      3.2 nice值
               我们可能在程序中见过这样的语句 nice(5); 这里就是给当前进程的优先级计数加上5,注意,这里并不是提高了它的优先级,反而,这样会降低当前进程的优先级。nice值的范围是 -20 -- 19。默认情况下,创建的普通进程优先级为 0 。