آیا می‌دانستید کرنل لینوکس چگونه کار می‌کند؟

آیا می‌دانستید کرنل لینوکس چگونه کار می‌کند؟

کرنل لینوکس، پر استفاده‌ ترین سورس کد نرم‌افزاری در تاریخ نرم‌افزارهای کامپیوتری است و هر جایی که فکرش را بکنید حضور دارد؛ در کامپیوتر، سرور، موبایل، تلویزیون، زیردریایی، هواپیما، اتومبیل‌های خودران و حتی در ایستگاه بین‌المللی فضایی! اما شاید کمتر کسی بداند که طرز کار آن چگونه است؟ پاسخ کامل مسلما در این مقاله نمی‌گنجد بنابراین قصد داریم به مرور طرز عملکرد مهم‌ترین بخش های کرنل لینوکس بپردازیم. در ادامه، با پروگرمینگ  همراه باشید.

کرنل لینوکس شامل بیش از ۲۱ میلیون خط کد می‌شود که هر کدام از آن‌ها، دستورالعمل مهمی مخصوص به خود را دربرمی‌گیرند اما پیش از شروع بحث دربارهٔ طرز کار کرنل هر سیستم عامل، باید بدانیم خود کرنل چیست و چه مسئولیت‌ها و وظایفی دارد (Kernel هستهٔ اصلی سیستم عامل است که منابع سیستم مانند پردازنده، حافظه و … را به برنامه های دیگر اختصاص می‌دهد. کرنل را مانند زیرساخت و بنای اصلی ساختمان در نظر بگیرید. تمامی وسایل، از زیرساخت‌های ساختمان به منظور استفاده صحیح بهره می‌برند. به عنوان مثال، برای استفاده از یخچال به مکانی ثابت و پریز برق نیاز داریم. آشپزخانه، پریز برق و سیم کشی ساختمان، جزئی از زیرساخت خانه هستند و منابع مورد نیاز مانند انرژی الکتریکی را در اختیار وسایل مربوطه قرار می دهند.)

کرنل مفاهیم انتزاعی را برای برنامه‌نویسان فراهم می‌کند که می خواهند اپلیکیشن‌هایی برای پلتفرم مورد نظر خود توسعه دهند. این مفاهیم انتزاعی شامل ساده‌سازی انجام کارهای پیچیده است (به عنوان مثالی برای مفاهیم انتزاعی، ذخیره شدن فایل روی هارد‌ دیسک را در نظر بگیرید. برای این کار، نیازی به دانستن جایگاه بلاک‌ها و کلاسترهای اشغال شده در هارد توسط فایل مورد نظر ندارید. ولی می دانید فایل مثلا X روی درایو C ذخیره شده است.)

کرنل تنها قسمت نرم‌افزاری یک سیستم‌عامل نیست که دربرگیرندهٔ مفاهیم انتزاعی است، بلکه در واقع یکی از مهم‌ترین قسمت‌های آن است. درایورهای سخت‌افزاری به زبان کرنل ارتباط برقرار می کنند (یا در واقع صحبت می کنند) بنابراین کرنل نیازی ندارد نحوۀ صحبت کردن تک تک قسمت‌های سخت افزارهایی که ساخته می شود را یاد بگیرد. این چیزی است که باعث می‌شود یک کرنل، به تنهایی روی بسیاری از برندها و مدل‌های مختلف سخت‌افزاری اجرا شود.

بنابراین وقتی دربارۀ مفاهیم انتزاعی صحبت می‌کنیم، باید بدانیم که دقیقا چه منظوری از به کارگیری «مفاهیم انتزاعی» داریم. مفاهیم انتزاعی مرتبط با لینوکس به مفاهیم انتزاعی که در هنر به کار می‌روند بسیار شبیه است و به طور کلی منظور از مفاهیم انتزاعی نوعی از مفاهیم است که هر کسی به سادگی از درک آن عاجز است! به طور کلی، انتزاع در علوم کامپیوتر، روشی برای پنهان سازی جزئیات و مفاهیم پیچیدۀ پشت یک فرآیند است.

