熬之滴水成石:最想深入了解的内容--windows内核机制(10)

来源:互联网 发布:ubuntu ttf字体安装 编辑:程序博客网 时间:2024/05/16 22:09

 

                                                                                 62--进程和线程(7)

这个章节说说线程的调度,我所理解的多线程并发在windows中现象实际上就是当线程个数远远大于处理器的数量。而在处理这些线程时,肯定是有的线程先处理,有些延后处理。这里就涉及到了一个调度的问题,由此在windows中还有了windows线程调度器的概念。而这些调度自然和线程的优先级是紧密相关联的。在windows中,线程的调度实际上是从内核里开始的。在windows中,线程的优先级被分成了32个级别,就是用0-31的数字来表示的。其中系统类优先级是0,1-15是动态类别的有限,16-31是实施类别的。也许你会问,线程的优先级别是从哪里确定来的。当然是从进程的属性来的,在之前提到的进程KPROCESS结构,这里面的BasePriority就指定了一个进程的基本优先级。这个属性的定义就让每个线程在初始化时就可以直接的从该对象中获得基本的优先级。所以进程和线程其实都是享受着同样的级别。当然这种级别是可偶先机。以通过调用函数去改变的,这些函数通常都是以setPriority名称的函数。如果线程设定是0-15的范围内,则是指在运行在动态优先级别中的线程,它们的实际优先级可能会根据特定的情况而作调整,但怎么调整其实是不会跳跃出1-15的这个范围内。我们在windows中非常熟悉任务管理器,我们可以通过指定某个进程可以看到该进程的级别:高、低、普通等6个选项。实际上这几个级别正是0-31中设定的值,像realtime-24、high-13、abovenormal-10、normal-8、below-normal-6、low-4。windows的优先级是从执行层开始的,当执行层在创建进程时,就会计算优先级。而计算的这些方法则是通过进程对象的priorityclass域来查询优先级。这个优先级定义了一个叫pspprioritytable中,也就是通过这样的转换,变成了内核中定义的0-31的范围。通过这种设计我们完全可以清晰的看到,在执行层实现的就是一个管理和方法机制,而在内核层提供的就是调度。这就是策略和机制相分离的原则,也是windows系统设计的核心,很多系统的框架都在类似的方法衍生出来的,像搞web开发的程序员尽皆知的spring框架。

线程的状态是线程中一个非常重要的参数,能够反映线程当前的调度状态。线程的状态肯定是从初始状态到最后一个状态的。这种状态是随着系统状态变化而变化的,也随着自身的代码逻辑状态发生变化。我们看看这些状态,分别是:已初始化、就绪、运行、备用、已终止、等待、转移、延迟的就绪、门等待等。这些状态与我们熟悉操作系统的状态相比,多了几个,那就是转移、延迟的就绪、门等待等。在线程状态转移中,有个核心的方法那就是kireadythread,只要线程满足了执行的条件就可以调用该函数。对于一个线程来说,该函数的调用就标志着线程进入了备用状态,意味着可能要被执行了。先看看从延时就绪状态的线程如何获取到执行的指令的,这时候kireadythread函数起了什么作用,它将一个线程插入到一个名叫做延迟就绪的链表中,当调度器获得控制权时就会对这个链表中的线程逐个的处理,当遍历完该链表,那这些链表中的线程状态就会变成就绪或备用状态。那么就绪状态的线程就如何变成可执行的线程了,这里面是不是也是用数据链表的方式来实现。当然不会一样,因为这里涉及到处理器的处理机制,处理器会对应一个叫KPRCB的数据结构,在这个结构中会存储当前正在运行的线程、下个要运行的线程、及处理器上空闲的线程。这里面还有一个叫dispatchreadylisthead的数组,该数组主要是记载线程优先级别,实际上也是通过一个叫kiinsertdeferredreadylist函数完成的,就是把线程插入到deferredreadylisthead链表中对应一个相应的处理,并且再插入到处理器所对应的KPRCB的链表中。又有一个叫kifindreadythready的函数会对这个KPRCB的链表进行遍历,从优先级开始,直到将值依次付给dispatcherreadylisthead的当前线程 和下次执行线程的区域。至此,我们应该可以对于线程从就绪状态变成就绪状态,是由一系列的函数节点实现的,这些节点的调度是由系统的调度器完成的。线程的状态之间转换,还有很多情况在这就不一一描述了,不过清楚了核心的调度函数,再加上对相应的数据结构理解,应该会对整个机制有更为清晰的认识

                                                                                                                                                                   (未完待续...............)

原创粉丝点击