详解窗口句柄,进程ID,进程句柄,窗口与进程之间的关系

窗口句柄:

在Windows或Linux等操作系统下窗口句柄对应着每个窗口的钥匙,例如,你要对某一个窗口进行操作,你必须知道你要操作哪一个窗口,这里就拿Windows做举例,Windows下几乎会创建许许多多个窗口,但是我们怎么知道我们操作的是哪个窗口?

答:就是窗口句柄,每个窗口在被创建出来之后就会被赋予一个句柄,该句柄(句柄实则上是一个指针)指向一个数据结构体,结构体里明确表示着该窗口的各种信息,窗口大小,窗口名等,当我们得到这个句柄时就可以请求操作系统对它做一系列操作,列如:移动窗口,关闭窗口,最小化最大化等,这些都是通过窗口句柄来告诉操作系统的,我们要对哪个窗口进行操作,而消息则是告诉操作系统要做什么样的操作,消息的附加参数就是操作值,列如移动窗口,会有附加的xy坐标参数!

进程ID:

进程ID是当一个进程被创建出来时系统内核为其分配的一个名字/绰号,且进程分配的首地址在GDT(局域的叫LDT,详细可以查看: 详解:物理地址,虚拟地址,内存管理,逻辑地址之间的关系)表中,进程ID会被保存到该进程的PCB进程控制块中(线程的会存放到:TCB线程控制块中,都是一个数据结构体包含:

  • 程序计数器:接着要运行的指令地址。
  • 进程状态:可以是new、ready、running、waiting或 blocked等。
  • CPU暂存器:如累加器、索引暂存器(Index register)、堆栈指针以及一般用途暂存器、状况代码等,主要用途在于中断时暂时存储数据,以便稍后继续利用;其数量及类因电脑架构有所差异。
  • CPU排班法:优先级、排班队列等指针以及其他参数。
  • 村粗气管理:如标签页表等。
  • 会计信息:如CPU与实际时间之使用数量、时限、账号、工作或进程号码。
  • 输入输出状态:配置进程使用 I/O设备,如磁带机。  

),当操作系统想要操作某个进程时会通过进程ID来指定要操作哪个进程!

进程句柄:

进程句柄与窗口句柄不一样,这里先解释一下上面是进程句柄:进程句柄指向进程下的PCB进程控制块,当我们要对进程进行I/O操作时候时候需要知道进程的堆栈地址范围以及状态才能的值对应的LDT/GDT并转化为物理地址(或通过段选择符进行转换详细:详解:物理地址,虚拟地址,内存管理,逻辑地址之间的关系),操作系统才能为我们对该进程进行读写操作,所以一般我们会通过进程ID来获取进程句柄(临时的),来对进程进行操作。

操作系统会通过进程ID来遍历进程下的PCB进程控制块看一下该进程属于哪个GDT下的LDT表中,找到之后会将该进程的PCB进程控制块地址返回给获取者!

注意:进程ID在创建时就会规定好,其ID是按照进程创建顺序来分配的,用完后会被回收二次分配,进程句柄不是,当我们获取某个进程的句柄时,操作系统会将PCB进程控制块地址返回给获取者,获取者需要通过指针来接收它,指针占用的空间是占用的是自己进程下的!所以当我们用完释放,二次获取时候句柄的地址就会发生改变,但句柄指向的地址不会发生改变(是因为PE文件映射关系,详细请查看PE文件格式映射原理,在PE文件格式中PCB进程控制块的映射位置是:0x64(100)),句柄等于指针!

窗口与进程之间的关系

一个窗口对应一个进程,就拿人来做形容吧

人都有一个身体和大脑,身体是对外展示的,而大脑是在控制身体应该怎样对外展示,所以窗口就是对用户进行可视化界面交互的,而进程里的数据和指令在控制着窗口应该怎样交互!