امیررضا ریاحی
امیررضا ریاحی
خواندن ۶ دقیقه·۳ سال پیش

پروسه‌ها در دنیای سیستم‌عامل چیستند؟

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


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

پروسه یا همان process چیست؟

شاید یک تعریف خوب اما اندکی غیردقیق از پروسه، "هر برنامه در حال اجرا" باشد. توجه داشته باشید که خود "برنامه" به خودی خود صرفا اطلاعات خامی محسوب می‌شود که جایی در حافظه یا دیسک کامپیوتر ذخیره شده. وقتی تبدیل به یک پروسه می‌شود که اجرا شود. برای مثال یک برنامه برای محاسبه nامین عدد از دنباله فیبوناچی احتمالا تعدادی instruction -دستوراتی که پردازنده کامپیوتر می‌تواند آن‌ها را اجرا کند- هست که در یک فایل در سیستم ذخیره شده است. وقتی این برنامه اجراء می‌شود، آن instruction ها به ترتیب در پردازنده اجرا می‌شوند. در این لحظه ما برنامه را اجراء و یک پروسه ایجاد کردیم.

تعبیر دیگری که از پروسه می‌توان داشت، task یا وظیفه‌ای است که به کامپیوتر محول شده تا آن را به انجام برساند. برای مثال کپی کردن یک فایل در کامپیوتر وظیفه‌ای است که به کامپیوتر محول می‌شود و در نتیجه یک پروسه است.

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

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

شمای کلی کار loader
شمای کلی کار loader


اطلاعات مربوط به هر پروسه

هر پروسه، برنامه‌ای در حال اجراء است. هر برنامه‌ای اطلاعاتی دارد. این اطلاعات شامل موارد زیر است:

  • خود داده خام برنامه (فایل اجرائی آن، که غالبا به صورت یک فایل باینری هست)
  • متغیر‌های برنامه (اعم از متغیرهای مقداردهی شده و مقداردهی نشده، initialized و uninitialized)
  • حافظه stack (مخصوص اجرا توابع)
  • حافظه heap (حافظه‌ای که به صورت پویا در زمان اجرا برنامه تغییر اندازه می‌دهد بر حسب نیاز)

حافظه اختصاص داده شده به خود داده خام برنامه (مورد اول) و متغیرهای برنامه (مورد دوم) ثابت هستند و در زمان اجرا برنامه تغییر نمی‌کنند. اما مورد سوم و چهارم تغییر می‌کنند بسته به وضعیت پروسه. شمای کلی این اطلاعات در حافظه به شکل زیر است:

حافظه استک و هیپ میتوانند در اندازه محدودی تغییر ظرفیت دهند.
حافظه استک و هیپ میتوانند در اندازه محدودی تغییر ظرفیت دهند.


همچنین هر پروسه برای تعامل با پردازنده کامپیوتر و سیستم‌عامل، اطلاعات اجرائی خود را در بخشی از حافظه با نام process control block یا PCB ذخیره می‌کند. PCB شامل اطلاعات زیر است:

  • وضعیت پروسه (process state) که در ادامه توضیح خواهیم داد
  • آدرس instruction بعدی که پردازنده باید اجرا کند (program counter)
  • رجیسترهای پردازنده (اطلاعاتی که پردازنده برای اجرا instruction بعدی نیاز دارد، مانند اشاره‌گرهای برنامه)
  • اطلاعات فایل‌های باز مربوط به این پروسه یا همان IO status
اطلاعات اجرایی هر ئروسه در PCB ذخیره میشود.
اطلاعات اجرایی هر ئروسه در PCB ذخیره میشود.


وضعیت هر پروسه

هر پروسه به طور کلی احتمالا در یکی از وضعیت‌های زیر هست:

  • شروع : پروسه تازه ایجاد شده و هنوز پردازش آن شروع نشده.
  • در حال اجراء: پروسه در حال اجرا توسط پردازنده است.
  • انتظار: پروسه منتظر چیزی است. مثلا منتظر گرفتن ورودی از کاربر یا خواندن داده‌ای از فایل یا دریافت اطلاعاتی از شبکه.
  • آماده: پروسه آماده اجرا شدن توسط پردازنده است. اما هنوز اجرا نشده.
  • پایان: اجرا پروسه به اتمام رسیده است.


