欢迎来到天天文库
浏览记录
ID:41033025
大小:40.00 KB
页数:26页
时间:2019-08-14
《windows多线程编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Windows多线程编程总结关键字:多线程线程同步线程池内核对象1内核对象1.1内核对象的概念内核对象是内核分配的一个内存块,这种内存块是一个数据结构,表示内核对象的各种特征。并且只能由内核来访问。应用程序若需要访问内核对象,需要通过操作系统提供的函数来进行,不能直接访问内核对象(Windows从安全性方面来考虑的)。内核对象通过Create*来创建,返回一个用于标识内核对象的句柄,这些句柄(而不是内核对象)可在创建进程范围内使用,不能够被传递到其他进程中被使用。1.2内核对象使用的计数因为内核对象的所有者是内核,
2、而不是进程,所以何时撤销内核对象由内核决定,而内核做这个决定的依据就是该内核对象是否仍然被使用。那么如何判断内核对象是否被使用呢?可以通过内核对象的“使用计数”属性,一旦这个值变成0了,内核就可以释放该对象了。1.3创建内核对象1.3.1进程与句柄表每个进程在初始化的时候,将被分配一个句柄表,该句柄表中只存储内核对象的句柄,不存储用户对象的句柄。句柄表的详细结构微软没有公布,但是大致包含三个内容:内核对象句柄,内核对象地址,访问屏蔽标志。微软为何要将内核对象的句柄设置为进程相关的呢?理由有:l不同的进程对内核对象的
3、访问权限是不同的,有必要区分对待l如果句柄是全局的,则一个进程可以控制另外一个进程的句柄,破坏另外一个进程的句柄。1.3.2创建内核对象及操作系统内部机制利用CreateSomeObject的函数来创建内核对象。调用该函数的时候内核就为该对象分配一个内存块,并进行初始化,然后内核再扫描该进程的句柄表,初始化一条记录并放在句柄表中。1.3.3进程中使用内核对象的内部机制假设函数F使用某个内核对象,其参数为Handle1,则该函数内部需要查找该进程的句柄表,找出参数句柄对应的记录,然后才能使用该内核对象。1.4关闭内核
4、对象无论进程怎样创建内核对象,在不使用该对象的时候都应当通过BoolCloseHandle(HANDLEhobj)来向操作系统声明结束对该对象的访问。为什么叫声明呢?是因为此时也许还有其他进程对该对象的访问,操作系统可能并不立即释放该对象。操作系统需要做的是:从进程的句柄表中删除该内核对象的记录,另外再考察该内核对象的使用计数以决定是否需要释放该对象。1.5内核对象的共享说到共享,与之孪生的就是共享权限。Windows内核对象的共享有三种方式:1.5.1继承式共享(父子进程间)只有当进程是父子关系的时候,才能使用此
5、种方式的共享。特别要注意的是继承的是内核对象的句柄,内核对象本身是不具备继承性。要达到这种继承的效果需要做以下几件事:l在进程创建内核对象的时候,需要一个安全结构sa(SECURITY_ATTRIBUTES类型,以向OS声明对象的访问方式)作为参数。继承式共享需要将结构的成员sa.bInheritHandle设置为TRUE。此时OS内部的处理式将进程的句柄表中的该对象的访问屏蔽字段设置成“可继承”。l在创建子进程(CreateProcess函数)时,设置创建参数bInheritHandles为TRUE。表示被创建的
6、子进程可以继承父进程中的所有可继承内核对象。OS内部的处理是:复制父进程句柄表中的记录到子进程的句柄表中,并使用相同的句柄值;为内核对象的使用计数器加1。特别说明:子进程能够继承的的内核对象仅局限于父进程创建它的时候所拥有的可继承内核对象。子进程诞生后,父进程再搞出什么可继承的东西,子进程是不能用的。这就需要在子进程中使用继承的内核对象的时候需要慎重,以确定内核对象是否已被继承了。利用SetHandleinformation方法可以随时修改内核对象句柄的一些属性,目前公开的句柄属性有两种,一种是该句柄是否能被继承,
7、另一种是该句柄是否能被关闭。1.5.2同名共享同名共享,不需要共享进程之间存在父子关系。但局限于内核对象是否支持这种共享方式。创建内核对象的Create函数中是否包含pszName是该内核对象是否支持同名共享的标志。l方法一:当Process1通过CreateObject(…”someName”)创建了一个名字为someName的内核对象后,Process2也调用了CreateObject(…”someName”),此时内核的动作是:在全局中查询发现已经存在someName1的对象;为Process2的句柄表添加一
8、条Ojbect的记录,使用的句柄不确定;为someName这个Object的引用计数器加1。l方法二:Process2使用OpenObject(…”someName”)的方式来获得对名someName的Object的句柄。用这种Open方法的时候,需要提供一个参数让OS鉴权,以判定是否能够以参数指定的方式来访问内核对象。1.5.3复制内核对象的句柄的方式共享
此文档下载收益归作者所有