Linux که در اینجا منظور کرنل لینوکس است، پراستفادهترین سورسکد اپنسورس نرمافزاری در تاریخ نرمافزارهای کامپیوتری است و هر جایی که فکرش را بکنید حضور دارد؛ در کامپیوتر، سرور، موبایل، تلویزیون، زیردریایی، هواپیما، اتومبیلهای خودران و حتی در ایستگاه بینالمللی فضایی! اما شاید کمتر کسی بداند که کرنل واقعاً چیست و طرز کار آن چگونه است؟ پاسخ کامل مسلماً در این مقاله نمیگنجد اما قصد داریم طرز کار مهمترین بخشهای کرنل لینوکس را مورد بحث و بررسی قرار دهیم.
تا این لحظه (۲۰۱۸)، کرنل لینوکس شامل بیش از 21 میلیون خط کد میشود که هر خطی، دستورالعمل مهم مخصوص به خود را دربرمیگیرند اما پیش از شروع بحث دربارهٔ طرز کار کرنل لینوکس، باید بدانیم خود کرنل چیست و چه مسئولیتها و وظایفی دارد.
کرنل چیست؟
Kernel هستهٔ اصلی سیستمعامل است که منابع سیستم مانند پردازنده، حافظه و ... را به برنامههای دیگر اختصاص میدهد. کرنل را مانند زیرساخت و بنای اصلی ساختمان در نظر بگیرید؛ تمامی وسائل از زیرساختهای ساختمان به منظور استفادهٔ صحیح بهره میبرند. به عنوان مثال، برای استفاده از یخچال به مکانی ثابت و پریز برق نیاز داریم. آشپزخانه، پریز برق و سیمکشی ساختمان، جزئی از زیرساخت خانه هستند و منابع مورد نیاز مانند انرژی الکتریکی را در اختیار وسایل مربوطه قرار میدهند.
کرنل مفاهیم انتزاعی را برای برنامهنویسان فراهم میکند که میخواهند اپلیکیشنهایی برای پلتفرم مورد نظر خود توسعه دهند. این مفاهیم انتزاعی شامل سادهسازی انجام کارهای پیچیده است (به عنوان مثالی برای مفاهیم انتزاعی، ذخیره شدن فایل روی هارددیسک را در نظر بگیرید؛ برای این کار، نیازی به دانستن جایگاه بلاکها و کلاسترهای اشغال شده در هارد توسط فایل مورد نظر ندارید. ولی میدانید فایل مثلاً X روی درایو C ذخیره شده است).
کرنل تنها قسمت نرمافزاری یک سیستمعامل نیست که دربرگیرندهٔ مفاهیم انتزاعی است، بلکه در واقع یکی از مهمترین قسمتهای آن است. درایورهای سختافزاری بواسطهٔ کرنل با دیگر بخشها ارتباط برقرار میکنند (یا در واقع صحبت میکنند)، بنابراین کرنل نیازی ندارد نحوۀ صحبت کردن تکتک قسمتهای سختافزارهایی که ساخته میشود را یاد بگیرد. این چیزی است که باعث میشود یک کرنل، به تنهایی روی بسیاری از برندها و مدلهای مختلف سختافزاری اجرا شود.
منظور از مفاهیم انتزاعی در لینوکس چیست؟
وقتی دربارۀ مفاهیم انتزاعی صحبت میکنیم، باید بدانیم که دقیقاً چه منظوری از به کارگیری مفاهیم انتزاعی داریم. مفاهیم انتزاعی مرتبط با لینوکس به مفاهیم انتزاعی که در هنر به کار میروند بسیار شبیه است و به طور کلی منظور از مفاهیم انتزاعی نوعی از مفاهیم است که هر کسی به سادگی از درک آن عاجز است! به طور کلی، انتزاع در علوم کامپیوتر، روشی برای پنهانسازی جزئیات و مفاهیم پیچیدۀ پشت یک فرآیند است.
به عنوان مثال، خواندن و نوشتن متغیرها در RAM را در نظر بگیرید. هر مادربورد میتواند شامل انواع مختلف کنترلکنندۀ حافظه باشد؛ کامپیوتر شما ممکن است از پردازندۀ ARM ،Intel ،AMD ،SPARC ،POWERPC یا MIPS استفاده کند، اما این مسئله نباید ربطی به برنامۀ Hello World شما که نوشتهاید داشته باشد و در واقعیت هم ندارد چرا که کرنل تفاوت بین سختافزارهای مختلف را به شکل یک اینترفیس عمومی و به صورت انتزاعی ارائه میکند.
استفاده از این اینترفیس برای دولوپرها از یک سو شبیه به فراخوانی یک تابع است اما از سوی دیگر تاحدودی متفاوت است چرا که یک فراخوانی در سطح کل سیستم است. یک فراخوان سیستمی تابعی است که چیزی را از کرنل درخواست میکند؛ در این مرحله، کرنل درخواست مورد نظر را صرفنظر از سختافزار به کار رفته در سیستم اجرا خواهد کرد (کرنل لینوکس، استاندارد POSIX را در مورد فراخوانهای سیستمی به کار میبرد).
آشنایی با وظایف Linux Kernel
حال میخواهیم بدانیم کرنل لینوکس چه مسئولیتهایی دارد؛ به عبارت دیگر، چه مفاهیم انتزاعی را باید از کرنل هر سیستمعاملی توقع داشته باشیم تا برایمان فراهم کند که در ادامه با برخی از مهمترین آنها آشنا خواهید شد:
ذخیرهسازی داده
- حافظه با دسترسی تصادفی (RAM) به منظور خواندن و نوشتن متغیرها و دادهها در حافظه
- حافظه دائمی به منظور خواندن و نوشتن فایلها روی ابزارهای ذخیرهسازی دائمی مثل هارددیسک
- فایل سیستم مجازی
دسترسی به شبکه به منظور ارسال و دریافت دادهها روی یک شبکه کامپیوتری
- Physical Media Agnostic (اترنت، وایرلس، LTE، دایلآپ) که به روشی گفته میشود که هیچ پیشفرضی از ساختار شبکه از قبل وجود ندارد و باعث انعطافپذیری بیشتر در شبکههای نامنظم میشود. کاربرد آن هم در مسائل نرمافزاری و هم در سختافزاری است. به عنوان مثال، سیستمعاملها و ابزارهای مختلف مانند گوشی همراه، تبلت و لپتاپ از طریق پروتکل وای-فای قابلیت اتصال به یکدیگر را دارند.
- Partially Protocol Agnostic
زمانبندی کارها
- اشتراکگذاری زمانی پردازنده
- لود بالانسینگ و اولویتبندی کارها
پروتکل ابزارها (USB, FireWire, Serial, Parallel)
- فلش یواسبی
- وبکم
- ماوس و کیبورد
امنیت
- صدور پِرمیشن برای کاربران و گروههای کاربری
- صدور پِرمیشن به منابع
کرنل لینوکس با فراهم کردن سرویسهای ذکر شده به صورت انواع مختلف فراخوانهای سیستمی، توسعهٔ برنامهها را آسانتر میکند. بیایید به برخی از روشهایی که باعث سادهسازی توسعه و تولید بیشتر میشود نگاهی بیاندازیم.
ذخیرهسازی اطلاعات
دو روش برای ذخیرهسازی اطلاعات وجود دارد که عبارتند از ذخیرهسازی موقت و ذخیرهسازی دائمی. ذخیرهسازی موقتی به همان RAM داره دارد؛ هر چیزی که داخل رم شده، لازم نیست به طور دائمی ذخیره شود. یک نمونه برای درک بهتر این موضوع وقتی است که مشغول گشتوگذار در اینترنت هستید؛ شما قصد ندارید هر صفحهای که مشاهده مینمایید به طور دائم در کامپیوترتان ذخیره شود.
کرنل لینوکس به طور شفاف و صرف نظر از سختافزار استفاده شده، امکان خواندن و نوشتن اطلاعات روی رم را فراهم میکند. اهمیتی ندارد که لینوکستان را روی پردازندهٔ قدیمی اینتل i386 اجرا کنید یا جدیدترین مدل بر پایهٔ ARM روی تلفنهای همراه اندرویدی؛ در عین حال اصلاً نیازی نیست تا از قابلیت سازگاری اطمینان حاصل کنید و دست به تغییر کد بزنید.
به خاطر داشته باشید که کرنل لینوکس قسمتی است که به منظور پشتیبانی از سختافزارهای مختلف تغییر میکند و تغییرات کرنل است که امکان استفاده از اینترفیسی عمومی را با وجود عدم استفاده از سختافزارهای یکپارچه فراهم میکند.
به علاوه، کرنل تمامی پروسهها را در حافظهٔ مخصوص به خودش نگاهداری میکند بدین معنی که خود پروسهها نیازی به دانستن این که چه بخشی از حافظه در اختیار آنها است ندارند چرا که تمام حافظهای که برایشان قابل رؤیت است به آنها تعلق دارد. در واقع، این روش در تقسیمبندی حافظه، امنیت را بدون نیاز به دخالت توسعهدهندگان افزایش میدهد.
ذخیرهسازی دائمی هم ذخیره بر روی هارددرایو یا حافظهٔ فلش است. به طور مشابه، در حافظههای دائمی کرنل تفاوت در برقراری ارتباط با SATA ،PATA ،SCSI ،USB ،M.2 و پروتکلهای دیگر ذخیرهسازی را پنهان میکند و به یک برنامهٔ واحد اجازه میدهد تا به نوشتن و خواندن فایلها روی هر واسطی و با استفاده از هر پروتکل و فایل سیستم شناخته شدهای بدون هیچ تغییری در برنامه بپردازد و این قابلیت کرنل قدرت بینظیری را هم در اختیار توسعهدهنده و هم کاربر قرار میدهد. این قضیه همچنین قابلیت استفادهٔ مجدد از کدها و بهرهوری توسعهدهنده را افزایش میدهد چرا که نیازی به کدهای مخصوص برای پیکربندیهای مختلف نخواهد بود.
دسترسی به شبکه
وقتی صحبت از شبکه به میان میآید، قضیه کمی متفاوت میشود چرا که هر پروتکل، قالببندی مخصوص به خود را دارا است؛ بنابراین نیاز به کدنویسی مخصوص برای پشتیبانی هر کدام از پروتکلهای شبکه حس میشود (خوشبختانه فقط پروتکلهای IPv4 و IPv6 به صورت عمومی استفاده میشوند که در غیر این صورت، کار برای توسعهدهندگان کرنل لینوکس بسیار دشوار میشد). البته بسیاری از پروتکلهای دیگر مانند DECnet ،IPX و AppleTalk در لینوکس ساپورت میشوند ولی استفاده و پشتیبانی از اینها در اپلیکیشنهای جدید فایدۀ چندانی ندارد.
مجدد بپردازیم به IPv4 و IPv6. این دو، ساختار آدرسدهی بسیار متفاوتی با یکدیگر دارند ولی این قضیه به همان میزان که باعث دردسر میشود، سودمند نیز میباشد. پروتکل مورد نیاز -برای تشخیص توسط کرنل- به سادگی باتوجه به آدرس IP مشخص میشود. به علاوه، کرنل پشتیبانی از TCP ،UDP ،SCTP و ICMP را فراهم میکند که هر کدام از طریق فراخوانهای سیستمی قابل استفاده خواهند بود. مهم نیست که سیستم شما توسط پروتکل Ethernet به شبکه متصل شده یا LTE یا Dialup؛ فراخوانهای سیستمی همچنان یکسان خواهند بود.
تصور کنید بسته به این که از وایفای استفاده مینمایید یا اترنت، به نسخههای مختلفی از کروم یا فایرفاکس نیاز داشتید؛ که پیادهسازی این روش برای توسعهدهندگان کاری طاقتفرسا میبود. اما این قابلیت کرنل لینوکس نیز مفهوم بسیار قدرتمندی است و انعطاپذیری قابلتوجهی را فراهم میکند که باعث افزایش بهرهوری توسعهدهندگان و راحتی کاربران میشود.
زمانبندی کارها
زمانبندی تَسکهای مختلف موضوع بسیار پیچیده و مهمی در لینوکس است. بنابراین به مباحث الگوریتمهای زمانبندی کاری نداریم و تنها به مسئولیتها و وظایف کرنل میپردازیم و این که کرنل چگونه نوبت هر پروسه را برای استفاده از پردازنده مشخص میکند حتی اگر صدها پروسۀ مختلف در آنِ واحد وجود داشته باشند.
پیش از پیدایش پردازندههای چند هستهای، کامپیوترها در حقیقت میتوانستند تنها یک تَسک (وظیفه یا کار) را در لحظهای خاص انجام دهند. هر یک از پروسهها، سهم زمانی یکسانی را برای این که به ترتیب مورد پردازش قرار بگیرند در اختیار داشتند ولی این کار آنقدر سریع انجام میشد که باعث ایجاد تصور غلطی دربارۀ اجرای همزمان پروسهها صورت گرفته بود.
تا قبل از پردازندههای چندهستهای، تولیدکنندگان کامپیوترها برای اجرای بیش از یک فرایند در لحظه، باید بیش از یک پردازنده را در مادربورد تعبیه میکردند. این کار هنوز هم انجام میشود ولی با پردازندههای چندهستهای و با استفاده از مفهومی تحت عنوان Hyperthreading که باعث اجرای دو فرآیند به صورت همزمان بر روی یک هسته در برخی مدلهای پردازندههای اینتل میشود (این ویژگی باعث میشود سیستمها بتوانند در آن واحد بیش از صدها Thread را هَندل کنند).
هر پروسه نیاز به زمانی برای استفاده از پردازنده دارد و کرنل چیزی است که اطمینان حاصل میکند هر کدام از پروسهها طبق زمانبندی به نوبت خود خواهند رسید. گذشته از این، برخی پروسهها نیاز به تأخیر دارند که ممکن است به علت انتظار برای انجام عملیات I/O و یا هر چیز دیگری باشد. حال، به جای اشغال پردازنده در هنگام انتظار، فرایند دیگری میتواند نوبت را گرفته و اجرا شود و فرآیند اصلی بعد از گذراندن زمان مورد نیاز میتواند برای اجرا بازگردانده شود؛ در نتیجه، این کار باعث افزایش کارایی کلی سیستم میشود.
در مجموع، زمانبندی کارها بدان معنی است که توسعهدهنده نیازی به نگرانی دربارۀ اجرای فرآیندهای دیگر روی کامپیوتر ندارد و فقط باید نگران اجرای بدون نقص برنامهٔ خود باشد.
تعداد مفاهیم انتزاعی مرتبط با کرنل لینوکس فوقالعاده زیاد هستند و امکان پوشش دادن تمامی این مفاهیم در این مقاله وجود نداشت؛ به هر حال، امیدواریم که دیدی کلی نسبت به نحوهٔ عملکرد کرنل لینوکس پیدا کرده باشید. همچنین اگر علاقمند به شروع یادگیری لینوکس و سیستمعامل گنو/لینوکس هستید، میتوانید به دورهٔ آموزش لینوکس در سکان آکادمی مراجعه نمایید.