线程核心对象

内核对象的句柄
看了前面几为大虾讨论ID和HANDLE的帖子,忍不住跳出来喊两声。
我的主要观点来自于《Advanced Windows, 3rd edition》Jeffrey Richter著

内核对象:
内核对象是由系统分配的一块内存,必须有系统来维护和访问。一般由Create*开
头的API函数
来创建。象进程、线程、文件、文件映射、事件、互斥量、信号量、管道、邮槽
等都是内核对象。
内核对象是系统级的,独立于进程。也就是说,任何一个进程创建了一个内核对
象,理论上讲,
其他进程都应该能访问,只要进程获得该内核对象的句柄。事实上,NT就是通过
对句柄的种种
限制,来达到安全的目的。

句柄:
句柄是在创建内核对象是返回的标志该内核对象的量。在VC中定义为 
typedef void* HANDLE
句柄是和进程相关的。如果不采取特别的处理,句柄离开创建它的进程,就毫无
意义了。

进程是如何维护句柄的呢:(下面说的是大致原理,并不意味着系统就是这样实
现的)
在windows系统中,每一个进程都维护一内核对象句柄表。创建内核对象时,系统
扫描这张表,
挑一个空白项填充。返回这个填充项的索引,也就是句柄。这就是为什么我们看
到的句柄值总是
0X0000002F之类的值的原因。这个进程中A索引(句柄)有效,但另外进程同样索
引(句柄)处
并不一定有效。所以说句柄是进程相关的。句柄当然不是简单的索引,不过可以
这样理解。

这样也很容易理解内核对象并不一定随着句柄的关闭(CloseHandle())而释放,
有可能别的进程
还在通过另外的句柄----不管是什么途径得到的----在访问同一内核对象。系统
确保没有任何进程
访问时,才释放内核对象。

线程是一个内核对象,它的句柄并没有什么特别的含义。可以从A进程得到B进程
创建的一个线程
的句柄(通过继承,或复制),这样就有两个句柄指向该线程内核对象,都可以
操纵该线程(我
从未试过,因为没遇到非要操纵另一个进程中线程的情况)。这两个句柄(我个
人理解)可以相同
也可以不同,这取决于A,B进程中内核对象句柄表。但线程ID,却是系统中唯一
的量,用它来区别
开另外的线程。(我对ID了解不多,还望诸位大虾大力斧正)

--
                   ("`-''-/").___..--''"`-._ 
                    `@_ @  )   `-.  (     ).`-.__.`) 
                    (_Y_.)'  ._   )  `._ `. ``-..-' 
                  _..`--'_..-_/  /--'_.' ,' 
            ____(il),-''  (li),'  ((!.-'  

※ 来源:.月光软件站  http://www.moon-soft.com.[FROM: 202.96.180.120]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值