دراگون‌فلای بی‌اس‌دی

تاریخچه

پروژهٔ دراگون‌فلای بی‌اس‌دی، توسط متیو دیلون (زادهٔ ۱۹۶۶)، مهندس نرم‌افزار اهل ایالات متحده آمریکا بنیان نهاده شد. او در رشته‌های مهندسی الکترونیک و علوم رایانه در دانشگاه کالیفرنیا، برکلی تحصیل کرده‌است و اولین بار در همان دانشگاه در سال ۱۹۸۵ با بی‌اس‌دی آشنا شد. دیلون همچنین بخاطر نوشتن یک کامپایلر برای زبان برنامه‌نویسی سی بنام DICE، برنامه‌نویسی بر روی آمیگا، کار بر روی هستهٔ لینوکس و همچنین کشف یک باگ در پردازندهٔ مدل اوپترون شرکت AMD شناخته می‌شود. او بنیان‌گذار BEST Internet بود و طی سال‌های ۱۹۹۴ تا ۱۹۹۷ در همان‌جا مشغول به‌کار بود و همچنین در پروژهٔ فری‌بی‌اس‌دی هم مشارکت می‌کرد. دیلون یک برنامهٔ خبررسان اینترنتی به نام «دیابلو» نوشته بود که برنامهٔ محبوبی در میان ارائه‌دهندگان خدمات اینترنتی بود. دیلون در سال ۱۹۹۷، دسترسی کامیت به کد منبع فری‌بی‌اس‌دی دریافت کرد و در کنار مشارکت‌های دیگرش در این پروژه، کمک‌های زیادی به زیرسیستم حافظهٔ مجازی در این سیستم‌عامل کرد. او در سال ۲۰۰۳ پروژهٔ دراگون‌فلای بی‌اس‌دی را با انشعاب از فری‌بی‌اس‌دی بنیان نهاد. علت این‌کار، کشمکش و نزاع با دیگر توسعه‌دهندگان فری‌بی‌اس‌دی بود که باعث شده بود دسترسی او به مخازن کد منبع فری‌بی‌اس‌دی قطع شود. پروژهٔ دراگون فلی‌بی‌اس‌دی منجر به توسعه‌یافتن یک فایل سیستم جدید به نام HAMMER شد که دیلون این فایل سیستم را براساس ساختاردادهٔ درخت بی نوشته است. HAMMER در کنار UFS، فایل سیستم پیشفرض در سیستم‌عامل دراگون‌فلای است.

هسته