به عنوان مثال، خواندن و نوشتن متغیرها در رم را در نظر بگیرید. هر مادربورد می‌تواند شامل انواع مختلف کنترل کنندۀ حافظه باشد، کامپیوتر شما ممکن است از پردازندۀ ARM، Intel، AMD، SPARC، POWERPC یا MIPS استفاده کند، اما این مسئله نباید ربطی به برنامۀ Hello World شما داشته باشد و در واقعیت هم ندارد. چرا که کرنل تفاوت بین سخت افزارهای مختلف را به شکل یک اینترفیس عمومی و به صورت انتزاعی در اختیار قرار می‌دهد.

استفاده از این اینترفیس برای برنامه‌نویسان، شبیه به فراخوانی توابع دیگر است اما در واقع فرق می‌کند چرا که یک فراخوان سیستمی است. یک فراخوان سیستمی تابعی است که چیزی را از کرنل درخواست می‌کند، در این مرحله، کرنل درخواست مورد نظر را صرف نظر از سخت افزار به کار رفته در سیستم اجرا خواهد کرد (کرنل لینوکس، استاندارد POSIX را در مورد فراخوان های سیستمی به کار می برد.)

حال، می خواهیم بدانیم کرنل لینوکس چه مسئولیت‌هایی دارد، به عبارت دیگر چه انتزاعاتی را باید از کرنل هر سیستم عامل مدرن توقع داشته باشیم تا برایمان فراهم کند؟

  • ذخیره‌سازی داده
    • حافظه با دسترسی تصادفی (RAM) به منظور خواندن و نوشتن متغیرها و داده‌ها در حافظه
    • حافظه دائمی به منظور خواندن و نوشتن فایل‌ها روی ابزارهای ذخیره‌سازی دائمی مثل هارد دیسک
    • سیستم فایل مجازی
  • دسترسی به شبکه به منظور ارسال و دریافت داده‌ها روی یک شبکه کامپیوتری
    • Physical Media Agnostic (اترنت، وایرلس، LTE، دایل آپ) که به روشی گفته می شود که هیچ پیش فرضی از ساختار شبکه از قبل وجود ندارد و باعث انعطاف پذیری بیشتر در شبکه‌های نامنظم می‌شود. کاربرد آن هم در مسائل نرم‌افزاری و هم در سخت‌افزاری وجود دارد. به عنوان مثال، سیستم عامل‌ها و ابزار مختلف مانند گوشی همراه، تبلت و لپتاپ از طریق پروتکل وای-فای قابلیت اتصال به یکدیگر را دارند.
    • Partially Protocol Agnostic
  • زمان بندی کارها
    • اشتراک گذاری زمانی پردازنده
    • لود بالانسینگ و اولویت بندی کارها
  • پروتکل ابزارها (USB، FireWire، Serial، Parallel)
    • فلش USB
    • وبکم
    • ماوس و کیبورد
  • امنیت
    • صدور پرمیشن برای کاربران و گروه‌های کاربری
    • صدور پرمیشن به منابع

کرنل لینوکس با فراهم کردن سرویس‌ها و خدمات ذکر شده به صورت انواع مختلف فراخوان های سیستمی، توسعهٔ برنامه‌ها را آسان‌تر می‌کند. بیایید به برخی از روش‌هایی که باعث ساده‌سازی توسعه و تولید بیشتر می‌شود نگاهی بیاندازیم.

