استثنا چیست
یک Exception (که بسته به منبعش گاهی Interrupt نیز نامیده میشود) یک رویداد غیرمنتظره در حین اجرای دستور است که جریان معمولی یک برنامه نمیتواند بهتنهایی آن را مدیریت کند، مانند تلاش برای اجرای دستوری با یک opcode نامعتبر، سرریز محاسباتی، یا تلاش برای دسترسی به یک آدرس حافظه که برنامه اجازه دسترسی به آن را ندارد.
چرا استثناها را نمیتوان بهسادگی نادیده گرفت
ادامه اجرای معمولی پس از یک شرط استثنایی رفتار نادرست یا نامشخصی تولید میکند. در عوض، پردازنده باید دستور خطاساز را متوقف کند، اطلاعات کافی درباره آنچه در آن لحظه در حال رخ دادن بود را حفظ کند، و کنترل را به یک قطعه نرمافزاری خاص به نام Exception Handler منتقل کند، که تصمیم میگیرد چگونه پاسخ دهد، چه به معنای خاتمه دادن به برنامه خطاساز باشد چه تلاش برای نوعی بازیابی.
تشخیص استثناها در یک طرح پایپلاینشده
در یک پردازنده پایپلاینشده، چند دستور بهطور همزمان در حال پیشرفت هستند، و دستورات مختلف میتوانند در مراحل مختلف پایپلاین استثنا فعال کنند. یک opcode نامعتبر معمولاً در حین decode تشخیص داده میشود، در حالی که سرریز محاسباتی فقط در حین مرحله execute تشخیص داده میشود، و یک نقض دسترسی حافظه ممکن است فقط در حین مرحله دسترسی به حافظه تشخیص داده شود.
به همین دلیل، پایپلاین باید همراه با هر دستور در حین حرکت آن به جلو ردیابی کند که آیا هر شرط استثنایی را فعال کرده یا نه، بدون اینکه بلافاصله کل پایپلاین را در لحظهای که شرط برای اولینبار تشخیص داده میشود متوقف کند.
شباهت با خطرهای کنترلی
مدیریت یک استثنا شباهت زیادی به مدیریت یک شاخه پیشبینینادرستشده دارد، که پیشتر در این مجموعه پوشش داده شد: دستوراتی که پس از دستور استثناساز واکشی شدهاند، اما در واقع نباید اجرا شوند، باید از پایپلاین تخلیه شوند، و کنترل باید به مکان دیگری بپرد، در این مورد، آدرس exception handler بهجای یک مقصد شاخه.
دستور استثناساز: IF ID EX MEM WB
دستورات بعدی: IF ID [پس از تشخیص استثنا تخلیه میشوند]
Exception handler: IF [بهجای آن واکشی میشود]حفظ اطلاعات کافی برای بازیابی
پیش از انتقال کنترل به exception handler، پردازنده باید ثبت کند کدام دستور مسئله را ایجاد کرده، معمولاً با ذخیره آدرس آن در یک رجیستر اختصاصی، تا handler، یا سیستمعاملی که به آن متکی است، بتواند تصمیم بگیرد بعداً چه کاری انجام دهد: خاتمه دادن به برنامه، تلاش مجدد برای دستور پس از رفع مسئله زیربنایی، یا انجام برخی اقدامات اصلاحی دیگر.
چرا مدیریت درست استثنا اهمیت دارد
توانایی یک سیستمعامل برای گرفتن خطاهای برنامهنویسی، اجرای حفاظت حافظه بین برنامههای مختلف در حال اجرا، و پشتیبانی از ویژگیهایی مانند حافظه مجازی، همگی مستقیماً به تشخیص درست شرایط استثنایی توسط پردازنده و انتقال قابلاعتماد کنترل به نرمافزار مدیریتکننده بستگی دارند، بهجای تولید بیسروصدای نتایج نادرست یا کرش کردن بدون مسیر بازیابی کنترلشده.