Closehandle的 内核对象 和句柄表
效率依然不高。。。。
看书3小时 看看能总结出来啥
句柄表的设计应该算是一种保护
为了不让用户直接操作对象 而选择一种中转得方式
写个伪代码吧
建立文件对象(参数)// Createfile
{
文件内核对象 = 内核建立文件对象(参数);
文件句柄 = 分配一个句柄(文件内核对象);//这里说是一个3层的表的 A[255][255][255]
return 句柄
}
//如果直接返回文件对象 这样用容易修改里边内容 结构体嘛 指针指之 销魂啊
把一些想公开给用户的操作 封装一下 就OK了
这样就隔离了用户对资源的直接操作 // 这个应该是重点吧
哦了 忘说了一个事啊
进程句柄表里边的值 只对当前进程句柄表有效
如果你把A进程里的句柄值 给B用 会发生不可预料的事
A[句柄1段][句柄2段][句柄3段] = => A文件对象
B[句柄1段][句柄2段][句柄3段] ==> B文件对象 OR 空
不可预料啊
//伪代码
closehandle(句柄)
{
BOOL 有效 = 查找当前句柄表(句柄, (OUT ) 内核对象);
IF(! 有效)
RETURN FALSE;
内核对象-》内核对象计数 = 内核对象-》内核对象计数-1;
if(内核对象-》内核对象计数 ==0)
销毁内核对象; //出来混的 迟早还是要换的
A[句柄1段][句柄2段][句柄3段] = NULL;
RETURN TRUE;
}
内核对象属于系统资源 是归系统所有 不是单独归哪个进程所有 //好像不太对
所以可能同一个内核对象 被 不同进程使用 但是句柄表不同(可能几率小)
至于内核对象和句柄谁活的长 内核对象肯定活的长一点
一是 A进程释关闭一个句柄 本进程不在调用 但是有其他进程还在继续使用这个对象 所以对象还在
关闭线程的句柄 但是线程不会结束 指到线程结束或EXITTHEAD
这里还是不太理解 说是建立线程的时候内核对象引用计数为2 你CLOSE减1 还有一个 只要线程结束掉 在减1 所以没线程没结束
哦 句柄表和ID的问题 ID是全局唯一 句柄是进程唯一
好乱啊
睡觉 明天在看看