هستهٔ دراگون‌فلای یک هستهٔ پیوندی است که هم ویژگی‌های هستهٔ یکپارچه و هم ویژگی‌های ریزهسته را باهم دارد. برای مثال، هستهٔ دراگون‌فلای مجهز به قابلیت ارسال پیغام است که در ریزهسته‌ها پیدا می‌شود؛ این قابلیت اجازه می‌دهد تا قسمت‌های بیشتری از سیستم‌عامل بتواند از حافظهٔ محافظت‌شده بهره‌مند گردد، به‌طوری‌که همچنان در انجام برخی از کارهای حیاتی، سرعتی برابر با سرعت هسته‌های یکپارچه را داشته باشد. زیرسیستم پیام‌رسانی دراگون‌فلای بی‌اس‌دی، مشابه دیگر زیرسیستم‌های پیام‌رسانی — که در برخی ریزهسته‌ها از جمله گنو ماخ یافت می‌شوند — طراحی شده‌است؛ با این حال، طراحی زیرسیستم پیام‌رسانی دراگون‌فلای از پیچیدگی کمتری برخوردار است. این زیرسیستم، هم می‌تواند به صورت همگام و هم به صورت ناهمگام عمل کند و تلاش می‌کند تا از این توانایی به نحوی استفاده کند که در هر موقعیتی، بهترین کارایی ممکن حاصل شود.
بر طبق گفتهٔ توسعه‌دهندهٔ دراگون‌فلای بی‌اس‌دی، متیو دیلون، پیشرفت‌هایی هم در آماده‌سازی قابلیت پیام‌رسانی هم برای دستگاه‌های ورودی/خروجی و هم برای فایل سیستم مجازی حاصل شده‌است که برآورده شدن باقی اهداف پروژه را تسهیل می‌کند. زیرساخت جدید، این امکان را فراهم می‌کند تا بتوان بسیاری از بخش‌های هسته را به فضای کاربری منتقل کرد. در فضای کاربری، می‌توان این بخش‌ها را راحت‌تر اشکال‌زدایی کرد، چرا که برنامه‌ها در فضای کاربری، کوچکتر و منزوی‌تر هستند؛ برخلاف برنامه‌های موجود در هسته که معمولاً برنامه‌ها بخش‌های کوچکی از یک قطعه کد بزرگتر به حساب می‌آیند و مدیریت آن‌ها سخت‌تر است. علاوه بر آن، منتقل کردن کدهای هسته به بخش فضای کاربری، باعث پایدارتر شدن و مستحکم‌تر شدن سیستم می‌شود، به عنوان مثال، اگر یکی از گرداننده‌های دستگاه دچار اشکال شود، تنها همان بخش تحت تأثیر قرار خواهد گرفت و در کار کل هسته اختلال ایجاد نخواهد کرد.
فراخوان‌های سیستمی به دو بخش فضای کاربری و فضای هسته تقسیم شده‌اند و در پیام‌ها کپسوله‌سازی می‌شوند. این کار باعث می‌شود تا با منتقل کردن برخی از فرخوان‌های سیستمی استاندارد، به یک لایهٔ سازگاری که در فضای کاربری قرار دارد، پیچیدگی و حجم هستهٔ سیستم‌عامل کمتر شود. علاوه بر آن، این کار حفظ سازگاری بین نسخه‌های پسین و پیشین دراگون‌فلای را هم راحت‌تر می‌کند. کدهای مربوط به سازگاری با لینوکس و دیگر سیستم‌عامل‌های شبه یونیکس هم به بیرون از هسته منتقل شده‌اند.
دراگون‌فلای بی‌اس‌دی هم همانند جد خود فری‌بی‌اس‌دی، از قابلیت زندان‌ها پشتیبانی می‌کند که مدل پیشرفته‌تری از chroot است. به کمک زندان‌ها، می‌توان چند سیستم‌عامل مهمان را به صورت هم‌زمان بر روی دراگون‌فلای اجرا کرد، به‌طوری‌که هستهٔ سیستم میزبان، بین همهٔ آن‌ها به اشتراک گذاشته می‌شود. اما زندان‌ها را نمی‌توان به معنای واقعی کلمه، یک راه حل مجازی‌سازی به حساب آورد، چرا که سیستم‌عامل‌های مهمان تنها می‌توانند مشابه سیستم میزبان، دراگون‌فلای بی‌اس‌دی، باشند.

ریسه‌بندی

از آنجایی که پشتیبانی از چندین معماری پردازنده، باعث می‌شود تا پشتیبانی کردن از چند پردازشی متقارن هم پیچیده‌تر شود، پروژه دراگون‌فلای بی‌اس‌دی، پشتیبانی از سکوهای سخت‌افزاری خود را محدود به تنها سکوی x86-64 کرده‌است. دراگون‌فلی در ابتدا از سکوی x86 هم پشتیبانی می‌کرد، با این حال در نسخهٔ ۴٫۰ پشتیبانی از سکو قطع شد. و در نسخه ۴.۰، به‌طور کلی پشتیبانی از 32-bit را متوقف کرد، دراگون‌فلای بی‌اس‌دی از نسخهٔ ۱٫۱۰ به بعد، از ریسه‌بندی فضای کاربری به صورت ۱:۱ پشتیبانی می‌کند (یک ریسه در هسته، به ازای هر ریسه در فضای کاربری) که در مقایسه با مدل N:M راه‌حلی نسبتاً آسان محسوب می‌شود و پیاده‌سازی و نگهداری از آن هم راحت‌تر است. همچنین، دراگون‌فلای پشتیبانی از چندریسگی را از فری‌بی‌اس‌دی به ارث برده است و از این قابلیت پشتیبانی می‌کند.
در دراگون‌فلای بی‌اس‌دی، هر یک از پردازنده‌ها، زمان‌بند LWKT مخصوص به خودش را دارد. ریسه‌ها به محض ایجاد شدن، به یک پردازندهٔ خاص اختصاص می‌یابند و هرگز به‌طور قبضه‌کردنی بین پردازنده‌ها تعویض نمی‌شوند؛ تنها راه منتقل کردن یک ریسه از یک پردازنده به پردازنده دیگر، ردوبدل شدن یک پیغام وقفه بین-پردازنده‌ای یا IPI بین پردازنده‌های درگیر است که این پیغام‌ها، به صورت ناهمگام ارسال می‌شوند. یکی از مزایای این نوع زیرسیستم ریسه‌بندی بخش‌بخش شده، این است که در سیستم‌هایی که دارای چندین پردازنده هستند، حافظه‌های نهان موجود بر روی پردازنده‌ها، دارای اطلاعات تکراری و زائد نخواهند بود که این باعث می‌شود هر پردازنده، بتواند از حافظهٔ نهان خود برای ذخیره کردن اطلاعاتی که قرار است بر روی آن کار کند، استفاده کند و به این ترتیب کارایی سیستم بالاتر رود.
از زیرسیستم LWKT به منظور تقسیم کردن کارها در بین چند ریسهٔ هسته، بهره گرفته شده‌است (به عنوان مثال، در کدهای مربوط به بخش شبکه، یک ریسه به ازای هر پروتکل در هر پردازنده وجود دارد)، این کار باعث می‌شود تا رقابت برای بدست آوردن منابع سیستمی کمتر شود، چرا که دیگر نیاز نیست تا برخی از منابع سیستم در بین تسک‌های هسته به اشتراک گذاشته شود.

