进程句柄
- 句柄是什么
- 为什么需要句柄
- 作用
句柄是什么
先给结论,句柄(handle)实际上是一个指向指针的指针。
它指向进程所要访问的进程对象的地址,是用来找到目标进程的索引,当我们想要访问对象进程时,就要利用存储在本进程中的句柄来找到对象进程。
为什么需要句柄
图片来源,感谢@whitelc的分享
图1是程序运行到某时刻的内存快照。
图2是该程序运行一段时间后的内存快照。
由上图可知,想要访问的进程对象的地址是会变化的。这是由于操作系统为了实现虚拟内存需要不断地将内存中的数据与外存进行调度,而每次调入内存的数据是不会存放到相同位置的(为了提高效率)。这就需要每个进程在自己的进程空间内开辟一块区域专门存储目标进程的地址,并且这块区域要维护目标进程地址的变化以应对下一次访问的需求,而这块区域内的每一个32位无符号整型数(32位系统中)就对应一个句柄,而这块区域就是句柄表。
作用
以windows系统为例,句柄就是用来标识进程对象的一个序号,用来找到目标进程。同时,它并不唯一标识一个目标进程。
例如,进程A和进程B都需要访问进程C,那么,进程A和进程B的句柄表中都会保存指向进程C的句柄,而这两个句柄以及它们指向的地址是不同的,但是他们指向的地址中存放的目标进程地址是相同的,这句话有点绕,因为句柄表中的句柄并不是直接指向目标进程的PCB的,它指向的是目标进程PCB的地址。
套用之前看过的博客当中的原话(具体哪一篇记不清了😥,没有引用,请原作者见谅):
句柄地址(稳定)->记载着对象在内存中的地址(不稳定)->实际对象。