در پاسخ به این سؤال که Process (پروسه یا فرایند) چیست، بایستی بگوییم که یک پروسه نمایی از یک تسک یا یکسری تسکهای مرتبط با یکدیگر است که روی سیستم شما در حال اجرا هستند اما به یاد داشته باشیم که Process را با یک برنامه یا کامند یکسان در نظر نگیریم. به عبارت دیگر، یک برنامه ممکن است در آن واحد چندین پروسه را شروع نماید.
علاوه بر این، برخی پروسهها مجزا از یکدیگر هستند و برخی دیگر مرتبط میباشند و این در حالی است که بسته به شرایط، اجرای ناکامل یک پروسه ممکن است اجرای دیگر پروسههای در حال اجرای سیستم را تحتالشعاع خود قرار دهد (البته گاهی هم دیگر پروسهها هرگز از این بابت تأثیر نمیگیرند).
Processها بسیاری از ریسورسها (منابع) سیستمی همچون مموری، سیپییو و یا حتی دیوایسهای جانبی مثل پرینتر، مانیتور و … را مورد استفاده قرار میدهند و سیستمعامل، به خصوص کِرنِل، مسئول اختصاص سهم مناسبی از هر کدام از ریسورسهای فوقالذکر به هر پروسه و همچنین اطمینان حاصل کردن از این مسأله است که همهچیز به شکلی بهینه کار میکند.
آشنایی با انواع Processها در لینوکس
پنجرهٔ ترمینال لینوکس، که یکی از انواع شل لینوکس است، نوعی پروسه است که تا هر چقدر که نیاز داشته باشیم میتواند باز باشد و این امکان را به کاربران میدهد تا برنامهها و کامندهای مختلفی را اجرا کنند. همچنین گاهیاوقات کاربران میتوانند برنامههایی را در بکگراند اجرا کنند؛ به عبارت دیگر، این دست برنامهها از محیط شِل اصطلاحاً Detach (جدا) میشوند.
بسته به نوعی تسکی که پروسهها انجام میدهند، میتوان آنها را به دستههای مختلفی تقسیمبندی کرد که در جدول زیر برخی از رایجترین آنها به همراه توضیحات تکمیلی و مثال آورده شده است:
نوع فرایند توضیحات مثال Interactive این نوع فرایندها یا از طریق کامندلاین و یا از طریق یک اِلِمان رابط کاربری همچون آیکان، دکمه و ... میبایست توسط یک کاربر استارت شوند. bash ،firefox و top Batch فرایندهایی اتوماتیک هستند که شروع و پایان آنها از طریق ترمینال برنامهریزی میشود. این تسکها در صف قرار گرفته و بر اساس قانونی تحت عنوان FIFO اجرا میشوند. updatedb Daemon Daemonها تسکهایی هستند که دائما در حال اجرا میباشند و این در حالی است که بسیاری از آنها در حین استارت شدن سیستم لانچ شده و منتظر درخواست ،خواه از طرف کاربر و خواه از طرف خود سیستم، میمانند و به محض دریافت درخواست مد نظر، کار خود را شروع میکنند. httpd ،xinetd و sshd Thread به فرایندهای سبک اصطلاحاً Thread (تِرِد یا نخ) میگویند. تِرِدها تحت یک پروسهٔ اصلی قرار میگیرند اما تکتک آنها توسط خود سیستم اجرا و مدیریت میشوند. یک Thread بدون پایان یافتن یک پروسهٔ اصلی میتواند پایان یابد و این در حالی است که یک پروسهٔ اصلی در هر زمانی میتواند دست به ایجاد تِرِدهای جدید بزند.
به خاطر داشته باشید |
بسیاری از برنامههای به نسبت پیچیده، اصطلاحاً Multi-threaded هستند. gnome-terminal و firefox Kernel Thread یکسری تسکهای مرتبط با کِرنِل لینوکس هستند که کاربران لینوکس چه در مورد استارت شدنشان و چه در مورد پایان یافتنشان، هیچ کنترلی روی آنها ندارند. چنین تسکهایی کارهایی همچون انتقال یک تِرِد از یکی از هستههای سیپییو به هستهٔ دیگری و یا اطمینان حاصل کردن از اینکه تسکهای مرتبط با ورودی/خروجی (I/O) به درستی تکمیل شدهاند انجام میدهند. kswapd0 ،migration و ksoftirqd |
برنامهریزی پروسهها
زمانی که یک پروسه اصطلاحاً Running (در حال اجرا) باشد، این بدان معنا است که یا در حال اجرای دستورات در CPU است و یا در صف قرار گرفته تا به محض رسیدن نوبتش، دستوراتی که به آن محول شده را عملیاتی کند.
در کِرنِل لینوکس مفهومی داریم تحت عنوان Scheduler (برنامهریز) که دائما در حال جابهجا کردن پروسههای CPU است و بر اساس اولویتشان، زمان و دیگر منابع را به آنها اختصاص میدهد. پروسههایی که در چنین وضعیتی قرار دارند، گفته میشود که اصطلاحاً در Run Queue (صَف اجرا) قرار دارند و این در حالی است که در سیستمهایی با چندین CPU و یا CUPهای چند هستهای، هر کدامشان دارای یک صَف اجرای مجزا هستند.
به هر حال، گاهیاوقات پروسهها در حالتی که اصطلاحاً Sleep (خواب) نامیده میشود قرار میگیرند (مثلاً زمانی که ترمینال منتظر است تا کاربر کامندی را وارد کند)، که در چنین شرایطی پروسه در یک اصطلاحاً Waiting Queue (صَف انتظار) قرار میگیرد.
وضعیتهای دیگری هم برای پروسهها میتوان در نظر گرفت، به خصوص زمانی که پروسه پایان مییابد، اما به اندازهٔ وضعیتهای فوق رایج نیستند. به طور مثال، گاهیاوقات یک پروسهٔ به اصطلاح Child (فرزند) تکمیل میشود اما پروسهٔ Parent (والد) آن پروسه در جریان تکمیل شدن پروسهٔ فرزندش نیست که در چنین شرایطی اصطلاحاً گفته میشود که پروسه در وضعیت Zombie قرار دارد! به عبارت دیگر، میشود گفت که چنین پروسهای تقریباً به اتمام رسیده است اما کماکان در لیست پروسههای فعال سیستم نشان داده میشود.