Sara12
12-29-2010, 10:25 PM
با داشتن یک ریشه و یک API هستههای یونیکسهای مدرن ویژگیهای طراحی یکسانی دارند. یک هسته یونیکس یک فایل باینری استاتیک یکپارچه (monolithic) است. سیستمهای یونیکسی به طور معمول به یک واحد مدیریت صفحهای حافظه نیاز دارند. این مورد فضای آدرس مجازی یکتا برای هر را پروسه فراهم میکند.
در این قسمت برای اینکه بتوانیم طراحی هسته لینوکس را بهتر درک کنیم بحثی پیرامون هستههای یکپارچه (monolithic kernels) و طراحی ریزهسته (microkernel design) انجام میدهیم:
http://www.owjit.com/Images/Article/1388/9/9/155/linux.jpg
طراحی هسته میتواند به دو نوع اصلی دستهبندی شود: یکپارچه و ریزهسته. (البته روش سومی نیز به نام exokernel وجود دارد که تاکنون بیشتر در تحقیقات مطرح شده، اما در دنیای واقعی نیز در حال راهیابی است. روشهای دیگری نیز هستند که کاربرد چندانی ندارند و از سه روش فوق مشتق شدهاند.) هستههای یکپارچه طراحی سادهتری دارند و به طور تقریبی تمامی طراحیها تا دهه ۱۹۸۰ اینگونه بودهاند. هستههای یکپارچه به صورت یک ایمیج باینری بزرگ -که در فضای آدرس معینی قرار میگیرد- پیادهسازی میشوند. این هسته در دیسک به صورت یک فایل باینری استاتیک مستقل ذخیره میشود. تمامی سرویسهای هسته موجود در فضای بزرگ هسته اجرا میشوند. ارتباطات ناچیزی در هسته وجود دارد زیرا تمام هسته در فضای آدرس مشخصی قابل دسترسی است و نیاز به هیچ گونه ارتباطی نیست. در این نوع هسته میتوان به طور مستقیم توابع را صدا زد. این نوع طراحی دارای سادگی و بازدهی بالاست و به طور تقریبی تمامی یونیکسها از این نوع طراحی بهره میبرند. در آن سو، ریز هسته به صورت یک فایل باینری بزرگ پیادهسازی نمیشود. در عوض قابلیتهای هسته در قالب پروسههای جداگانه به نام سرور (server) خرد میشود.
سرورهایی که به امکانات خاص نیاز دارند، در فضای اجازه داده شده و بقیه در فضای کاربر اجرا میشوند. تمامی سرورها فضای آدرس جداگانهای دارند، بنابراین امکان صدا کردن مستقیم توابع یکدیگر را ندارند. در عوض ارتباطات در ریزهسته از طریق ارسال پیغام (message passing) انجام میشود. با پیادهسازی مکانیزم ارتباط بین پروسهای (IPC) سریع، ارسال پیغام بین سرورها میتواند بر اساس مکانیزم IPC باشد. جداسازی سرورهای مختلف هنگامی که یکی از سرورها دچار شکست شد از شکست کلی سیستم جلوگیری میکند. مسئلهای که در طراحی یکپارچه وجود ندارد و با ناموفق بودن یک قسمت از هسته کل آن دچار شکست میشود. علاوه بر این ساختاریافتگی (modularity) طراحی ریزهسته به آن امکان میدهد که در هنگام اجرای هسته یک سرور جایگزین سرور دیگر شود. با توجه به هزینه ارتباط بین سرورها و تغییر رویه اجرایی (context switch) و انتقال پیغامها طراحی ریزهسته کمی نسبت به طراحی یکپارچه کندتر است. برای جبران مسئله سرعت کمتر و بهبود آن به طور تقریبی تمامی سیستمعاملهای امروزی که این روش طراحی را به کار میگیرند سرورها را در فضای هسته اجرا میکنند. جلوگیری از هزینه تغییر رویه اجرایی و بالقوه امکان صدا کردن مستقیم توابع سرورها را فراهم میکنند. سیستمعاملهایی مانند windows NT و Mach اینگونه هستند. .. (http://forum.isatice.com/showthread.php?t=57191)
● طراحی لینوکس:
لینوکس نکات مثبت هر دو روش ذکر شده را در خود جمع کرده است. لینوکس یک هسته یکپارچه دارد که در فضای آدرس مشخصی اجرا میشود. لینوکس طراحی ساختاریافته (modular) امکاناتی مانند اعمال زور (preemption)، رشتههای سطح هسته (kernel threads) و همچنین امکان بارگذاری فایلهای باینری جدا را هنگام اجرا نیز دارد. با این امکانات لینوکس از یک سو سرعتی برابر با طراحی یکپارچه و از سوی دیگر تمامی امکانات ریزهسته را در خود جمع کرده است.
با توجه به اینکه لینوکس بر پایه هیچ یونیکسی نیست توسعهدهندگان لینوکس میتوانند در هر لحظه بهترین تصمیمات را اتخاذ و در لینوکس اعمال کنند. در زیر مقایسهای بین هسته لینوکس و دیگر یونیکسها شکل میگیرد:
۱) لینوکس بارگذاری دینامیک ماجولهای هسته را پشتیبانی میکند. اگرچه طراحی هسته لینوکس یکپارچه است، اما این امکان را دارد که در هنگام لزوم بعضی از کدهای هسته به آن وارد یا از آن خارج شوند.
۲) لینوکس چند پردازندگی متقارن (SMP) را پشتیبانی میکند. اگرچه نسخههای جدید یونیکسها این امکان را پشتیبانی میکنند، اما این پشتیبانی در نسخههای قدیمی وجود نداشت.
۳) هسته لینوکس دارای اعمال زور یا به اصطلاح preemptive است. یونیکسهای قدیمیتر امکان اعمال زور را نداشتند.
۴) لینوکس روش جالبی در پیادهسازی رشتههای اجرایی یا threadها دارد. در لینوکس فرقی میان یک رشته و یک پروسه معمولی نیست. تنها فرقی که وجود دارد این است که بیت threadها در منابع به اشتراک گذاشته میشوند.
۵) لینوکس یک مدل شیگرا بر مدیریت دستگاهها به همراه رخدادهای قطع و وصل و فایل سیستم دستگاه در فضای کاربر (sysfs) دارد.
۶) لینوکس از پیادهسازی بعضی امکانات یونیکس که طراحی خوبی ندارند و به کار نمیروند چشمپوشی کرده است. مانند STREAMS که تقریبا مرده است.
۷) در نهایت لینوکس بر خلاف یونیکسهای دیگر به معنای واقعی کلمه آزاد است.
● نسخههای هسته لینوکس
هسته لینوکس در دو نوع نسخه منتشر میشود. پایدار و توسعه. هستههای پایدار نسخههایی هستند که میتوانند در محیط کاربری به کار روند. نسخههای پایدار جدید فقط برای رفع اشکالات و راهاندازهای جدید منتشر میشوند. در سوی دیگر هستههای سری توسعه در هر نسخه تغییرات زیادی میکنند و به حد قابل قبولی برای استفاده واقعی نرسیدهاند و مناسب نیستند.
هستههای توسعه، یک سری فاز توسعه دارند. در ابتدا توسعهدهندگان هسته روی امکانات جدید کار، تحقیق و بحث میکنند. پس از آن مرحله ثبت امکانات (feature freeze) است. پس از این مرحله هیچ امکان جدیدی به لیست امکانات موردنظر برای پیادهسازی اضافه نخواهد شد. توسعه کدها شروع شده و پس از مدتی که هسته به مرحلهای برسد که بتوان آن را به عنوان پایدار معرفی کرد مرحله ثبت کد (code freeze) آغاز میشود. پس از این مرحله فقط رفع اشکالها قبول میشوند. پس از پایان این مرحله میتوان امید داشت نسخه پایداری از هسته منتشر شود.
در این قسمت برای اینکه بتوانیم طراحی هسته لینوکس را بهتر درک کنیم بحثی پیرامون هستههای یکپارچه (monolithic kernels) و طراحی ریزهسته (microkernel design) انجام میدهیم:
http://www.owjit.com/Images/Article/1388/9/9/155/linux.jpg
طراحی هسته میتواند به دو نوع اصلی دستهبندی شود: یکپارچه و ریزهسته. (البته روش سومی نیز به نام exokernel وجود دارد که تاکنون بیشتر در تحقیقات مطرح شده، اما در دنیای واقعی نیز در حال راهیابی است. روشهای دیگری نیز هستند که کاربرد چندانی ندارند و از سه روش فوق مشتق شدهاند.) هستههای یکپارچه طراحی سادهتری دارند و به طور تقریبی تمامی طراحیها تا دهه ۱۹۸۰ اینگونه بودهاند. هستههای یکپارچه به صورت یک ایمیج باینری بزرگ -که در فضای آدرس معینی قرار میگیرد- پیادهسازی میشوند. این هسته در دیسک به صورت یک فایل باینری استاتیک مستقل ذخیره میشود. تمامی سرویسهای هسته موجود در فضای بزرگ هسته اجرا میشوند. ارتباطات ناچیزی در هسته وجود دارد زیرا تمام هسته در فضای آدرس مشخصی قابل دسترسی است و نیاز به هیچ گونه ارتباطی نیست. در این نوع هسته میتوان به طور مستقیم توابع را صدا زد. این نوع طراحی دارای سادگی و بازدهی بالاست و به طور تقریبی تمامی یونیکسها از این نوع طراحی بهره میبرند. در آن سو، ریز هسته به صورت یک فایل باینری بزرگ پیادهسازی نمیشود. در عوض قابلیتهای هسته در قالب پروسههای جداگانه به نام سرور (server) خرد میشود.
سرورهایی که به امکانات خاص نیاز دارند، در فضای اجازه داده شده و بقیه در فضای کاربر اجرا میشوند. تمامی سرورها فضای آدرس جداگانهای دارند، بنابراین امکان صدا کردن مستقیم توابع یکدیگر را ندارند. در عوض ارتباطات در ریزهسته از طریق ارسال پیغام (message passing) انجام میشود. با پیادهسازی مکانیزم ارتباط بین پروسهای (IPC) سریع، ارسال پیغام بین سرورها میتواند بر اساس مکانیزم IPC باشد. جداسازی سرورهای مختلف هنگامی که یکی از سرورها دچار شکست شد از شکست کلی سیستم جلوگیری میکند. مسئلهای که در طراحی یکپارچه وجود ندارد و با ناموفق بودن یک قسمت از هسته کل آن دچار شکست میشود. علاوه بر این ساختاریافتگی (modularity) طراحی ریزهسته به آن امکان میدهد که در هنگام اجرای هسته یک سرور جایگزین سرور دیگر شود. با توجه به هزینه ارتباط بین سرورها و تغییر رویه اجرایی (context switch) و انتقال پیغامها طراحی ریزهسته کمی نسبت به طراحی یکپارچه کندتر است. برای جبران مسئله سرعت کمتر و بهبود آن به طور تقریبی تمامی سیستمعاملهای امروزی که این روش طراحی را به کار میگیرند سرورها را در فضای هسته اجرا میکنند. جلوگیری از هزینه تغییر رویه اجرایی و بالقوه امکان صدا کردن مستقیم توابع سرورها را فراهم میکنند. سیستمعاملهایی مانند windows NT و Mach اینگونه هستند. .. (http://forum.isatice.com/showthread.php?t=57191)
● طراحی لینوکس:
لینوکس نکات مثبت هر دو روش ذکر شده را در خود جمع کرده است. لینوکس یک هسته یکپارچه دارد که در فضای آدرس مشخصی اجرا میشود. لینوکس طراحی ساختاریافته (modular) امکاناتی مانند اعمال زور (preemption)، رشتههای سطح هسته (kernel threads) و همچنین امکان بارگذاری فایلهای باینری جدا را هنگام اجرا نیز دارد. با این امکانات لینوکس از یک سو سرعتی برابر با طراحی یکپارچه و از سوی دیگر تمامی امکانات ریزهسته را در خود جمع کرده است.
با توجه به اینکه لینوکس بر پایه هیچ یونیکسی نیست توسعهدهندگان لینوکس میتوانند در هر لحظه بهترین تصمیمات را اتخاذ و در لینوکس اعمال کنند. در زیر مقایسهای بین هسته لینوکس و دیگر یونیکسها شکل میگیرد:
۱) لینوکس بارگذاری دینامیک ماجولهای هسته را پشتیبانی میکند. اگرچه طراحی هسته لینوکس یکپارچه است، اما این امکان را دارد که در هنگام لزوم بعضی از کدهای هسته به آن وارد یا از آن خارج شوند.
۲) لینوکس چند پردازندگی متقارن (SMP) را پشتیبانی میکند. اگرچه نسخههای جدید یونیکسها این امکان را پشتیبانی میکنند، اما این پشتیبانی در نسخههای قدیمی وجود نداشت.
۳) هسته لینوکس دارای اعمال زور یا به اصطلاح preemptive است. یونیکسهای قدیمیتر امکان اعمال زور را نداشتند.
۴) لینوکس روش جالبی در پیادهسازی رشتههای اجرایی یا threadها دارد. در لینوکس فرقی میان یک رشته و یک پروسه معمولی نیست. تنها فرقی که وجود دارد این است که بیت threadها در منابع به اشتراک گذاشته میشوند.
۵) لینوکس یک مدل شیگرا بر مدیریت دستگاهها به همراه رخدادهای قطع و وصل و فایل سیستم دستگاه در فضای کاربر (sysfs) دارد.
۶) لینوکس از پیادهسازی بعضی امکانات یونیکس که طراحی خوبی ندارند و به کار نمیروند چشمپوشی کرده است. مانند STREAMS که تقریبا مرده است.
۷) در نهایت لینوکس بر خلاف یونیکسهای دیگر به معنای واقعی کلمه آزاد است.
● نسخههای هسته لینوکس
هسته لینوکس در دو نوع نسخه منتشر میشود. پایدار و توسعه. هستههای پایدار نسخههایی هستند که میتوانند در محیط کاربری به کار روند. نسخههای پایدار جدید فقط برای رفع اشکالات و راهاندازهای جدید منتشر میشوند. در سوی دیگر هستههای سری توسعه در هر نسخه تغییرات زیادی میکنند و به حد قابل قبولی برای استفاده واقعی نرسیدهاند و مناسب نیستند.
هستههای توسعه، یک سری فاز توسعه دارند. در ابتدا توسعهدهندگان هسته روی امکانات جدید کار، تحقیق و بحث میکنند. پس از آن مرحله ثبت امکانات (feature freeze) است. پس از این مرحله هیچ امکان جدیدی به لیست امکانات موردنظر برای پیادهسازی اضافه نخواهد شد. توسعه کدها شروع شده و پس از مدتی که هسته به مرحلهای برسد که بتوان آن را به عنوان پایدار معرفی کرد مرحله ثبت کد (code freeze) آغاز میشود. پس از این مرحله فقط رفع اشکالها قبول میشوند. پس از پایان این مرحله میتوان امید داشت نسخه پایداری از هسته منتشر شود.