纖程

纖程

纖程包含獨立的目態棧,暫存器狀態的控制信息·目態控制的纖程轉接要求較高的編程經驗·由於纖程屬於目態對象,一個纖程被封鎖意味著所線上程被封鎖·應用程式可以通過ConvertThreadToFiber將執行緒轉換為纖程·與執行緒對比,纖程具有切換速度快的特點·

簡介

在Windows2000/XP中,纖程(fiber)相當於用戶級別的執行緒或輕進程.纖程由Win32庫函式支持,對核心是不可見的.纖程可以通過SwitchToFiber切換至另一合作纖程,以實現合作纖程之間的協同.

服務

Microsoft公司給Windows添加了一種纖程,以便能夠非常容易地將現有的UNIX伺服器應用程式移植到Windows中。UNIX伺服器應用程式屬於單執行緒應用程式(由Windows定義),但是它能夠為多個客戶程式提供服務。換句話說, UNIX應用程式的開發人員已經創建了他們自己的執行緒結構庫,他們能夠使用這種執行緒結構庫來仿真純執行緒。該執行緒包能夠創建多個堆疊,保存某些C P U暫存器,並且在它們之間進行切換,以便為客戶機請求提供服務。

顯然,若要取得最佳的性能,這些UNIX應用程式必須重新設計,仿真的執行緒庫應該用Windows提供的純執行緒來替代。然而,這種重新設計需要花費數月甚至更長的時間才能完成,因此許多公司首先將它們現有的UNIX代碼移植到Windows中,這樣就能夠將某些套用軟體推向Windows市場。

使用纖程

執行緒是在Windows核心中實現的,纖程是在用戶模式下實現的,核心對纖程一無所知,核心會根據我們定義的算法來對纖程進行調度。

一個執行緒可以包含一個或多個纖程。

轉化執行緒為纖程

使用纖程的第一個步驟是將已有的執行緒轉換為一個纖程。ConvertThreadToFiber這個函式會為纖程的上下文分配記憶體,這個上下文的構成是:

# 一個用戶自定義的值

# 結構化異常處理鏈的頭

# 纖程棧的頂部和底部的記憶體地址

# 某些CPU暫存器,其中包括棧指針、指令指針以及其他暫存器

當我們分配了纖程執行上下文並對其進行初始化之後,還必須將執行上下文的地址與執行緒關聯起來。這樣我們就將執行緒轉換成了一個纖程,該纖程在這個執行緒中執行。

其實,除非我們打算創建更多的纖程,並讓它們在同一個執行緒中運行,否則沒有理由將一個執行緒轉換為纖程。

CreateFiber:創建一個纖程

SwitchToFiber:將當前控制轉移到指定纖程(同一個執行緒中,同一時刻只能執行一個纖程)

DeleteFiber:通常由一個纖程調用,用來刪除另一個纖程

GetCurrentFiber:獲取當前調用所在的纖程

常見問題

當你將UNIX代碼移植到Windows中時,一些問題就會因此而產生。尤其是Windows管理執行緒的記憶體棧的方法要比簡單地分配記憶體複雜得多。Windows記憶體棧開始時的物理存儲器的容量比較小,然後根據需要逐步擴大。這個過程在第16章“執行緒的堆疊”中詳細介紹。由於結構化異常處理機制的原因,代碼的移植就更加複雜了。

為了能夠更快和更正確地將它們的代碼移植到Windows中,Windows公司在作業系統中添加了纖程。本章將要介紹纖程的概念、負責操作纖程的函式以及如何利用纖程的特性。要記住,如果有設計得更好的使用Windows自身執行緒的應用程式,那么應該避免使用纖程。

以上引自《Windows核心編程》

相關詞條

相關搜尋

熱門詞條

聯絡我們