当前位置:C++技术网 > 资讯 > 抢占式系统进程和线程运行的小解

抢占式系统进程和线程运行的小解

更新时间:2015-09-26 10:16:01浏览次数:1+次

    windows实现了基于优先级的抢占式线程调度算法,每个线程都有一个基本有一个基本优先级和一个动态优先级。优先级的值处于0-31之间,共分为三个级别:0表示系统优先级为最低优先级仅用于另页面线程;1-15为动态优先级;16-31为实时优先级,用于处理一些实时任务。我们大概了解就行了。
     现代操作系统总是可以提供可并发的执行多个任务的环境,比如,用户可以一边接受电子邮件一边听音乐,还可以同时跟网络上的朋友聊天。但是主流的计算机只有游戏爱你的计算资源,例如只有一个单核处理器,较新的个人计算机可能配有多核的处理器。假如计算机也只有一个中英处理器呢?它该如何表现的可以同时处理这些任务?基本的做法就是把时间细分,然后在某个适当的时间粒度上轮流执行这些任务,让每个人物都有机会被执行到。只要在人所能感知的时间粒度上(差不多是100ms-200ms),用户就会认为这些任务是同时在执行。
  
     我们可以把进程理解成一个独立的任务,它不仅是一个正在被执行的程序,有自己的内存空间,同时还拥有一颗进攻自己使用的虚拟CPU。从整个系统的角度看,多进程是分时进行的,当一个进程执行了一段时间后,系统通过某种硬件机制或软件机制获得控制权。当这个进程的时间片段到了,就把控制权给下一个进程,由它使用下一个时间片段。
     我们来看看时间片段的概念:把时间纷呈适当的片段,在现代处理器结构中,这可以通过设置时钟中断来完成,时钟中断是有具体实现的,在windows的内核代码中,有专门的代码来实现时钟中断这个程序。在进程间实施切换,即保留上一个进程的环境信息,恢复下一个进程的执行环境,我们可以这样想,每个进程在执行过程中实际上是经常被打断的,如果不能很好的维护好今后层的环境信息,那么对进程而言,是有影响的。
     在我们的程序中,一个进程可以容纳多个线程,这导致了多线程程序设计的模型。在上图中,我们看到多个进程共享一个处理器时实际上是按照某种规则轮换执行的。当一个进程执行了一段时间以后,下一个进程被U型按出出来占有处理器,继续处理器的执行。这便是进程调度算法。如果操作系统支持多线程运行也就是支持内核级的线程,那么处理器资源的调度通常是在线程而非进程粒度上进行。因为线程才是基本调度单位。
     我们看看调度算法的分类。非抢占式算法和抢占式算法。在非抢占式系统中,一个线程一旦被选择在处理器上运行,就将一直运行下去,直到阻塞(比如等待I/O或等待一个信号量),或退出。这类算法就容易出现问题。一旦此线程出现问题霸着处理器不放,其他的线程你也就别想拥有处理器,也就别想运行。在抢占式系统中,一个线程被选中在处理器上运行以后,允许运行的时间长度有最大限制。一旦时间到了,就被迫交出执行权,交由系统挑选其他的线程来运行。因此抢占式算法需要一个时钟中断,而非抢占式算法则不需要。
 我们介绍下线程调度算法:
 1.先到先得服务算法。顾名思义,我就不介绍了。
 2.时间片轮转算法。处理器的时间被分成了最大长度不超过某个值得时间片段,成为时间片,然后用轮转方法分配给每一个线程。
 3.优先级调度算法。就如文章开头介绍的那样,根据优先级来分配线程执行顺序。

    对于线程,进程,时间片的描述,我在《线程学习心得浅析》进行了小述,你可以结合那篇文章看看。