59 进程和线程(4)
进程和线程在windows OS的内核和应用层都有相应的数据结构,这段涉及到比较深入的部分。我也只是把我了解的内容说说,在内核层的线程数据结构组成很有特点,首先有一个叫KPROCESS对象实际上就是它表示一个进程对象,在这个对象里有一个叫分发器对象,这个分发器更多的内容会涉及到线程在调用的同步问题。还有一个叫directorytablebase的数组,这个数组主要是指向进程的页目表地址,有一个叫ReadListHeadd的双向表头,该链表记录了进程中的线程状态。也就是说,一旦一个进程被混出内存后,线程一旦就绪就被放入该链表中,并要求换入该进程,以后当该进程被换入内存时,该链表中所有线程都加入到系统全局的就绪链表中了。此外还有很多这样的数据结构都是被作进程换进内存和换出而生的像swaplistentry。还有一个threadlisthead的域,它指向一个链表头,该链表就是存储当前线程,当一个线程初始化创建就会进入该链表,当终止的时候就会从这个链表中移除,之前说到的directorytablebase结构中的进程,那么这个数据结构主要用来处理进程和线程的关系。作为内核的结构最为重要的就是锁对象了,在这个结构中也有一个这样对象,叫processlock,该对象主要保护进程的数据成员,以来确保数据结构的修改和访问总是一致的。从整体来说,KPROCESS对象主要处理两类问题,一类是跟进程运行所需的环境有关,像页目录表、交换状态等;另一类就是线程相关的属性,比如优先级等,时限等。
好了,说完内核的进程,那么就该说说线程对象了KTHREAD,这也是一个比较复杂的数据结构。但这部分结构都与windows自身的线程调度有着紧密关系的。在这个对象中,有个叫header的域该域表明的就是用来作分发的,其实就是在记录线程的状态以便知道怎么管理。线程的运行自然关系到了栈,在这个对象中有四个栈的地域,分别是initalstack,stacklimit,stackbase,kernelstack。这四个东东构成了对于内核栈的维护。在线程里也有一个锁的域叫threalock,该域就是用来保护线程的数据成员。而这个域又跟进程的KPROCESS有着千丝万缕的联系,因为它会将线程指向所属进程的KPROCESS的结构。但凡与线程相关的属性都会变成相应域和属性,像contextswitcher环境切换,alerable唤醒线程状态,priority域包含了该线程的优先级值,这是动态的优先级值。还有Queue域是一个对列分发器对象,当该域不为空时则表示当前线程正在处理此队列中的对象。这里面还有许多的项就不在这里一一描述,对这些了解都是基于一种浅显的认识,如果想真正融会贯通去了解,想必真需要真枪实弹去做才会有真正的体会。总而言之,在内核层的进程和线程对象包含了系统资源管理和多控制流并发所执行到的基本信息,而没有包含与应用程序相关的信息。
(未完待续.........)