مدیریت فرآیند و نخ در لینوکس

فرآیند یا پروسس (process) در سیستم های عامل یک وظیفه (task) یا مجموعه ای از وظایف مرتبط با هم است که بر روی سیستم، در حال اجراست. البته یک فرآیند معادل یک برنامه نیست و ممکن است یک برنامه چندین فرآیند در حال اجرا داشته باشد.

نخ (thread) در سیستم های عامل، کوچکترین واحد کاری است که میتوان وقت پردازنده را به آن اختصاص داد.

 

در لینوکس، یک وظیفه (task) یا فرآیند (process) با ساختمان داده task_struct نمایش داده میشود. ساختمان داده task_struct حاوی اطلاعاتی در موارد زیر است.

 

  • حالت (State) : حاوی حالت اجرای فرآیند (اجرا، آماده، معلق، متوقف شده و جادویی) که در اواسط مقاله به توضیح آنها می پردازیم.
  • اطلاعات زمان بندی (Scheduling Information) : اطلاعات مورد نیاز لینوکس برای زمان بندی فرآیند ها. هر فرآیند میتواند عادی یا بی درنگ باشد؛ همچنین دارای یک اولویت است. پردازه های بی درنگ قبل از پردازه های عادی زمان بندی میشوند و در هر گروه میتوان از اولویت نسبی برای زمان بندی استفاده نمود. یک شمارنده، اطلاعات مربوط به زمان مجاز اجرای یک فرایند را نیز نگه میدارد.
  • شناسه ها (Identifiers) : هر فرآیند دارای یک شناسه فرآیند یکتا و همچنین شناسه های کاربر و گروه است. شناسه گروه برای تخصیص امتیاز دسترسی به منبع به گروهی از فرآیندها مورد استفاده قرار میگیرد.
  • ارتباط بین فرآیندها (Inter-process Communication) : لینوکس از راهکارهای ارتباطی موجود در یونیکس SVR4 پشتیبانی میکند.
  • پیوند ها (Links) : هر فرآیند دارای پیوندی به فرآیند پدر، پیوندهایی به فرآیندهای برادر (فرآیندهای با همان پدر) و پیوندهایی به همه فرزندانش می باشد.
  • زمان ها و زمان سنج ها (Times & Timers) : شامل زمان ایجاد پردازه و مقدار زمان پردازنده که تا کنون توسط فرآیند مصرف شده می باشد. همچنین یک فرایند ممکن است دارای یک یا چند زمان سنج بازه ای باشد. هر process با استفاده از یک فراخوانی سیستم، یک زمان سنج بازه ای را تعریف میکند؛ بنابراین با انقضای زمان سنج، یک سیگنال به فرایند فرستاده میشود. هر زمان سنج میتواند یک بار مصرف یا دوره ای باشد.
  • سیستم فایل (File System) : شامل یک اشاره گر به همه فایل هایی که توسط این فرآیند باز شده اند و نیز اشاره گرهایی به فهرست راهنمای (Directory) جاری و فهرست راهنمای ریشه این پردازه (فرآیند) می باشد.
  • فضای آدرس (Address Space) : فضای آدرس مجازی اختصاص یافته به فرآیند مربوطه را تعریف میکند.
  • متن ویژه فرآیند (Processor-Specific Context) : شامل اطلاعات ثبات ها و پشته که تشکیل دهنده متن این فرآیند است، می باشد.

 

حالات اجرای یک فرآیند در سیستم عامل لینوکس

حالات اجرای یک فرآیند در سیستم عامل لینوکس عبارتند از:

  • اجرا (Running) : مقدار این حالت با دو حالت متناظر است. فرآیندی که در این حالت قرار دارد یا در حال اجراست یا آماده اجرا.
  • وقفه پذیر (Interruptible) : این حالت یک حالت مسدود است که در آن فرآیند منتظر رخدادی مانند پایان یک عمل I/O، دسترسی به یک منبع یا سیگنالی از یک فرآیند دیگر می باشد.
  • وقفه ناپذیر (Uninterruptible) : این حالت نیز یک حالت مسدود است. تفاوت بین این حالت و حالت وقفه پذیر این است که در این حالت فرآیند مستقیماً در انتظار شرایط سخت افزاری است؛ بنابراین به هیچ سیگنالی رسیدگی نمیکند.
  • متوقف شده (Stopped) : فرآیند متوقف شده و فقط با عمل مثبتی از سروی یک فرآیند دیگر از سر گرفته خواهد شد. مثلاً میتوان فرآیندی را که در حالت Debugging (اشکال زدایی) است، در حالت متوقف شده قرار داد.
  • جادویی (Zombie) : فرآیند پایان یافته است، اما بنا به دلایلی، ساختار وظیفه آن هنوز باید در جدول فرآیند بماند.

 

مدیریت نخ ها در لینوکس

سیستم های سنتی یونیکس از یک نخ اجرا در هر فرآیند پشتیبانی میکنند، در حالی که سیستم های جدید یونیکس معمولاً از چندین نخ سطح هسته در هر فرآیند پشتیبانی می نمایند.

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

 

کتابخانه pthread برای مدیریت نخ ها

محبوب ترین کتابخانه در این مورد، کتابخانه pthread libraries (مخفف POSIX thread libraries) نام دارد.

همانطور که میدانید ویرایش های جدید یونیکس دارای نخ های سطح هسته می باشند.

لینوکس راه حل منحصر به فردی ارائه میکند که در آن تفاوتی بین نخ ها و فرآیند ها قائل نمیشود. با استفاده از راهکاری، نخ های سطح کاربر به فرایند های سطح هسته نگاشت میشوند.

نخ های سطح کاربر چندگانه که یک فرآیند سطح کاربر واحد را می سازند، به فرآیندهای سطح هسته لینوکس نگاشته میشوند؛ این فرآیندها یک شناسه گروه یکسان را به اشتراک میگذارند.

با این کار، تمام این فرآیندها میتوانند منابعی مانند فایل ها و حافظه را به اشتراک گذاشته و از نیاز به تعویض متن (هنگامی که زمان بندی بین فرایندهای یک گروه سوئیچ میکند) اجتناب کنند.

 

فرآیند در لینوکس چگونه ایجاد میشود ؟

در لینوکس هر فرآیند جدید با کپی کردن خصیصه های process جاری ایجاد میشود. هر فرایند جدید میتواند طوری ایجاد شود که منابع را (فایل ها، گرداننده های سیگنال و حافظه مجازی) به اشتراک بگذارد.

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

در لینوکس به جای فرمان fork() از فرمان clone() برای ایجاد فرآیند استفاده میشود. این فرمان شامل مجموعه ای از پرچم ها (flag) به عنوان آرگومان است. فراخوانی سیستم سنتی fork() توسط لینوکس به صورت فراخوانی سیستم clone() پیاده سازی میشود، به طوری که همه flag های آن پاک شده باشند.

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

 

فرآیندهای ایجاد شده که بخشی از یک گروه فرآیند هستند، میتوانند یک فضای حافظه را به اشتراک بگذارند؛ با این وجود نمیتوانند از پشته کاربر مشترک استفاده کنند. در نتیجه فراخوانی clone() برای هر فرآیند، فضاهای پشته جداگانه ایجاد میکند.