تداخل‌ها یا interrupt

هر پردازنده در هر لحظه تنها می‌تواند یک پروسه را پیش ببرد. درست برعکس حافظه که می‌توان آن‌را بین پروسه‌های مختلف در آن واحد تقسیم کرد. این محدودیت برای کامپیوترهای امروزی ما خیلی بزرگ است. ما انتظار داریم کامپیوترهای ما در هر لحظه بتوانند چندین پروسه را پیش ببرند. به همین منظور نیاز به تداخل یا interrupt داریم. تداخل یعنی، حین اجرا شدن یک برنامه، سیستم‌عامل تشخیص می‌دهد پروسه دیگری اولویت بیشتری دارد، و انجام پروسه قبلی را نصف نیمه، رها می‌کند و پروسه جدید را - که احتمالا اولویت بیشتری داشته- پیش ببرد. به ازاء هر تداخل، زمانی از پردازنده گرفته می‌شود تا اطلاعات پروسه قبلی را در حافظه اصلی کامپیوتر قرار بدهد (save) و اطلاعات پروسه جدید را در رجیسترهای خود بارگذاری کند (load). به فرایند تعویض اطلاعات برای اجرا پروسه جدید و ذخیره حالت پروسه قبلی context switch گفته می‌شود. باید توجه داشت که این فرایند باید طوری انجام شود که وضعیت پروسه قبلی بدون تغییر در حافظه ذخیره شود تا در آینده بتوان دوباره پردازش آن را از همان نقطه آخر ادامه داد.

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


ارتباط پروسه‌ها با یک‌دیگر

حال می‌دانیم که در مدت زمان مشخصی، احتمالا چند پروسه به نوبت در پردازنده اجرا می‌شوند. این پروسه‌ها در بعضی حالات نیاز دارند تا با هم صحبت کنند (اطلاعاتی را بین یک‌دیگر منتقل کنند). به ارتباط بین پروسه‌ها اصطلاحا IPC (interprocess communication) گفته می‌شود. این ارتباط، غالبا به دو صورت کلی انجام می‌شود:

  • حافظه اشتراکی یا shared memory : در این حالت، دو پروسه، قسمتی از حافظه را به صورت اشتراکی استفاده می‌کنند. هر پروسه می‌تواند برای انتقال اطلاعات، داده مورد نظر خود را در بخش حافظه اشتراکی بنویسد. در این حالت، پروسه دیگر دسترسی خواندن این داده را دارد و می‌تواند این داده را بخواند. این نوع ارتباط بین دو پروسه، از نظر پیاده‌سازی برای سیستم‌عامل نسبتا ساده است، اما کار برای برنامه‌نویسان برنامه‌ها سخت می‌شود. چون خودشان باید قواعد مشخصی برای استفاده از حافظه اشتراکی را تنظیم کنند. توجه داشته باشید که به طور پیش‌فرض، پروسه‌ها به حافظه یک‌دیگر دسترسی ندارند. هر پروسه به بخشی از حافظه که فقط متعلق به خودش هست دسترسی دارد.
  • ارسال پیام یا message passing system: همان‌طور که از نامش پیداست، این مکانیزم، به برنامه‌نویس اجازه می‌دهد تا داده مشخصی را برای یک پروسه مشخص ارسال کند. این مکانیزم برای پیاده‌سازی خود سیستم‌عامل سخت‌تر است اما کار برای برنامه‌نویسان ساده‌تر می‌شود. چون دیگر نیاز به تنظیم و پیاده‌سازی قوانین خود نیست. صرفا باید system call مخصوص ارسال پیام به پروسه مشخص را صدا کند. وظیفه ارسال پیام به پروسه مقصد، با سیستم‌عامل است.

منبع من برای مطالعه این موضوع اکثرا فصل سوم از کتاب Operating System Concepts، ویرایش دهم بود.



سیستم‌عاملپروسهprocess
شاید از این پست‌ها خوشتان بیاید