詳解窗口句柄,進程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)),句柄等於指針!

窗口與進程之間的關係

一個窗口對應一個進程,就拿人來做形容吧

人都有一個身體和大腦,身體是對外展示的,而大腦是在控制身體應該怎樣對外展示,所以窗口就是對用戶進行可視化界面交互的,而進程裏的數據和指令在控制着窗口應該怎樣交互!