حفاظت از منابع اشتراکی

به منظور اینکه سیستم‌عامل بر روی رایانه‌هایی که دارای چندین پردازنده هستند، به صورت ایمن اجرا شود، دسترسی به منابع مشترک (همانند فایل‌ها و ساختمان داده‌ها) باید به صورت نوبتی باشد تا فرایندها یا ریسه‌ها سعی نکنند یک منبع مشترک را به صورت هم‌زمان تغییر داده و دستکاری کنند. به منظور اینکه چندین ریسهٔ مختلف نتوانند به صورت هم‌زمان یک منبع مشترک را تغییر داده یا مورد دسترسی قرار دهند، دراگون‌فلای از نواحی بحرانی و همین‌طور از توکن‌های نوبت‌بندی استفاده می‌کند. در حالیکه هم لینوکس و هم فری‌بی‌اس‌دی ۵، به منظور بدست آوردن کارایی بالا در سیستم‌های چندپردازنده‌ای، از مدل‌های جامع و دقیق مبتنی بر mutex برای کنترل دسترسی به منابع اشتراکی استفاده می‌کنند، دراگون‌فلای بی‌اس‌دی این‌گونه نیست. تا همین اواخر، دراگون‌فلای بی‌اس‌دی از splها هم استفاده می‌کرد، اما اکنون آن‌ها با نواحی بحرانی جایگزین شده‌اند.
بیشتر بخش‌های اصلی سیستم، از جمله زیرسیستم LWKT، زیرسیستم پیام‌رسانی IPI و تخصیص‌دهندهٔ حافظهٔ هستهٔ جدید، به صورت قفل‌نشدنی هستند؛ به این معنی که آن‌ها از mutexها استفاده نمی‌کنند و هر یک از فرایندها هم بر روی یک پردازنده اجرا می‌شود. برای هر پردازنده، ناحیه‌ای بحرانی وجود دارد که از آن برای حفاظت در برابر وقفه‌های محلی استفاده می‌شود؛ این کار تضمین می‌کند ریسه‌ای که هم‌اکنون در حال اجراست، قبضه نخواهد شد.
برای جلوگیری از وقوع دسترسی هم‌زمان از طرف دیگر پردازنده‌ها، از توکن‌های نوبت‌بندی استفاده شده‌است و چند ریسه می‌توانند به‌طور هم‌زمان این توکن‌ها را در اختیار داشته باشند تا این اطمینان حاصل شود که در هر زمان، تنها یکی از آن ریسه‌ها می‌تواند اجرا می‌شود. ریسه‌های مسدودشده یا به‌خواب‌رفته، از دسترسی دیگر ریسه‌ها به منابع مشترک جلوگیری نمی‌کنند که این برخلاف حالتی است که از mutex‌ها برای کنترل دسترسی به منابع مشترک استفاده می‌شود. در کنار دیگر چیزها، استفاده از توکن‌های نوبت‌بندی از بسیاری از موقعیت‌هایی که ممکن است باعث وقوع بن‌بست یا واژگونی اولویتی در حین استفاده از mutexها شود، جلوگیری می‌کند و همچنین به‌طور قابل ملاحظه‌ای طراحی و پیاده‌سازی رویهٔ چند مرحله‌ای را ساده‌تر می‌کند که احتیاج به این دارد که یک منبع در میان چند ریسه به اشتراک گذاشته شود. زیرسیستم توکن نوبت‌بندی، در حال حاضر بسیار شبیه به ویژگی Read-copy-update در لینوکس شده‌است. اما برخلاف پیاده‌سازی فعلی RCU در لینوکس، این بخش در دراگون‌فلای طوری پیاده‌سازی شده که تنها پردازنده‌هایی که بر روی توکن یکسانی در رقابت هستند، تحت تأثیر قرار می‌گیرند، نه کل پردازنده‌های موجود در سیستم.
دراگون‌فلای از یک تخصیص‌دهنده پاره‌ای استفاده می‌کند که برای اختصاص دادن حافظه به برنامه‌ها، نه نیاز به استفاده از mutexها و نه نیاز به انجام عملیاتی از نوع مسدودشدنی دارد. این تخصیص‌دهنده، برای استفاده در فضای کاربری، به کتابخانه استاندارد سی هم پورت شده و جای پیاده‌سازی malloc فری‌بی‌اس‌دی را گرفته‌است.

