日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程的数据结构

發布時間:2024/4/11 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程的数据结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

除非顯式地聲明,否則,你可以假設以下討論的內容既適合用戶模式的線程,也適用于內核模式的線程。

在系統級別上,Windows線程是由一個線程塊執行體(ETHREAD)來表示的,如圖6.7所示。ETHREAD塊和它所指向的結構都位于系統地址空間中,唯一的例外是線程環境快(TEB),它位于進程地址空間中。而且,Windows子系統進程(Csrss)為Windows進程中創建的每個線程維護了一個平行結構。另外,對于那些調用了任何一個Windows子系統USER或GDI函數的線程,Windows子系統內核模式部分(Win32k.sys)為它維護了一個稱為W32THREAD的數據結構,線程的ETHREAD塊指向此結構。

圖6.7中的大多數字段的意義已經很明了,不用多說了。第一個字段是內核線程塊(KTHREAD)。緊隨其后的是線程標識信息、進程標識信息(包括一個指向所有進程的指針,因而可以訪問它的環境信息)、安全信息(包括一個指向訪問令牌的指針以及身份模擬信息),最后是與LPC消息和待處理I/O請求有關的字段。關于ETHREAD塊的信息,你可以使用內核調試器的lkd> dt nt!_ethread(對應進程的是_eprocess)命令來顯示其數據結構。

現在讓我們來看一看兩個關鍵的線程數據結構:KTHREAD和TEB。KTHREAD塊包含了Windows內核為這些正在運行的線程執行線程調度和同步而需要訪問的信息。它的布局結構如圖6.8所示。

關于KTHREAD塊的信息,你可以使用內核調試器的lkd> dt nt!_kthread(對應進程的是_kprocess)命令來顯示其數據結構。

圖6.9所示的TEB是本節中介紹的唯一位于進程地址空間中的數據結構。

TEB存儲了有關映像加載器和各種Windows DLL的環境信息。因為這些組件運行在用戶模式下,所以它們需要一個在用戶模式下可寫的數據結構。為什么該結構位于進程地址空間中而不是位于系統地址空間中呢?因為系統空間只能在內核模式下才可寫。通過內核調試器的lkd> dt nt!thread命令你可以看到TEB的地址,同樣,你也可以用lkd> dt nt!_teb(對應進程的是_peb)命令來查看TEB的數據結構。

線程的上下文

線程的上下文本質上是一組處理器的寄存器,有正在執行程序中的指針及堆棧指針。上下文及其轉換的過程根據處理器的結構不同會有所不同。我們可以調用內核調試器的lkd> dt nt!_context命令來觀察上下文的數據結構。

一個典型的上下文轉換需要保存和重載以下的數據:

  • 程序計數器;
  • 處理器狀態寄存器;
  • 其他寄存器的內容;
  • 用戶模式和內核模式的棧指針;
  • 指向運行的線程的地址空間的指針,也就是進程的頁表項。

內核將舊線程的這些信息保存到當前內核模式的屬于舊線程的棧中,然后更新棧指針,再將

棧指針保存到舊線程的KTHREAD模塊中。接著,內核棧指針就會指向新線程的內核棧,新線程的上下文將被裝載。如果新的線程是屬于不同的進程,系統將裝載它的頁表目錄項到一個特殊的處理器寄存器中,讓它的地址空間有效。如果有需要發送的內核APC被掛起,中斷級別是1的中斷產生。否則,控制權將交給新線程保存的程序計數器,線程重新執行。

?

說明:

本文摘自《Windows Internals》第6章《進程、線程和作業》6.1《線程的內部機理》

總結

以上是生活随笔為你收集整理的线程的数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。