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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows核心编程 第十二章 纤程

發布時間:2025/6/17 windows 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows核心编程 第十二章 纤程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 2章 纖 程

????M i c r o s o f t公司給Wi n d o w s添加了一種纖程,以便能夠非常容易地將現有的 U N I X服務器應用程序移植到Wi n d o w s中。U N I X服務器應用程序屬于單線程應用程序(由 Wi n d o w s定義) ,但是它能夠為多個客戶程序提供服務。換句話說, U N I X應用程序的開發人員已經創建了他們自己的線程結構庫,他們能夠使用這種線程結構庫來仿真純線程。該線程包能夠創建多個堆棧,

保存某些C P U寄存器,并且在它們之間進行切換,以便為客戶機請求提供服務。

????顯然,若要取得最佳的性能,這些 U N I X應用程序必須重新設計,仿真的線程庫應該用Wi n d o w s提供的純線程來替代。然而,這種重新設計需要花費數月甚至更長的時間才能完成,因此許多公司首先將它們現有的 U N I X代碼移植到Wi n d o w s中,這樣就能夠將某些應用軟件推向Wi n d o w s市場。

????當你將U N I X代碼移植到Wi n d o w s中時,一些問題就會因此而產生。尤其是 Wi n d o w s管理線程的內存棧的方法要比簡單地分配內存復雜得多。 Wi n d o w s內存棧開始時的物理存儲器的容量比較小,然后根據需要逐步擴大。這個過程在第 1 6章“線程的堆棧”中詳細介紹。由于結構化異常處理機制的原因,代碼的移植就更加復雜了。

為了能夠更快和更正確地將它們的代碼移植到 Wi n d o w s中,M i c r o s o f t公司在操作系統中添加了纖程。本章將要介紹纖程的概念、負責操作纖程的函數以及如何利用纖程的特性。要記住,如果有設計得更好的使用Wi n d o w s自身線程的應用程序,那么應該避免使用纖程。

纖程的操作

? 首先要注意的一個問題是,實現線程的是Wi n d o w s內核。操作系統清楚地知道線程的情況,并且根據M i c r o s o f t定義的算法對線程進行調度。纖程是以用戶方式代碼來實現的,內核并不知道纖程,并且它們是根據用戶定義的算法來調度的。由于你定義了纖程的調度算法,因此,就內核而言,纖程采用非搶占式調度方式。

需要了解的下一個問題是,單線程可以包含一個或多個纖程。就內核而言,線程是搶占調度的,是正在執行的代碼。然而,線程每次執行一個纖程的代碼 — 你決定究竟執行哪個纖程(隨著我們講解的深入,這些概念將會越來越清楚) 。

?當使用纖程時,你必須執行的第一步操作是將現有的線程轉換成一個纖程。可以通過調用C o n v e r t T h r e a d To F i b e r函數來執行這項操作:

PVOID ConvertThreadToFiber(PVOID pvParam);

????該函數為纖程的執行環境分配相應的內存(約為2 0 0字節) 。該執行環境由下列元素組成:

? 一個用戶定義的值,它被初始化為傳遞給C o n v e r t T h r e a d To F i b e rp v P a r a m參數的值。

? 結構化異常處理鏈的頭。

? 纖程內存棧的最高和最低地址(當將線程轉換成纖程時,這也是線程的內存棧) 。

? CPU寄存器,包括堆棧指針、指令指針和其他。

? 當對纖程的執行環境進行分配和初始化后,就可以將執行環境的地址與線程關聯起來。該線程被轉換成一個纖程,而纖程則在該線程上運行。 C o n v e r t T h r e a d To F i b e r函數實際上返回纖程的執行環境的內存地址。雖然必須在晚些時候使用該地址,但是決不應該自己對該執行環境數據進行讀寫操作,因為必要時纖程函數會為你對該結構的內容進行操作。現在,如果你的纖程(線程)返回或調用E x i t T h r e a d函數,那么纖程和線程都會終止運行。

? 除非打算創建更多的纖程以便在同一個線程上運行,否則沒有理由將線程轉換成纖程。若要創建另一個纖程,該線程(當前正在運行纖程的線程)可以調用 C r e a t e F i b e r函數:

PVOID CreateFiber(

????DWORD dwStackSize,

????PFIBER_START_POUTINE pfnStartAddress,

????PVOID pvParam);