هسته مجازی

از نسخهٔ ۱٫۸ به بعد، دراگون‌فلای بی‌اس‌دی یک راهکار مجازی‌سازی مشابه UML را معرفی کرده که به کمک آن می‌توان یک هستهٔ دیگر که از هستهٔ اصلی سیستم‌عامل مستقل است را در داخل فضای کاربری اجرا کرد. این هستهٔ مجازی، در یک محیط کاملاً مجزا و قرنطینه اجرا می‌شود و رابط‌های شبکه و رابط‌های ذخیره‌سازی آن هم به صورت شبیه‌سازی‌شده هستند. این قابلیت، خوشه‌بندی و آزمایش کردن زیرسیستم‌های مختلف هسته را ساده‌تر می‌کند.
هستهٔ مجازی دو تفاوت عمده با هستهٔ اصلی سیستم‌عامل دارد. یکی اینکه این هستهٔ مجازی، بسیاری از روتین‌ها و قابلیت‌های مدیریت سطح پایین سخت‌افزار را ندارد و همچنین تا جایی که امکان دارد از توابع موجود در کتابخانه استاندارد سی، در عوض پیاده‌سازی‌های موجود در هسته، استفاده می‌کند. از آنجایی که هم هستهٔ مجازی و هم هستهٔ واقعی از روی کد منبع یکسانی کامپایل می‌شوند، رویه‌های وابسته به پلتفرم و پیاده‌سازی‌های مجدد توابع کتابخانه استاندارد سی به‌طور کاملاً مستقل در درخت کدهای منبع نگهداری می‌شوند.
سکویی که هستهٔ مجازی بر روی آن اجرا می‌شود، در اصل یک لایهٔ انتزاعی سطح بالا است که هستهٔ اصلی آن را فراهم کرده. این لایهٔ انتزاعی شامل یک زمان‌سنج مبتنی بر kqueue، یک کنسول (که در اصل همان ترمینالی است که هستهٔ مجازی از طریق آن اجرا شده)، ایمیج هارددیسک (یک فایل که با آن مثل دیسک سخت رفتار می‌شود) و یک رابط اترنت، که تمامی بسته‌های دریافتی را به رابط tap سیستم میزبان تونل می‌زند.

مدیر بسته

