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

                                              60 进程和线程(5)

好了,该说说执行体层次的进程和线程的处理结构了。在执行体这端,数据结构是EPROCESS,这也是一个相对比较复杂的结构体。首先会有一个域会专门与之前提到的内核进程的KPROCESS的对象地址相对应,对于一个进程而言,不管是内核和执行地址肯定都是一样的。但区别就是在于锁的区别,关于锁的介绍会单独找一个篇幅来介绍。在这个结构体中有个叫Rundownprotect,该域就是进程的停止保护锁,当一个进程到最后被销毁时,它要等到所有进程和线程已经释放了此锁,才能进行。这里很有意思的是QuotaUsage和QuotaPeak,这两个域是干什么的,前者是进程的内存使用量,后者是用来记录内存使用峰值的。这两个域主要是用来非换页内存池和换页内存池,交换文件内存使用的。执行层的进程就有一个特点,当进程加入到一个系统会话时,就会用到SessionProcessLinks域,该域是一个双链表的结构。该结构中有一个域叫workingSerWatch用来监视一个进程的页面错误,如果启用该页面错误监视功能,则每次发生错误的情况都会记录到该域中去。还有一个域就是用来维护进程的局部描述的,叫WorkingSetWatch域。当然最为重要的我认为还是这个叫joblink的域,这是一个双链表的头结点,该链表包含了一个进程中的所有线程,它所指向链表包含的各个子线程的节点。就是因为它的存在让内核层和执行层之间保持着某种独立的联系。在这个结构体中有许多项的内容,事实上执行层的进程也是最为复杂的。因为它涉及到了相关的进程和线程的对象,而且也包括了更多相关的管理信息。在执行层的进程中,主要有唯一标识、映像文件、相关的锁、和物理内存与虚拟内存相关联的成员。进程对象也包含了链表所指向的线程,从而实现了进程与线程的关联。

在winodws OS中,每种对象都是一种特属的类型对象,类型对象定义了对象的特性和方法。对象管理器也定义了一个全局名字的空间,根据名称来解析对象的机制。所以在对象管理器中都是执行体的对象,它们都位于系统空间;在进程空间不能通过地址来引用它们。所以在Windows中有个专门的称呼--句柄。这样就很好理解进程的管理机制了。当一个进程用名称来打开一个对象时,将获得一个句柄,该句柄指向所创建或打开的对象。之后进程就不需要用名称来引用对象,只需要使用句柄即可。这样方式很明显的能够提高引用对象的效率。而这个句柄也是我在初次学习windows编程时使用频率最多的一个词汇。句柄是进程范围的对象引用,在进程的生存周期是有效的。当进程把句柄传递给另一个进程时,实际上这个句柄值就失效了。其实句柄在windows中实现也类似于一个索引,所有的索引都指向了一个句柄表。一个进程的句柄表包含了被该进程打开的服务对象指针。句柄的定义在windows多个版本还是有些区别,大多都是多层结构。句柄的存在也让对象引用技术多了一种方法。对于一个句柄,它的生命周期从被插入到句柄表中开始的一直到它被关闭,在此过程中对象的引用技术包含了一份引用。当然句柄作为对象引用的容器外还有一个用法,那就是作为分配线程和进程的唯一ID。每个进程都有唯一的ID,这个ID是调用ExCreateHandle产生的,在一个全局的句柄表创建的句柄索引值。这也是在一个全局的句柄表中pspcidtable中创建的,该句柄表中的每项都包含了进程和线程的对象地址。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值