سیستم‌عامل به‌هنگام

ارتباطات درون پردازه‌ای و اشتراک منابع

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

متوقف کردن وقفه‌ها

سیستم عامل‌های عام منظوره معمولاً به کاربران اجازه نمی‌دهند تا وقفه‌ها را غیرفعال کنند، چون برنامه‌ای که کاربر ان را نوشته نمی‌تواند پردازنده را تا هر زمانی که بخواهد دست خود بگیرد. بعضی از پردازنده‌های جدید نیز اجازه نمی‌دهد تا برنامهٔ سطح کاربر وقفه‌ها را غیرفعال کند به این خاطر که این قابلیت یک ویژگی کلیدی سیستم عامل محسوب می‌شود. با این حال تعداد زیادی از سیستم عامل ای به هنگام و سیستم‌های نهفته، اجازه این را می‌دهند تا برنامه‌ها در سطح هسته اجرا شوند تا فراخوان سیستمی بهینه تری داشته باشد و کنترل بیشتری روی محیط اجرایی بدون مداخله سیستم عامل داشته با شد.
در سیستم‌های تک پردازنده‌ای، برنامه‌ای که در سطح هسته اجرا می‌شود و وقفه‌ها را غیرفعال می‌کند کمترین سربار را برای دسترسی هم‌زمان به منابع مشترک دارد. در این حال که وقفه‌ها غیر فعالند و فرا خوانی متوقف شونده انجام ندهد پردازهٔ فعلی از پردازنده به صورت انحصاری استفاده می‌کند چون هیچ پردازهٔ دیگر یا وقفه‌ای نمی‌تواند کنترل را بدست بگیرد، پس محدودهٔ بحرانی در امان است. وقتی که پردازه از محدوده بحرانی خارج می‌شود باید وقفه‌ها را فعال کند، وقفه‌های در حال انتظار بعد از ان اجرا می‌شود. متوقف کردن وقفه‌ها باید زمانی انجام شود که طولانی‌ترین مسیر محدودهٔ بحرانی کمتر از بزرگترین مسیر پیش‌فرض باشد. معمولاً این متود محافظت زمانی استفاده می‌شود که محدودهٔ بحرانی دارای تعداد کمی دستور است و هیچ حلقه‌ای ندارد.

سمافور دو دو یی

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

تبادل پیام‌ها

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

سیستم رسیدگی به وقفه‌ها و زمان‌بندی

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

تخصیص حافظه

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