در دراگون‌فلای بی‌اس‌دی، می‌توان از طریق pkgng، نرم‌افزارهای جانبی را به صورت بسته‌های باینری از قبل کامپایل شده نصب کرد یا اینکه از طریق یک مجموعه پورت‌های مختص خود دراگون‌فلای که دی‌پورتز نام دارد، اقدام به نصب برنامه‌های جانبی کرد.
دراگون‌فلای بی‌اس‌دی در اوایل از پورت‌های فری‌بی‌اس‌دی به‌عنوان مدیر بستهٔ اصلی خود استفاده می‌کرد. اما از نسخهٔ ۱٫۴ به بعد، توسعه‌دهندگان، پکیج سورس را به‌عنوان مدیر بستهٔ رسمی برگزیدند. به این ترتیب، توسعه‌دهندگان دراگون‌فلای بی‌اس‌دی مجبور نبودند وقت زیادی را برای نگه‌داری کردن از تعداد زیادی برنامه جانبی صرف کنند، در حالی که هنوز هم به برنامه‌های بروز دسترسی داشتند. همچنین این کار به توسعه‌دهندگان پکیج سورس هم این امکان را می‌داد تا مطمئن شوند که سامانهٔ مدیریت بسته آن‌ها قابل حمل و سازگارپذیر است.
سازگار نگه‌داشتن دراگون‌فلای بی‌اس‌دی با پکیج‌سورس، نیازمند تلاش‌ها و زحمات بیشتری شده بود که در ابتدا پیش‌بینی نشده بود؛ بنابراین، پروژهٔ دراگون‌فلای مکانیزم جدیدی به نام DPorts را معرفی کرد که در اصل یک پوسته برای پورت‌های فری‌بی‌اس‌دی است.

CARP

پیاده‌سازی اولیه از پروتکل آدرس اضافه مشترک یا همان CARP در مارس ۲۰۰۷ به اتمام رسید. در سال ۲۰۱۱ هم پشتیبانی از این پروتکل به دراگون‌فلای بی‌اس‌دی اضافه شد.

فایل سیستم HAMMER

در کنار سیستم فایل یونیکس، که در اکثر سیستم‌عاملهای بی‌اس‌دی فایل سیستم پیشفرض است، دراگون‌فلای بی‌اس‌دی فایل سیستم جدیدی به نام HAMMER را معرفی کرده‌است. فایل سیستم HAMMER که اختصاصاً برای دراگون‌فلای توسعه داده شده، فایل سیستمی مشابه ZFS با امکانات بالا و در عین حال با طراحی بهتر است.
HAMMER از تاریخچهٔ فایل سیستم قابل تنظیم‌شدن، تصویر لحظه‌ای، چک‌سام، جلوگیری از ذخیره‌شدن اطلاعات دوگانه و تکراری و دیگر قابلیت‌های معمول در فایل سیستم‌هایی از این قبیل پشتیبانی می‌کند. این فایل سیستم به عنوان یکی از قابلیت‌های جالب توجه دراگون‌فلای در نظر گرفته می‌شود.
نسل جدید این فایل سیستم موسوم به ،HAMMER2 توسط متیو دیلون در حال توسعه داده شدن است. فایل سیستم HAMMER2 در نسخه ۳٫۸ دراگون‌فلای در نصب پیشفرض قرار گرفت، اما هنوز قابل استفاده نیست و توسعهٔ آن هنوز هم ادامه دارد.

devfs

در سال ۲۰۰۷ پروژهٔ دراگون‌فلای بی‌اس‌دی از یک فایل سیستم دستگاهی جدید بهره‌مند گشت که گره‌های دستگاهی را به صورت پویا حذف و اضافه می‌کند و دسترسی به دستگاه‌ها را با استفاده از مسیرهای ارتباطی میسر می‌سازد. همچنین، این فایل سیستم، می‌تواند درایورها را با استفاده از شماره سریال آن‌ها شناسایی کند و دیگر به یک فایل سیستم از قبل پر شده در مسیر ‎/dev احتیاج ندارد. این سیستم devfs در پروژهٔ تابستان کد گوگل طراحی شده‌است.

تصاویر لحظه‌ای از برنامه‌های کاربردی

دراگون‌فلای بی‌اس‌دی از قابلیتی مشابه قابلیت برنامه‌های مقیم در سیستم‌عامل آمیگا پشتیبانی می‌کند. به موجب این قابلیت، وقتی که یک برنامهٔ بزرگ که به صورت دینامیک لینک شده، در حافظه اصلی سیستم بارگذاری می‌شود، یک تصویر لحظه‌ای از فضای حافظه مجازی آن برنامه، برای استفاده در آینده، تهیه می‌شود. به این ترتیب، اگر در آینده نیاز به اجرای مجدد آن برنامه بود، برنامه مورد نظر با سرعتی بسیار بیشتر از حد معمول خود اجرا خواهد شد. این قابلیت، جایگزین prelink شده‌است که در گذشته‌استفاده می‌شد و از آن بسیار مؤثرتر است. برنامه‌های بزرگ که دارای کتابخانه‌های اشتراکی زیادی هستند، بیشترین فایده را از این قابلیت خواهند برد.

