سیستم عامل: سه قطعه آسان. بخش 2: انتزاع: فرآیند (ترجمه)

مقدمه ای بر سیستم عامل ها

هی هابر! من می خواهم توجه شما را به مجموعه ای از مقالات - ترجمه های یک ادبیات جالب به نظر من - OSTEP جلب کنم. این مطالب عمیقاً کار سیستم‌های عامل یونیکس مانند را مورد بحث قرار می‌دهد، یعنی کار با فرآیندها، زمان‌بندی‌های مختلف، حافظه و سایر اجزای مشابه که یک سیستم‌عامل مدرن را تشکیل می‌دهند. شما می توانید اصل تمام مواد را اینجا ببینید اینجا. لطفا توجه داشته باشید که ترجمه غیرحرفه ای (کاملا آزادانه) انجام شده است، اما امیدوارم معنی کلی را حفظ کرده باشم.

کارهای آزمایشگاهی در مورد این موضوع را می توان در اینجا یافت:

قسمت های دیگر:

شما همچنین می توانید از کانال من دیدن کنید تلگرام =)

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

این مشکل را ایجاد می کند: چگونه می توان توهم بسیاری از CPU ها را فراهم کرد؟ چگونه سیستم عامل می تواند توهم تعداد تقریبا بی نهایت CPU را ایجاد کند، حتی اگر شما فقط یک CPU فیزیکی داشته باشید؟

سیستم عامل این توهم را از طریق مجازی سازی CPU ایجاد می کند. با شروع یک فرآیند، سپس توقف آن، شروع فرآیند دیگر و غیره، سیستم عامل می تواند این توهم را حفظ کند که CPU های مجازی زیادی وجود دارد، در حالی که در واقع یک یا چند پردازنده فیزیکی وجود خواهد داشت. این تکنیک نامیده می شود تقسیم منابع CPU بر اساس زمان. این تکنیک به کاربران اجازه می دهد تا هر تعداد که می خواهند فرآیندهای همزمان را اجرا کنند. هزینه این راه حل عملکرد است - زیرا اگر CPU توسط چندین فرآیند به اشتراک گذاشته شود، هر فرآیند کندتر پردازش می شود.
برای پیاده سازی مجازی سازی CPU، و به خصوص برای انجام آن به خوبی، سیستم عامل به پشتیبانی سطح پایین و سطح بالا نیاز دارد. پشتیبانی سطح پایین نامیده می شود مکانیسم ها روش ها یا پروتکل های سطح پایینی هستند که بخش مورد نیاز عملکرد را پیاده سازی می کنند. نمونه ای از چنین عملکردی، سوئیچینگ متنی است که به سیستم عامل این امکان را می دهد که یک برنامه را متوقف کند و برنامه دیگری را روی پردازنده اجرا کند. این تقسیم زمانی در تمامی سیستم عامل های مدرن پیاده سازی شده است.
در بالای این مکانیسم‌ها، منطقی به شکل «سیاست‌ها» در سیستم‌عامل تعبیه شده است. سیاست یک الگوریتم تصمیم گیری معین برای سیستم عامل است. به عنوان مثال، چنین سیاست هایی تصمیم می گیرند که کدام برنامه ابتدا (از لیست دستورات) راه اندازی شود. بنابراین به عنوان مثال این مشکل با سیاستی به نام حل خواهد شد زمانبندی (خط مشی زمانبندی) و هنگام انتخاب یک راه حل، با داده هایی مانند: تاریخچه راه اندازی (کدام برنامه در آخرین دقایق طولانی ترین راه اندازی شده است)، بارگیری این فرآیند (چه نوع برنامه هایی راه اندازی شده اند)، معیارهای عملکرد (این که آیا سیستم راه اندازی شده است) هدایت می شود. برای تعامل تعاملی یا برای توان عملیاتی بهینه شده است) و غیره.

انتزاع: فرآیند

