این مطلب صرفا چکیده و خلاصهای از مطالبی است که خواندهام و برای تثبیت و درک بهتر مفاهیم سعی کردم آنها را در قالب یک پست منتشر کنم. لذا احتمالا ایرادات فنی و حتی غیر فنی در آن وجود داشته باشد. از خوانندهگان ممنون میشوم اگر این ایرادات و اشکالات را به من اطلاع بدهند.
پروسهها احتمالا یکی از بنیادیترین مفاهیم در حوزه سیستمعامل محسوب میشوند. لذا ابتدا خود مفهوم پروسه را تعریف میکنیم و بعد از آن به توضیحات جانبی و دقیقتر میپردازیم.
پروسه یا همان process چیست؟
شاید یک تعریف خوب اما اندکی غیردقیق از پروسه، "هر برنامه در حال اجرا" باشد. توجه داشته باشید که خود "برنامه" به خودی خود صرفا اطلاعات خامی محسوب میشود که جایی در حافظه یا دیسک کامپیوتر ذخیره شده. وقتی تبدیل به یک پروسه میشود که اجرا شود. برای مثال یک برنامه برای محاسبه nامین عدد از دنباله فیبوناچی احتمالا تعدادی instruction -دستوراتی که پردازنده کامپیوتر میتواند آنها را اجرا کند- هست که در یک فایل در سیستم ذخیره شده است. وقتی این برنامه اجراء میشود، آن instruction ها به ترتیب در پردازنده اجرا میشوند. در این لحظه ما برنامه را اجراء و یک پروسه ایجاد کردیم.
تعبیر دیگری که از پروسه میتوان داشت، task یا وظیفهای است که به کامپیوتر محول شده تا آن را به انجام برساند. برای مثال کپی کردن یک فایل در کامپیوتر وظیفهای است که به کامپیوتر محول میشود و در نتیجه یک پروسه است.
از آنجایی که هر برنامه در حال اجرا احتمالا روزی متوقف میشود، پس هر پروسه عمر محدودی دارد. وقتی instruction های آن برنامه در حال اجرا تمام شوند، یا وظیفهای که کامپیوتر قرار بود انجام بدهد انجام شود، عمر پروسه تمام میشود.
هر پروسه، اطلاعاتی دارد که در ادامه بیشتر درمورد آنها صحبت خواهیم کرد، این اطلاعات در حافظه کش پردازنده یا حافظه اصلی خود کامپیوتر ذخیره میشوند. پردازنده کامپیوتر در هر مرحله از اجراء پروسه نیاز به دسترسی به این اطلاعات دارد. به همین علت معمولا پروسه در حال اجراء اطلاعاتش داخل حافظه کش پردازنده ذخیره میشود. چون حافظه کش فاصله خیلی کمتری با پردازنده دارد بسیار سریعتر از حافظه اصلی کامپیوتر است. ابتداء اجرا هر برنامه، برنامهای موسوم به loader، اطلاعات مربوط به آن برنامه - که قرار است اجرا شود- را از دیسک میخواند و در حافظه کش پردازنده یا حافظه اصلی سیستم مینویسد. بدون انجام چنین کاری، پردازنده برای دسترسی به اطلاعات هر پروسه مجبور است با دیسک کامپیوتر سر و کله بزند و این کار شدیدا کامپیوتر را کند خواهد کرد، طوری که عملا غیرقابل استفاده خواهد شد. شکل زیر تا حدی این مسئله را توضیح میدهد.
اطلاعات مربوط به هر پروسه
هر پروسه، برنامهای در حال اجراء است. هر برنامهای اطلاعاتی دارد. این اطلاعات شامل موارد زیر است:
حافظه اختصاص داده شده به خود داده خام برنامه (مورد اول) و متغیرهای برنامه (مورد دوم) ثابت هستند و در زمان اجرا برنامه تغییر نمیکنند. اما مورد سوم و چهارم تغییر میکنند بسته به وضعیت پروسه. شمای کلی این اطلاعات در حافظه به شکل زیر است:
همچنین هر پروسه برای تعامل با پردازنده کامپیوتر و سیستمعامل، اطلاعات اجرائی خود را در بخشی از حافظه با نام process control block یا PCB ذخیره میکند. PCB شامل اطلاعات زیر است:
وضعیت هر پروسه
هر پروسه به طور کلی احتمالا در یکی از وضعیتهای زیر هست:
تداخلها یا interrupt
هر پردازنده در هر لحظه تنها میتواند یک پروسه را پیش ببرد. درست برعکس حافظه که میتوان آنرا بین پروسههای مختلف در آن واحد تقسیم کرد. این محدودیت برای کامپیوترهای امروزی ما خیلی بزرگ است. ما انتظار داریم کامپیوترهای ما در هر لحظه بتوانند چندین پروسه را پیش ببرند. به همین منظور نیاز به تداخل یا interrupt داریم. تداخل یعنی، حین اجرا شدن یک برنامه، سیستمعامل تشخیص میدهد پروسه دیگری اولویت بیشتری دارد، و انجام پروسه قبلی را نصف نیمه، رها میکند و پروسه جدید را - که احتمالا اولویت بیشتری داشته- پیش ببرد. به ازاء هر تداخل، زمانی از پردازنده گرفته میشود تا اطلاعات پروسه قبلی را در حافظه اصلی کامپیوتر قرار بدهد (save) و اطلاعات پروسه جدید را در رجیسترهای خود بارگذاری کند (load). به فرایند تعویض اطلاعات برای اجرا پروسه جدید و ذخیره حالت پروسه قبلی context switch گفته میشود. باید توجه داشت که این فرایند باید طوری انجام شود که وضعیت پروسه قبلی بدون تغییر در حافظه ذخیره شود تا در آینده بتوان دوباره پردازش آن را از همان نقطه آخر ادامه داد.
سوالی که اینجا ممکن است پیش بیاید این است که سیستمعامل با چه منطقی تشخیص میدهد باید پروسه دیگری را جای پروسه کنونی اجرا کند. سیستمعامل با برنامهای بهنام زمانبند پردازنده یا cpu scheduler، الویت اجرایی پروسهها را تعیین میکند و آنها را بنابر الگویی مشخص اجرا میکند. اطلاعات بیشتر درمورد cpu scheduler احتمالا به صورت یک پست در آینده منتشر شود.
ارتباط پروسهها با یکدیگر
حال میدانیم که در مدت زمان مشخصی، احتمالا چند پروسه به نوبت در پردازنده اجرا میشوند. این پروسهها در بعضی حالات نیاز دارند تا با هم صحبت کنند (اطلاعاتی را بین یکدیگر منتقل کنند). به ارتباط بین پروسهها اصطلاحا IPC (interprocess communication) گفته میشود. این ارتباط، غالبا به دو صورت کلی انجام میشود:
منبع من برای مطالعه این موضوع اکثرا فصل سوم از کتاب Operating System Concepts، ویرایش دهم بود.