首页 > 其他分享 >什么是句柄

什么是句柄

时间:2024-02-23 20:45:18浏览次数:21  
标签:Handle 对象 句柄 什么 地址 内核 进程

什么是句柄

从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别地翻译成"句柄",其实还是个"柄"。形象为 从一个小东西拎起一大堆东西;

指针其实也是一种"句柄",只是由于指针同时拥有更特殊的含义——实实在在地对应内存里地一个地址——所以,通常不把指针说成是"句柄"。但指针也有着能从一个32位的值引用到一大堆数据的作用,这不是句柄又是什么?

Windows系统中有许多内核对象(这里的对象不完全等价于"面向对象程序设计"一词中的"对象",虽然实质上还真差不多),比如打开的文件,创建的线程,程序的窗口,等等。这些重要的对象肯定不是4个字节或者8个字节足以完全描述的,他们拥有大量的属性。为了保存这样一个"对象"的状态,往往需要上百甚至上千字节的内存空间,那么怎么在程序间或程序内部的子过程(函数)之间传递这些数据呢?拖着这成百上千的字节拷贝来拷贝去吗?显然会浪费效率。那么怎么办?当然传递这些对象的首地址是一个办法,但这至少有两个缺点:

1、暴露了内核对象本身,使得程序(而不是操作系统内核)也可以任意地修改对象地内部状态(首地址都知道了,还有什么不能改的?),这显然是操作系统内核所不允许的;
2、操作系统有定期整理内存的责任,如果一些内存整理过一次后,对象被搬走了怎么办?

所以,Windows操作系统就采用进一步的间接:在进程的地址空间中设一张表,表里头专门保存一些编号和由这个编号对应一个地址,而由那个地址去引用实际的对象,这个编号跟那个地址在数值上没有任何规律性的联系,纯粹是个映射而已。

在Windows系统中,这个编号就叫做"句柄"。

Handle在Windows中的含义很广泛,以下关于谈到的Handle除非特别说明,将仅限于进程、线程的上下文中。

1、先来谈谈Handle

Handle本身是一个32位的无符号整数,它用来代表一个内核对象。它并不指向实际的内核对象,用户模式下的程序永远不可能获得一个内核对象的实际地址(一般情况下)。那么Handle的意义何在?它实际上是作为一个索引在一个表中查找对应的内核对象的实际地址。那么这个表在哪里呢?每个进程都有这样的一个表,叫句柄表。该表的第一项就是进程自己的句柄,这也是为什么你调用GetCurrentProcess()总是返回0x7FFFFFFF原因。

简单地说,Handle就是一种用来"间接"代表一个内核对象的整数值。你可以在程序中使用handle来代表你想要操作的内核对象。这里的内核对象包括:事件(Event)、线程、进程、Mutex等等。我们最常见的就是文件句柄(file handle)。

另外要注意的是,Handle仅在其所属的进程中才有意义。将一个进程拥有的handle传给另一个进程没有任何意义,如果非要这么做,则需要使用DuplicateHandle(),在多个进程间传递Handle是另外一个话题了,与这里要讨论的无关。

2、进程ID

首先,进程ID是一个32位无符号整数,每个进程都有这样的一个ID,并且该ID在系统范围内是唯一的。系统使用该ID来唯一确定一个进程。

深入些说,系统可能使用进程ID来计算代表该进程的内核对象的基地址(及EPROCESS结构的基地址),具体的计算公式你可以去问微软的OS开发人员。

3、HINSTANCE

HINSTANCE也是一个32无符号整数,它表示程序加载到内存中的基地址。

标签:Handle,对象,句柄,什么,地址,内核,进程
From: https://www.cnblogs.com/panjiewen/p/18030336

相关文章

  • 开源的表单设计器拥有什么显著特点?
    开源的表单设计器的特点是什么?广州流辰信息是专业研发低代码技术平台的服务商,可以为企业提供系统开发、数据治理、数据分析各环节技术和方案支撑。为了帮助大家了解开源的表单设计器的相关优势特点,小编将为大家做一个详细介绍。什么是开源的表单设计器?都有哪些功能和作用?表单工具......
  • SSR解决了什么问题?有做过SSR吗?你是怎么做的?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一、是什么Server-SideRendering 我们称其为SSR,意为服务端渲染指由服务侧完成页面的 HTML 结构拼接的页面处理技术,发送到浏览器,然后为其绑定状态与事件,成为完全可交互页面的过程先来看看Web3个阶段的发展史:......
  • 什么是Java中的SPI机制
    SPI,全称ServiceProviderInterface,是Java中提供的一种服务发现机制它允许应用程序动态地加载和使用第三方提供的服务实现,而无需在代码中引用这些实现类。JavaSPI是基于接口编程思想的具体体现,通过将服务接口和其实现分离,从而具备更好的可扩展性和可维护性如何定义一个Java......
  • 一图揭秘为什么开发者都选择华为云软件开发生产线CodeArts
    华为云软件开发生产线CodeArts是一站式、全流程、安全可信的云原生DevSecOps云平台,集华为30年研发实践、前沿研发理念、先进研发工具为一体,覆盖需求、开发、测试、部署等软件交付全生命周期环节,为开发者打造全云化研发体验。体验通道→软件开发生产线CodeArts_DevOps_开发者平......
  • let、const、var、function所谓的”变量提升“、暂时性死区到底是什么
    今天看了大佬一个文章我用了两个月的时间才理解let-知乎(zhihu.com),文章中其实说得很清楚,还有大佬解决这个问题的整个心路历程。我这里做一个总结记录,专注于“变量提升”、暂时性死区这两个点做一个讨论。现象讨论下面这两段代码,我们都知道这段代码在控制台会打印undefined......
  • 机器学习策略篇:详解为什么是ML策略?(Why ML Strategy?)
    为什么是ML策略?从一个启发性的例子开始讲,假设正在调试的猫分类器,经过一段时间的调整,系统达到了90%准确率,但对的应用程序来说还不够好。可能有很多想法去改善的系统,比如,可能想去收集更多的训练数据吧。或者会说,可能的训练集的多样性还不够,应该收集更多不同姿势的猫咪图片,或者更......
  • 2024.2.22 梦想 在什么地方 总是那么令人向往
    字符串太难了。今天早上起来牙又疼了,很难受。UOJ461考虑当前已经把整张图分成了\(L,R\)两个点集,考虑extend一个点进来。可以使用二分的方式,具体的将未加入的点按任意顺序排列,二分一个前缀并断掉\(L,R\)与这个前缀的所有边,找到一个最小的前缀满足此时不连通,此时对于这个......
  • 什么是PendSV
    什么是PendSV一、什么是PendSVPendSV是可悬起异常,如果我们把它配置最低优先级,那么如果同时有多个异常被触发,它会在其他异常执行完毕后再执行,而且任何异常都可以中断它。更详细的内容在《Cortex-M3权威指南》里有介绍,下面我摘抄了一段。OS可以利用它“缓期执行”......
  • Vue中的$nextTick有什么作用?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助一、NextTick是什么官方对其的定义在下次DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的DOM什么意思呢?我们可以理解成,Vue 在更新 DOM 时是异步执行的。当数据发生变化,Vu......
  • 在k8S中,使用kubectl logs无法查看日志是什么原因,如何让其能够查看?
    在Kubernetes(k8S)中,使用kubectllogs命令无法查看Pod日志的原因可能有多种。以下是一些常见原因及其相应的排查和解决方法:Pod状态问题:检查Pod是否处于Running状态。如果Pod处于Pending、CrashLoopBackOff或其他非运行状态,日志可能无法获取。确保Pod正常启......