ذخیره‌سازی اطلاعات 
دو روش برای ذخیره‌سازی اطلاعات وجود دارد که عبارتند از ذخیره‌سازی موقت و ذخیره‌سازی دائمی. ذخیره‌سازی موقتی همان رم است. هر چیزی که داخل رم شده، لازم نیست به طور دائمی ذخیره شود. یک نمونه برای درک بهتر این مطلب وقتی است که مشغول گشت و گذار در اینترنت هستید، شما قصد ندارید هر صفحه ای که مشاهده می‌نمایید به طور دائم در کامپیوترتان ذخیره شود. ذخیره سازی دائمی همان ذخیره بر روی هارد درایو، حافظه فلش یا SSD تان است.

کرنل لینوکس به طور شفاف و صرف نظر از سخت‌افزار استفاده شده، امکان خواندن و نوشتن اطلاعات روی رم را فراهم می‌کند. اهمیتی ندارد که لینوکس‌تان را روی پردازنده قدیمی اینتل i386 اجرا کنید یا جدیدترین مدل بر پایه ARM روی تلفن های همراه اندرویدی! و در عین حال اصلا نیازی نیست تا این‌ که از قابلیت سازگاری اطمینان حاصل کنید، دست به تغییر کد بزنید. به خاطر داشته باشید که کرنل لینوکس قسمتی است که به منظور پشتیبانی از سخت‌افزارهای مختلف، تغییر می‌کند و تغییرات کرنل است که امکان استفاده از اینترفیسی عمومی را با وجود عدم استفاده از سخت‌افزارهای یکپارچه فراهم می کند.

به علاوه، کرنل تمامی پروسه‌ها را در حافظه مخصوص به خودش نگه‌داری می‌کند به این معنی که خود پروسه‌ها نیازی به دانستن این که چه بخشی از حافظه در اختیار آن‌ها است ندارند چرا که تمام حافظه‌ای که برایشان قابل رویت است، به آن‌ها تعلق دارد. در واقع این روش در تقسیم‌بندی حافظه، امنیت را بدون نیاز به دخالت توسعه دهندگان افزایش می‌دهد.

به طور مشابه، در حافظه های دائمی، کرنل تفاوت در برقراری ارتباط با SATA، PATA، SCSI، USB، M.2 و پروتکل‌های دیگر ذخیره‌سازی را پنهان می‌کند و به یک برنامه واحد اجازه می‌دهد تا به نوشتن و خواندن فایل‌ها روی هر واسطی و با استفاده از هر پروتکل و فایل سیستم شناخته شده‌ای بدون هیچ تغییری در برنامه بپردازد. و این امکان، قدرت بی‌نظیری را هم در اختیار توسعه‌دهنده و هم کاربر قرار می‌دهد. این قضیه همچنین قابلیت استفاده مجدد از کدها و بهره‌وری توسعه‌دهنده را افزایش می‌دهد چرا که نیازی به کدهای مخصوص برای پیکربندی‌های مختلف نخواهد بود.

دسترسی به شبکه 
وقتی صحبت از شبکه به میان می‌آید، قضیه کمی متفاوت می‌شود چرا که هر پروتکل، قالب‌بندی مخصوص به خود را دارا است، بنابراین نیاز به کدنویسی مخصوص برای پشتیبانی هر کدام از پروتکل‌های شبکه حس می‌شود (خوشبختانه فقط پروتکل‌های IPv4 و IPv6 به صورت عمومی استفاده می‌شوند که در غیر این صورت، کار برای توسعه‌دهندگان کرنل لینوکس بسیار دشوار می‌شد!) البته برای بسیاری از پروتکل‌های دیگر مانند DECnet، IPX و AppleTalk در لینوکس پشتیبانی وجود دارد ولی استفاده و پشتیبانی از این‌ها در اپلیکیشن‌های جدید فایدۀ چندانی ندارد.

