DragonFly 是一個以與 FreeBSD 採用的實現方式不同的方式來實現並發、SMP、集群以及其他操作系統特性的 BSD 分支。
基本介紹
- 中文名:DragonflyBSD
- 開發人:Matthew Dillon
- 設計理念:Cache、I/O架構
- 技術特色:Kernel design
關於,設計理念,目標和開發計畫,技術特色,發布版本,軟體管理,原創內容,發展及發行,
關於
DragonFly 項目的創始人和目前的 leader,Matthew Dillon 曾經是 FreeBSD SMPng 項目的重要開發人員,在 FreeBSD 3.x 時代開始,他對 FreeBSD 虛擬記憶體子系統、VFS子系統等多個重要部分進行了重寫和增強,這些工作給 FreeBSD 4.x 系列的可靠性和性能打下了堅實的基礎。FreeBSD 項目於 2000 年 6 月在 Sunnyvale 的 Yahoo 公司總部舉行了 SMP 峰會,並正式啟動了 SMPng 計畫,即利用 BSDi 捐贈的 BSD/OS 原始碼和相關的設 計思想來改善 FreeBSD 的 SMP 能力。
Matthew Dillon 對 BSD/OS 中的許多實現並不滿意,並在 SMPng 開發過程中展現了卓越的天賦和才華。由於 BSD/OS 與 FreeBSD 之間的巨大差異和時間限制,Matthew Dillon在開始移植細鎖之後不久即決定重新實現上鎖原語,而完成這些工作距離 SMPng 峰會結束僅經過幾天時間。儘管如此,在隨後的開發活動中,與其他開發人員不斷爆發的衝突,導致他被多次停權警告,並最終撤銷了commit許可權。
2003年7月,Matt宣布在 FreeBSD 4.8-STABLE 的基礎上的fork,並正式定名為 DragonFlyBSD (最初名字是TortoiseBSD,現在多稱為 DragonFly)。與 FreeBSD 5.x 系列採用的細鎖模型不同, DragonFly 採用訊息模型作為核心的主要同步機制,並希望由此獲得更好的可伸縮性。
DragonFly 同時採用了許多其他兄弟 BSD 系統的代碼,其 malloc()函式的安全特性來自於OpenBSD,WiFi框架來自於FreeBSD 6,USB實現來源於NetBSD。許多 DragonFly 的特性也被移植到 FreeBSD 中。
目前 DragonFly 最值得關注的是 Matthew Dillon 新設計的 HAMMERFS 檔案系統。
設計理念
DragonFly BSD初期打算改寫FreeBSD 4中的幾個子系統,包括了Cache、I/O架構、Messaging、Threading、User API及VFS架構。
目標和開發計畫
DFBSD的最終目標是在核心中提供對通用集群系統原生的支持,為了達到此目標,DFBSD項目將開發分解為兩個階段。
第一個階段從2003年至2007年初,主要關注對主要核心子系統的重寫。這幾乎涉及到所有的子系統,尤其是核心核心和檔案系統的API。這也是第二階段的準備工作。
第二個階段主要是為檔案系統命名空間、檔案空間和VM空間創建一個精巧的cache管理框架,這將為橫跨多台機器運行的重負荷互動性程式從各個方面完全保證cache的一致性,同時也解決了對資源的細分問題(包括通過可控的VM上下文來細分cpu資源),這樣可為分布在internet的不安全的第三方集群實現安全的分配方式(即使這些集群自身都不清楚自己的安全性,對那些願意捐贈系統(計算)資源的人來說最基本和最重要的事情是不要因為捐贈資源而遭到攻擊)。
技術特色
Kernel design
同大多數現代核心一樣,DragonFly的核心是混合型的,包含了微核心與統一核心的特色,並試圖集成兩種技術的優勢。例如微核心的訊息傳遞機制可以使OS能從被保護記憶體中節餘更多空間;而統一核心在處理某些關鍵任務的速度方面更具優勢。(DFBSD的)訊息子系統看起來相似於某些微核心系統,例如Mach,雖然Mach設計的更加簡單。DFBSD的訊息子系統可以工作在同步或異步模式,並試圖在給定條件下達到系統的最佳性能。
為達到項目的剩餘目標,同時提供設備I/O和VFS的訊息機制。新架構將允許核心的許多部分可以被轉移到用戶空間,其優點在於以更小的獨立的程式取代了混雜在一起的大量代碼,這使核心更小更容易調試;而那部分被允許在用戶空間執行的核心代碼帶來的額外的好處是系統將更加穩定,即使用戶空間的驅動崩潰了,核心也不會崩潰。
雖然同樣被封裝成訊息,但實際上系統調用被分為用戶空間版本和核心版本。把多種標準調用從核心轉移到用戶空間的兼容層有助於降低核心的的大小和複雜度,這就有助於維護DFBSD版本前向後向的兼容性。Linux和其他類UNIX系統的兼容性代碼被轉移出來就與此類似。DFBSD可在jails中創建原生用戶空間兼容層的多個實例與UML(用戶模式linux)就很相似。不同於UML(本質上宿主核心相當於一個不同的硬體平台,而UML是對其的一個linux移植)的是DFBSD的虛擬化對計算機的真實硬體不需要特殊驅動就可以直接通訊。
CPU localization
DFBSD中執行緒被設計成被CPU鎖定,並且每個處理器有著自己的LWKT調度器。執行緒只能通過在cpu之間傳遞一個IPI(Interprocessor Interrupt)訊息來轉移,而不能依據優先權從一個處理器切換到另一個處理器。進程間的執行緒調度也是通過傳送異步IPI訊息來完成。(這樣實現的)一個優點是通過執行緒子系統的明確的隔離使得SMP系統的處理器的板載cache不會包含重複數據,並通過給予系統里的每個處理器使用自己的cache來快取不同的事物以達到更高的性能。
在多個核心執行緒間分割工作給各個LWKT子系統(舉個網路代碼的例子;每個處理器每個協定一個執行緒),通過在移除在多個核心任務中共享某些資源的需求來減輕衝突。但是這個DFBSD設計的與眾不同的關鍵特性“CPU局部化算法的執行緒分割實現”是有爭議的。
Protecting shared resources
為了能在多處理器的機器上安全的運行,對共享資源(檔案、數據結構等)必須串列化,這樣執行緒或者進程就不會在同一時刻修改同一資源。原子化操作、自旋鎖、關鍵代碼段(Critical sections 是一小塊用來處理一份被共享資源的代碼,該段代碼必須獨占的對某些共享資源的訪問權。這可以讓多行代碼以原子方式執行。如果一個執行緒進入了critical section,另外一個執行緒絕對不能進入該critical section)、互斥標記,串列令牌和訊息佇列與所有可能的方式都可被用來防止訪問衝突。linux和FreeBSD 5採用細化鎖互斥模型來實現多處理器系統的高性能,然而DFBSD卻不是這樣,為了防止多個執行緒同時訪問或者修改共享資源,DFBSD使用了關鍵代碼段和串列令牌技術。雖然直到最近,DFBSD仍在使用SPLs,但是將被關鍵代碼段取代。
很多系統核心包含LWKT子系統,其他事物中的IPI訊息子系統和新的核心記憶體分配器是沒有加鎖的,也就是說他們工作時沒有使用互斥標記,並且在單CPU上運行。關鍵代碼段用於保護本地中斷,也在單CPU上運行,保證了一個當前運行的執行緒不會被先占有。
串列令牌被用來阻止對其他CPU的同時訪問並控制多個執行緒的同時並發,確保在一個給定時間只有一個執行緒運行。不同於互斥方式,處於阻塞或者休眠狀態的執行緒並不能防止別的執行緒對共享資源的訪問。使用串列令牌可以阻止使用互斥方式時導致的很多死鎖和優先權倒置的問題,這樣極大的簡化了一個需要在多個執行緒共享一個資源的多步程式的設計和實現。串列令牌的代碼看起來於linux現在使用的”Read-copy-update”很相似,但不同於linux當前RCU的實現,DFBSD實現了競爭只影響到與同一個令牌相關的處理器,而不是計算機里所有的處理器。
Additional features
在開發初期,DFBSD就開發了一個slab分配器取代了FreeBSD 4的核心記憶體分配器。新的分配器不像它取代的那些代碼,在記憶體分配時既不需要互斥,也不需要時阻塞操作。而且它是mpsafe的。
DFBSD使用SFBUF(Super-Fast Buffers)和MSFUBF(Multi-SFBUFs)。SFBUF是用來管理快速單頁記憶體映射並在適當的時候對頁面快取。它們被用來回收一個單VM頁相對數據的引用。(這個設計)簡單而又強大,在此之上可以發展很多功能,比如說在sendfile系統調用里實現“zero-copy”。
核心里很多地方使用了SFBUF,比如在Vnode Object Pager和PIPE子系統(間接的如XIO)里用來支持高頻寬傳輸。一個SFBUF只能對應一個單VM頁;而MSFBUFs被用來管理多頁的快速記憶體映射。
SFBUF這個概念最初是FreeBSD項目中的David Greenman在實現sendfile系統調用時設計的,後來的完善依賴於Dr. Alan L. Cox和Matthew Dillon。MSFBUFs則是由Hiten Pandya和Matthew Dillon設計的。
發布版本
Versiob 3.4.3 released 05 September 2013.
Version 3.2.1 released 02 November 2012.
Version 3.2.2 released 16 December 2012. See tagged commit for details.
Version 1.12.2 發布於 2008年4月20日
Version 1.12.1 發布於 2008年3月8日
Version 1.12.0 發布於 2008年2月26日
Version 1.10 發布於 2007年8月6日
Version 1.8 發布於 2007年3月27日
Version 1.6 發布於 2006年7月25日
Version 1.4 發布於 2006年1月7日
Version 1.2 發布於 2005年4月8日
Version 1.0 發布於 2004年7月12日
軟體管理
在過去,DragonflyBSD使用FreeBSD的ports,同時可以選擇使用NetBSD的軟體包管理器pkgsrc。但從1.4版本發布後,pkgsrc便成為官方的軟體包管理。為了支持pkgsrc,DragonflyBSD的開發者們維護了大量的第三方套用軟體。
原創內容
acxcontrol - Texas Instruments ACX100/TNETW1130(ACX111) 網卡工具
battd - 電池狀態監控守護進程
checkpt - 對進程還原點的恢復支持 (在一個兼容系統里串列進程狀態可以被恢復)
dntpd - NTP客戶端守護進程
ECC detection - 在ECC系統里檢測記憶體錯誤
jscan - 掃描日誌檔案的程式
mount_udf - 掛接UDF檔案系統
mountctl - 控制被掛接的檔案系統的日誌或其他特性
pctrack - 通過傾倒程式計數器跟蹤核心記錄的數據
rconfig - 遠程配置客戶端/伺服器
rcrun (and family) - 管理啟動腳本 (rcenable/rcdisable)
resident - 生成一個動態二進制檔案的常駐記憶體副本
varsym - 獲取和設定變數的符號連線
vkernel - 虛擬核心架構允許核心在用戶空間運行
wmake - 在buildworld環境中構建DFBSD原始碼
發展及發行
DragonFly BSD自FreeBSD 4.8分支後引入了許多FreeBSD 4與5的新功能以及修正,像是FreeBSD 4所發展的ACPI及新的ATA驅動程式。由於初期DragonFly BSD的發展人數不多,而且大多都集中精力在基本架構的修改,所以周邊驅動程式大多都是從FreeBSD 5取得。
如同OpenBSD,DragonFly BSD的維護者將C語言程式碼中"K&R" style換成ANSI style。另外DragonFly BSD的GCC(GNU Compiler Collection)也引入了OpenBSD所特有的“Stack-Smashing Protector”(之前被稱為“ProPolice”,提供對於buffer overflow攻擊額外的保護,並默認開啟使用。不過在2005年7月23日時,核心的編譯會關掉這個功能。
如同其他大多數的BSD,DragonFly以BSD license授權方式釋出。