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

DragonflyBSD

鎖定
DragonFly 是一個以與 FreeBSD 採用的實現方式不同的方式來實現併發、SMP、集羣以及其他操作系統特性的 BSD 分支。
中文名
DragonflyBSD
開發人
Matthew Dillon
設計理念
Cache、I/O架構
技術特色
Kernel design
釋    義
應用操作系統特性的 BSD 分支

DragonflyBSD關於

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 文件系統。

DragonflyBSD設計理念

DragonFly BSD初期打算改寫FreeBSD 4中的幾個子系統,包括了Cache、I/O架構、Messaging、Threading、User API及VFS架構。

DragonflyBSD目標和開發計劃

DFBSD的最終目標是在內核中提供對通用集羣系統原生的支持,為了達到此目標,DFBSD項目將開發分解為兩個階段。
第一個階段從2003年至2007年初,主要關注對主要內核子系統的重寫。這幾乎涉及到所有的子系統,尤其是內核核心和文件系統的API。這也是第二階段的準備工作。
第二個階段主要是為文件系統命名空間、文件空間和VM空間創建一個精巧的cache管理框架,這將為橫跨多台機器運行的重負荷交互性程序從各個方面完全保證cache的一致性,同時也解決了對資源的細分問題(包括通過可控的VM上下文來細分cpu資源),這樣可為分佈在internet的不安全的第三方集羣實現安全的分配方式(即使這些集羣自身都不清楚自己的安全性,對那些願意捐贈系統(計算)資源的人來説最基本和最重要的事情是不要因為捐贈資源而遭到攻擊)。

DragonflyBSD技術特色

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設計的。

DragonflyBSD發佈版本

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. [1] 
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軟件管理

在過去,DragonflyBSD使用FreeBSD的ports,同時可以選擇使用NetBSD的軟件包管理器pkgsrc。但從1.4版本發佈後,pkgsrc便成為官方的軟件包管理。為了支持pkgsrc,DragonflyBSD的開發者們維護了大量的第三方應用軟件。

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源代碼

DragonflyBSD發展及發行

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授權方式釋出。
參考資料