انتزاع یک برنامه در حال اجرا که توسط سیستم عامل اجرا می شود همان چیزی است که ما می گوییم روند. همانطور که قبلا ذکر شد، یک فرآیند به سادگی یک برنامه در حال اجرا، در هر دوره زمانی آنی است. برنامه ای که با آن می توانیم اطلاعات خلاصه ای را از منابع مختلف سیستمی که این برنامه در حین اجرای آن به آنها دسترسی دارد یا بر آنها تأثیر می گذارد، به دست آوریم.
برای درک اجزای فرآیند، باید وضعیت های سیستم را درک کنید: آنچه برنامه می تواند در طول عملیات خود بخواند یا تغییر دهد. در هر زمان، باید بدانید کدام عناصر سیستم برای اجرای برنامه مهم هستند.
یکی از عناصر بارز حالت سیستمی که فرآیند شامل آن می شود است حافظه. دستورالعمل ها در حافظه قرار دارند. داده هایی که برنامه می خواند یا می نویسد نیز در حافظه قرار دارد. بنابراین، حافظه ای که یک فرآیند می تواند آدرس دهی کند (به نام فضای آدرس) بخشی از فرآیند است.
همچنین بخشی از وضعیت سیستم رجیسترها هستند. بسیاری از دستورالعمل ها با هدف تغییر مقدار ثبات ها یا خواندن مقدار آنها هستند و بنابراین ثبات ها نیز به بخش مهمی از عملیات فرآیند تبدیل می شوند.
لازم به ذکر است که حالت ماشین نیز از برخی رجیسترهای خاص تشکیل می شود. مثلا، IP - نشانگر دستورالعمل - یک اشاره گر به دستورالعملی که برنامه در حال اجرای آن است. نیز وجود دارد نشانگر پشته و مرتبط با آن نشانگر قاب، که برای مدیریت: پارامترهای تابع، متغیرهای محلی و آدرس های برگشتی استفاده می شوند.
در نهایت، برنامه ها اغلب به ROM (حافظه فقط خواندنی) دسترسی دارند. این اطلاعات «ورودی/خروجی» (ورودی/خروجی) باید شامل فهرستی از فایل‌هایی باشد که در حال حاضر توسط فرآیند باز می‌شوند.

API پردازش

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

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

سیستم عامل: سه قطعه آسان. بخش 2: انتزاع: فرآیند (ترجمه)

ایجاد فرآیند: جزئیات

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

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

هنگامی که کد و داده های استاتیک در حافظه سیستم عامل بارگذاری می شوند، چند کار دیگر وجود دارد که باید قبل از اجرای فرآیند انجام شود. مقداری از حافظه باید به پشته اختصاص داده شود. برنامه ها از پشته برای متغیرهای محلی، پارامترهای تابع و آدرس های برگشتی استفاده می کنند. سیستم عامل این حافظه را تخصیص داده و به فرآیند می دهد. پشته همچنین می تواند با برخی آرگومان ها تخصیص داده شود، به طور خاص پارامترهای تابع main() را پر می کند، به عنوان مثال با آرایه ای از argc و argv.

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

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

بنابراین، با بارگذاری کد و داده های استاتیک در حافظه، ایجاد و مقداردهی اولیه پشته و انجام سایر کارهای مربوط به انجام وظایف I/O، سیستم عامل مرحله را برای اجرای فرآیند آماده می کند. در نهایت، آخرین کار باقی مانده است: اجرای برنامه از طریق نقطه ورودی آن، به نام تابع main(). با اجرای تابع ()main، سیستم عامل کنترل CPU را به فرآیند ایجاد شده جدید منتقل می کند، بنابراین برنامه شروع به اجرا می کند.

وضعیت فرآیند

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

سیستم عامل: سه قطعه آسان. بخش 2: انتزاع: فرآیند (ترجمه)