? C r e a t e F i b e r首先設法創建一個新內存棧,它的大小由d w S t a c k S i z e參數來指明。通常傳遞的參數是0,按照默認設置,它創建一個內存棧,其大小可以擴展為 1 M B,不過開始時有兩個存儲器頁面用于該內存棧。如果設定一個非0值,那么就用設定的大小來保存和使用內存棧。接著,C r e a t e F i b e r函數分配一個新的纖程執行環境結構,并對它進行初始化。該用戶定義的值被設置為傳遞給C r e a t e F i b e rp v P a r a m參數的值,新內存棧的最高和最低地址被保存,同時,纖程函數的內存地址(作為p f n S t a r t A d d r e s s參數來傳遞)也被保存。P f n S t a r t A d d r e s s參數用于設定必須實現的纖程例程的地址,它必須采用下面的原型:

VOID WINAPI FiberFunc(PVOID pvParam);

? 當纖程被初次調度時,該函數就開始運行,并且將原先傳遞給 C r e a t e F i b e rp v P a r a m的值傳遞給它。可以在這個纖程函數中執行想執行的任何操作。但是該函數的原型規定返回值是V O I D,這并不是因為返回值沒有任何意義,而是因為該函數根本不應該返回。如果纖程確實返回了,那么線程和該線程創建的所有纖程將立即被撤消。

C o n v e r t T h r e a d To F i b e r函數一樣,C r e a t e F i b e r函數也返回纖程運行環境的內存地址。 但是,與C o n v e r t T h r e a d To F i b e r不同的是,這個新纖程并不執行,因為當前運行的纖程仍然在執行。在單個線程上,每次只能運行一個纖程。若要使新纖程能夠運行,可以調用 Switch To Fiber函數:

VOID SwitchToFiber(PVOID pvFiberExecutionContext);

Switch To Fiber函數只有一個參數,即 p v F i b e r E x e c u t i o n C o n t e x t,它是上次調用C o n v e r t T h r e a d To F i b e rC r e a t e F i b e r函數時返回的纖程的執行環境的內存地址。該內存地址告訴該函數要對哪個纖程進行調度。S w i t c h To F i b e r函數在內部執行下列操作步驟:

1) 它負責將某些當前的C P U寄存器保存在當前運行的纖程執行環境中,包括指令指針寄存器和堆棧指針寄存器。

2) 它將上一次保存在即將運行的纖程的執行環境中的寄存器裝入 C P U寄存器。這些寄存器包括堆棧指針寄存器。這樣,當線程繼續執行時,就可以使用該纖程的內存棧。

3) 它將纖程的執行環境與線程關聯起來,線程運行特定的纖程。

4) 它將線程的指令指針設置為已保存的指令指針。線程(纖程)從該纖程上次執行的地方開始繼續執行。

? S w i t c h To F i b e r函數是纖程獲得C P U時間的唯一途徑。由于你的代碼必須在相應的時間顯式調用S w i t c h To F i b e r函數,因此你對纖程的調度可以實施全面的控制。記住,纖程的調度與線程調度毫不相干。纖程運行所依賴的線程始終都可以由操作系統終止其運行。當線程被調度時,當前選定的纖程開始運行,而其他纖程則不能運行,除非顯式調用 S w i t c h To F i b e r函數。若要撤消纖程,可以調用D e l e t e F i b e r函數:

VOID DeleteFiber(PVOID pvFiberExecutionContext);

? 該函數用于刪除p v F i b e r E x e c u t i o n C o n t e x t參數指明的纖程,當然這是纖程的執行環境的地址。該函數能夠釋放纖程棧使用的內存,然后撤消纖程的執行環境。但是,如果傳遞了當前與線程相關聯的纖程地址,那么該函數就在內部調用 E x i t T h r e a d函數,該線程及其創建的所有纖程全部被撤消。

? D e l e t e F i b e r函數通常由一個纖程調用,以便刪除另一個纖程。已經刪除的纖程的內存棧將被撤消,纖程的執行環境被釋放。注意,纖程與線程之間的差別在于,線程通常通過調用E x i t T h r e a d函數將自己撤消。實際上,用一個線程調用 Te r m i n a t e T h r e a d函數來終止另一個線程的運行,是一種不好的方法。如果你確實調用了 Te r m i n a t e T h r e a d函數,系統并不撤消已經終止