توسعه و توزیع

دراگون‌فلای بی‌اس‌دی حدود ۵۰ توسعه‌دهنده دارد. همانند فری‌بی‌اس‌دی و اوپن‌بی‌اس‌دی، توسعه‌دهندگان دراگون‌فلای بی‌اس‌دی هم به آهستگی مشغول جایگزین کردن کدهای خود از شیوهٔ K&R با معادل مدرن‌تر ANSI هستند. همانند دیگر سیستم‌عامل‌ها، قابلیت حفاظت در برابر حملات تخریب پشته به صورت پیشفرض در کامپایلر فعال است. قابل ذکر است که از تاریخ ۲۳ ژوئیهٔ ۲۰۰۵ به بعد، هستهٔ سیستم دیگر به صورت پیشفرض با خاموش بودن این قابلیت کامپایل می‌شود.
از آنجایی که دراگون‌فلای بی‌اس‌دی از فری‌بی‌اس‌دی مشتق شده‌است، به راحتی و با اجرای چند دستور ساده می‌توان اقدام به کامپایل مجدد کل سیستم‌عامل از روی کدهای منبع کرد. توسعه‌دهندگان دراگون‌فلای بی‌اس‌دی، از برنامهٔ گیت برای نگهداری، اعمال تغییرات و کنترل کدهای منبع خود استفاده می‌کنند. برخلاف فری‌بی‌اس‌دی، توسعه‌دهندگان دراگون‌فلای بی‌اس‌دی، به سبب کوچکتر بودن تیم توسعه‌دهندگان، هر دو شاخهٔ پایدار و ناپایدار کدهای منبع را در یک درخت نگه می‌دارند.
سیستم‌عامل دراگون‌فلای بی‌اس‌دی به صورت دیسک زنده و USB زنده ارائه می‌شود. این دیسک‌ها را می‌توان به صورت رایگان، به همراه کدهای منبع، از وب‌گاه رسمی این سیستم‌عامل دریافت کرد. تعدادی از شرکت‌های تجاری هم این دیسک‌ها را به‌فروش می‌رسانند. بدون اینکه نیازی به نصب سیستم‌عامل باشد، می‌توان کل سیستم‌عامل را با تمام قابلیت‌های آن از روی همین رسانه‌ها راه‌اندازی کرد. همچنین تمامی اجزای X11 هم در این دیسک گنجانده شده‌است. این دیسک شامل تمام اجزای پایه‌ای سیستم‌عامل و همین‌طور صفحات راهنما است؛ اما ممکن است در آینده کدهای منبع سیستم‌عامل و همچنین تعدادی نرم‌افزار مفید دیگر هم در آن گنجانده شود. مزیت این کار این است که تنها با داشتن یک CD، هم می‌توان سیستم‌عامل را بر روی هارد دیسک نصب کرد، هم می‌توان بدون نیاز به نصب سیستم‌عامل، از ابزارها و قابلیت‌های آن برای اهداف گوناگونی مانند تعمیر یک سیستم‌عامل آسیب دیده و ... استفاده کرد و هم می‌توان سیستم‌عامل را بدون نیاز به نصب آن، آزمایش کرد.
لوگوی سیستم‌عامل دراگون‌فلای بی‌اس‌دی، یک آسیابک است که توسط جو انگریزانو ترسیم شده‌است. همانند دیگر سیستم‌عامل‌های متن‌باز خانوادهٔ بی‌اس‌دی، دراگون‌فلای هم تحت اجازه‌نامهٔ بی‌اس‌دی عرضه می‌شود. دیلون نقش این پروانه را «به‌طور باورنکردنی مهم» خوانده است. چرخهٔ انتشار دراگون‌فلای، معمولاً هر شش ماه بوده و دو نسخه از این سیستم در سال عرضه می‌شود. این سیستم‌عامل از یک نصاب به نام BSD Installer استفاده می‌کند که از یک واسط متنی برخوردار است و به FreeSBIE و pfSense هم پورت شده‌است.