شما می توانید این حالت ها را در قالب یک نمودار تصور کنید. همانطور که در تصویر می بینیم، وضعیت فرآیند می تواند به صلاحدید سیستم عامل بین RUNNING و READY تغییر کند. هنگامی که وضعیت یک فرآیند از آماده به RUNNING تغییر می کند، به این معنی است که فرآیند برنامه ریزی شده است. در جهت مخالف - از طرح حذف شده است. در لحظه ای که یک فرآیند مسدود می شود، به عنوان مثال، من یک عملیات IO را شروع می کنم، سیستم عامل آن را تا زمانی که رویدادی رخ دهد، به عنوان مثال تکمیل IO، آن را در این حالت نگه می دارد. در این لحظه انتقال به حالت آماده و احتمالاً بلافاصله به حالت در حال اجرا اگر سیستم عامل تصمیم بگیرد.
بیایید به مثالی نگاه کنیم که چگونه دو فرآیند در این حالت ها حرکت می کنند. برای شروع، اجازه دهید تصور کنیم که هر دو فرآیند در حال اجرا هستند و هر کدام فقط از CPU استفاده می کنند. در این صورت وضعیت آنها به این صورت خواهد بود.

سیستم عامل: سه قطعه آسان. بخش 2: انتزاع: فرآیند (ترجمه)

در مثال زیر، اولین فرآیند، پس از مدتی اجرا، IO را درخواست می‌کند و به حالت BLOCKED وارد می‌شود و به فرآیند دیگری اجازه اجرا می‌دهد (شکل 1.4). سیستم عامل می بیند که فرآیند 0 از CPU استفاده نمی کند و فرآیند 1 را شروع می کند. در حالی که فرآیند 1 در حال اجرا است، IO تکمیل می شود و وضعیت فرآیند 0 به READY تغییر می کند. در نهایت فرآیند 1 تکمیل شده و پس از تکمیل، فرآیند 0 کار خود را شروع، اجرا و به پایان می رساند.

سیستم عامل: سه قطعه آسان. بخش 2: انتزاع: فرآیند (ترجمه)

ساختار داده ها

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

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

علاوه بر حالت های آماده، مسدود شده، در حال اجرا، برخی از حالت های دیگر نیز وجود دارد. گاهی اوقات، در زمان ایجاد، ممکن است یک فرآیند در حالت INIT باشد. در نهایت، می توان یک فرآیند را در حالت FINAL قرار داد که قبلاً تکمیل شده باشد، اما اطلاعات آن هنوز پاک نشده باشد. در سیستم های یونیکس این حالت نامیده می شود فرآیند زامبی. این حالت برای مواردی مفید است که فرآیند والد می‌خواهد کد بازگشتی یک فرزند را بداند، به عنوان مثال، معمولاً 0 علامت موفقیت و 1 یک خطا است، اما برنامه‌نویسان می‌توانند کدهای خروجی اضافی را برای سیگنال مشکلات مختلف صادر کنند. هنگامی که فرآیند والد خاتمه می یابد، یک فراخوانی سیستمی نهایی مانند ()water() برقرار می کند تا منتظر شود تا پردازش فرزند خاتمه یابد و به سیستم عامل سیگنال می دهد که می تواند داده های مرتبط با فرآیند خاتمه یافته را پاک کند.

سیستم عامل: سه قطعه آسان. بخش 2: انتزاع: فرآیند (ترجمه)

نکات کلیدی سخنرانی:

روند - انتزاع اصلی یک برنامه در حال اجرا در سیستم عامل. در هر زمان، یک فرآیند را می توان با حالت آن توصیف کرد: محتویات حافظه در فضای آدرس آن، محتویات ثبات های پردازنده، از جمله اشاره گر دستورالعمل و نشانگر پشته، و اطلاعات IO، مانند فایل های باز در حال خواندن یا نوشتن.
API پردازش شامل فراخوانی هایی است که برنامه ها می توانند با پردازش ها برقرار کنند. معمولاً اینها ایجاد، حذف یا تماس‌های دیگر هستند.
● این فرآیند در یکی از بسیاری از حالت ها، از جمله در حال اجرا، آماده، مسدود شده است. رویدادهای مختلفی مانند زمان‌بندی، استثناهای زمان‌بندی یا انتظار می‌توانند وضعیت یک فرآیند را از یکی به دیگری تغییر دهند.
لیست فرآیند حاوی اطلاعاتی در مورد تمام فرآیندهای سیستم است. هر ورودی در آن بلوک کنترل فرآیند نامیده می شود که در واقع ساختاری است که شامل تمام اطلاعات لازم در مورد یک فرآیند خاص است. 

منبع: www.habr.com

اضافه کردن نظر