運行的線程的內存棧。可以利用纖程的這種能力來刪除另一個纖程,后面介紹示例應用程序時將說明這是如何實現的。

????為了使操作更加方便,還可以使用另外兩個纖程函數。一個線程每次可以執行一個纖程,操作系統始終都知道當前哪個纖程與該線程相關聯。如果想要獲得當前運行的纖程的執行環境的地址,可以調用G e t C u r r e n t F i b e r函數:

? ? ?PVOID GetCurrentFiber();

? 另一個使用非常方便的函數是G e t F i b e r D a t a

? ? ?PVOID GetFiberData();

? 前面講過,每個纖程的執行環境包含一個用戶定義的值。這個值使用作為 C o n v e r t T h r e a dTo F i b e rC r e a t e F i b e rp v P a r a m參數而傳遞的值進行初始化。該值也可以作為纖程函數的參數來傳遞。G e t F i b e r D a t a只是查看當前執行的纖程的執行環境,并返回保存的值。

? 無論G e t C u r r e n t F i b e r還是G e t F i b e r D a t a,運行速度都很快,并且通常是作為內蘊函數(infrinsic funcfion)來實現的,這意味著編譯器能夠為這些函數生成內聯代碼。

?

總結

以上是生活随笔為你收集整理的Windows核心编程 第十二章 纤程的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 免费爱爱网站 | 亚洲一区二区色图 | 肉感丰满的av演员 | 激情九月天 | 亚洲成人网在线 | 国产精品无码av在线有声小说 | 一本亚洲 | 饥渴丰满的少妇喷潮 | 欧美群妇大交乱 | 亚洲五码av | 一本久久a精品一合区久久久 | 国产一区二区三区小说 | 91精品推荐 | 传媒av在线 | 天天干天天谢 | 三年大片在线观看 | 亚洲第一视频在线观看 | 国产一道本| 在线观看日韩中文字幕 | 岛国二区三区 | 亚洲熟妇丰满大屁股熟妇 | 中文字幕欧美人妻精品 | 波多野结衣在线一区二区 | 精品国产18久久久久久 | 日本一区二区视频免费 | 熟女视频一区二区三区 | 视色影视| 日韩丰满少妇无码内射 | 日本xx视频 | 99热免费 | 久久合合 | 91丨九色丨海角社区 | 男女无遮挡网站 | 中国国产毛片 | 情趣五月天 | 午夜在线免费观看视频 | 乳孔很大能进去的av番号 | 天天干天天摸 | 色图在线观看 | 日韩喷潮 | 久久综合国产 | 毛片在线视频观看 | 一色屋免费视频 | 男人靠女人免费视频网站 | 在线中文字幕亚洲 | 国产一级自拍视频 | 97色在线 | 看黄色大片| 国产成人在线播放视频 | 99热热热热| аⅴ天堂中文在线网 | 中文字幕一区久久 | 国产精品精品 | 四虎影视在线 | 亚洲精品aaaaa| 日本最黄网站 | 久久久久久九九 | 97国产超碰| 亚洲第一成年人网站 | 天堂中文在线8 | 天天射日日射 | 国产1区2区3区4区 | 丝袜天堂 | 丝袜老师让我了一夜网站 | 久久影片 | 夜夜草影院 | 极品少妇一区二区三区 | 自拍视频在线观看 | 亚洲视频 欧美视频 | 天堂久久爱| 91国产丝袜播放在线 | 国产一区不卡 | 9久久精品| 中文字幕一区二区三区人妻在线视频 | 四虎av影视 | 日韩av网站大全 | 日韩少妇av | 国产传媒第一页 | 污污视频在线观看免费 | 女生裸体无遮挡 | 少妇又紧又色又爽又刺激 | 99视频这里有精品 | 日韩一区av在线 | 夜夜骑av| 中国白嫩丰满人妻videos | 热热色原网址 | 污污网站免费在线观看 | 亚洲国产综合视频 | 午夜久久精品 | 咪咪成人网 | missav | 免费高清av在线看 | 欧美四级在线观看 | www.色偷偷| 欧美网站免费 | 国产区av| 日韩91| 免费视频久久 | 国产精品对白刺激久久久 | 亚洲熟妇一区二区 |