برگردیم به IPv4 و IPv6. این دو، ساختار آدرس‌دهی بسیار متفاوتی با یکدیگر دارند ولی این قضیه به همان میزان که باعث دردسر می شود، سودمند نیز هست. پروتکل مورد نیاز -برای تشخیص توسط کرنل- به سادگی با توجه به آدرس IP مشخص می‌شود. به علاوه، کرنل پشتیبانی از TCP، UDP، SCTP و ICMP را فراهم می‌کند که هر کدام از طریق فراخوان‌های سیستمی قابل استفاده خواهند بود. مهم نیست که سیستم شما توسط پروتکل اترنت به شبکه متصل شده یا LTE یا Dialup؛ فراخوان‌های سیستمی همچنان یکسان خواهند بود.

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

زمان‌بندی کارها 
زمان‌بندی تسک های مختلف موضوع بسیار پیچیده و بزرگی است. بنابراین به مباحث الگوریتم‌های زمان‌بندی کاری نداریم و تنها به مسئولیت‌ها و وظایف کرنل می‌پردازیم و این که کرنل چگونه نوبت هر پروسه را برای استفاده از پردازنده مشخص می‌کند، حتی اگر صدها پروسۀ مختلف در آنِ واحد وجود داشته باشند.

پیش از پیدایش پردازنده‌های چند هسته‌ای، کامپیوترها در حقیقت می‌توانستند تنها یک وظیفه را در لحظه‌ای خاص انجام دهند. هر یک از پروسه‌ها، سهم زمانی یکسانی را برای این که به ترتیب مورد پردازش قرار بگیرند در اختیار داشتند، ولی این کار آنقدر سریع انجام می‌شد که باعث ایجاد تصور غلطی دربارۀ اجرای همزمان پروسه‌ها صورت گرفته بود. تا قبل از پردازنده های چند هسته‌ای، تولیدکنندگان کامپیوترها برای اجرای بیش از یک فرایند در یک لحظه، باید بیش از یک پردازنده را در مادربورد تعبیه می‌کردند. این کار هنوز هم انجام می‌شود ولی با پردازنده‌های چند هسته‌ای و با استفاده از مفهومی تحت عنوان Hyperthreading، که باعث اجرای دو فرآیند به صورت هم‌زمان بر روی یک هسته در برخی مدل‌های پردازنده‌های اینتل می‌شود (این ویژگی باعث می‌شود سیستم‌ها بتوانند در آن واحد بیش از صدها Thread را مدیریت کنند.)

هر پروسه نیاز به زمانی برای استفاده از پردازنده دارد و کرنل چیزی است که اطمینان حاصل می‌کند هر کدام از پروسه‌ها طبق زمان‌بندی به نوبت خود خواهند رسید. گذشته از این، برخی پروسه‌ها نیاز به تاخیر دارند که ممکن است به علت انتظار برای انجام عملیات I/O باشد و یا هر چیز دیگری باشد. حال، به جای اشغال پردازنده در هنگام انتظار، فرایند دیگری می‌تواند نوبت را گرفته و اجرا شود و فرآیند اصلی بعد از گذراندن زمان مورد نیاز می‌تواند برای اجرا بازگردانده شود، در نتیجه این کار باعث افزایش کارایی کلی سیستم می‌شود. در مجموع، زمان‌بندی کارها بدان معنی است که توسعه‌دهنده نیازی به نگرانی دربارۀ اجرای فرآیندهای دیگر روی کامپیوتر ندارد و فقط باید نگران اجرای بدون نقص برنامهٔ خود باشد.

تعداد مفاهیم انتزاعی مرتبط با کرنل لینوکس فوق‌العاده زیاد هستند و امکان پوشش دادن تمامی این مفاهیم در این مقاله وجود نداشت؛ به هر حال، امیدواریم که دیدی کلی نسبت به نحوهٔ عملکرد کرنل لینوکس پیدا کرده باشید.

برچسب ها: Linux, سیستم عامل, سیستم عامل لینوکس, کرنل, کرنل لینوکس, لینوکس, هسته لینوکس,

نویسنده: نعمت تابانی

عاشق برنامه نویسی , گیم و سینما

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد.

کد امنیتی *