複製鏈接
請複製以下鏈接發送給好友

纖程

鎖定
纖程包含獨立的目態棧,寄存器狀態的控制信息·目態控制的纖程轉接要求較高的編程經驗·由於纖程屬於目態對象,一個纖程被封鎖意味着所在線程被封鎖·應用程序可以通過ConvertThreadToFiber將線程轉換為纖程·與線程對比,纖程具有切換速度快的特點·
中文名
纖程
外文名
fiber
簡    介
用户級別的線程或輕進程
服    務
Microsoft公司添加了一種纖程

目錄

纖程簡介

在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核心編程