سؤال

لقد رأيت العديد من السؤال هنا عن استثناءات, و بعض منهم تلمح يقطع الاستثناءات, ولكن لا تجعل اتصال واضحة.

  • ما هو المقاطعة ؟

  • ما هو استثناء ؟ (يرجى توضيح ما استثناءات لكل لغة تعرف ، كما أن هناك بعض الاختلافات)

  • عندما استثناء مقاطعة والعكس بالعكس ؟

هل كانت مفيدة؟

المحلول

وهو interupt هو وحدة المعالجة المركزية الإشارات التي تولدها الأجهزة أو محددة تعليمات وحدة المعالجة المركزية.هذه تسبب interupt معالجات ليتم تنفيذها.أشياء مثل I/O إشارات من I/O الأجهزة توليد interupts.

استثناء يمكن أن تكون من حيث الفكر البرنامج-نسخة من interupt أن يؤثر على عملية لها.

لست متأكدا على التفاصيل الدقيقة ، ولكن استثناء يمكن أن التي سيتم تنفيذها من قبل interupt.

نصائح أخرى

المعالج الخاص بك هو الذهاب إلى عدد من دبابيس المقاطعة الخارجية.عادة هذه الدبابيس ترتبط الأجهزة تستخدم للإشارة عند بعض الخارجي الحدث.على سبيل المثال, إذا كنت تستخدم منفذ تسلسلي UART سوف يرفع رفع دبوس متصل إلى أحد يقطع دبابيس على المعالج أن يبين أنه بايت وقد وردت.

الأجهزة الطرفية الأخرى مثل أجهزة تحكم usb ، إلخ.سيتم أيضا إنشاء المقاطعات على أساس بعض الخارجي الحدث.

عندما المعالج يتلقى إشارة على واحدة من المقاطعة الخارجية دبابيس وسوف القفز فورا إلى بعض رشح الموقع في الذاكرة والبدء في التنفيذ.رمز تنفيذها عادة ما يسمى ISR ، أو روتين خدمة المقاطعة.إلا إذا كنت تنفيذ برامج التشغيل أو القيام البرمجيات المدمجة من نوع انه من غير المحتمل أنك سوف تأتي عبر أي وقت مضى ISRs.

للأسف الإجابة على سؤال حول الاستثناءات هي أقل وضوحا قليلا - كان هناك 3 المعاني المختلفة المدرجة في الأجوبة على هذه الصفحة.

رون وحشية الجواب يشير إلى برنامج بناء.هذا هو محض مستوى تطبيق استثناء ، حيث قطعة من التعليمات البرمجية غير قادرة على تبين الخطأ التي يمكن الكشف عنها بواسطة بعض قطعة أخرى من التعليمات البرمجية.لا يوجد الأجهزة مشاركة هنا على الإطلاق.

ثم هناك استثناء كما يراها مهمة.هذا هو نظام التشغيل على مستوى بناء المستخدمة لقتل مهمة عندما يفعل شيئا غير قانوني مثل القسمة على 0 ، بصورة غير قانونية الوصول إلى الذاكرة وما إلى ذلك.

و ثالثا ، هناك الأجهزة استثناء.من حيث السلوك هو مطابق المقاطعة في أن المعالج سوف تقفز فورا إلى بعض رشح موقع الذاكرة والبدء في التنفيذ.حيث استثناء يختلف من مقاطعة هذا استثناء بسبب بعض نشاط غير قانوني أن المعالج لم يتم الكشف عن.على سبيل المثال MMU على المعالج سيتم الكشف غير المشروع يصل الذاكرة وتسبب استثناء.هذه الأجهزة الاستثناءات هي الأولي الزناد عن نظام التشغيل إجراء انها مهام تنظيف (كما هو موضح في الفقرة أعلاه).

يقطع يتم إنشاؤها من قبل الأجهزة الخارجية إلى وحدة المعالجة المركزية (توقيت علامة القرص عملية إنجاز حزمة شبكة الاتصال الوصول ، إلخ.) و هي غير متزامن مع تنفيذ البرنامج.الاستثناءات هي متزامن مع تنفيذ البرنامج (مثلا ، القسمة على صفر ، الوصول إلى عنوان غير صالح).

إلا إذا كان البرنامج هو تنفيذ بدون نظام التشغيل (أو كنت تقوم بتطوير نظام التشغيل) ، فإنه لن ترى الخام استثناء/المقاطعة.يتم القبض عليهم من قبل نظام التشغيل التعامل معها من قبل ذلك (المقاطعات) أو تحويلها إلى شكل آخر قبل أن تنعكس مرة أخرى إلى برنامج المستخدم (على سبيل المثالإشارات على UNIX, معالجة الاستثناء (SEH) على نظام التشغيل Windows) حيث كان لديه فرصة التعامل مع الأمر.

يقطع تشير إلى أن شيئا ما خارج النواة يتطلب الأمر الاهتمام.فإنه يقطع التدفق الطبيعي من البرنامج ينفذ خدمة روتين المقاطعة (ISR) و عموما يعود إلى ما كان عليه قبل حدث المقاطعة.

هناك الكثير من الاختلاف حول هذا الموضوع الأساسي:المقاطعات قد يكون إنشاؤها بواسطة برامج أخرى مهمة قد تحصل على وحدة المعالجة المركزية بعد ISR ، الخ..النقطة الرئيسية هي أن يقطع يمكن أن تحدث في أي وقت لسبب رمز/وحدة المعالجة المركزية لديها لا تتحكم.

استثناء هو اصعب قليلا لتحديد لأنه قد يحتمل ثلاثة مستويات من المعنى:

الأجهزة استثناءات

بعض المعالجات (PowerPC على سبيل المثال) تحديد استثناءات تشير إلى أن نوعا من غرابة الشرط قد حدث:نظام إعادة تعيين عنوان غير صحيح, بعض الظاهرية ترجمة عنوان ذاكرة التخزين المؤقت تفوت ، الخ...

هذه الاستثناءات تستخدم أيضا لتنفيذ نقاط و نظام المكالمات.في هذه الحالة أنها تعمل تقريبا مثل المقاطعات.

نظام التشغيل استثناءات

بعض الأجهزة الاستثناءات سيتم التعامل معها من قبل نظام التشغيل.على سبيل المثال, البرنامج بالوصول إلى ذاكرة غير صالحة.وهذا سوف يسبب الأجهزة استثناء.نظام التشغيل لديه معالج هذا الاستثناء ، الاحتمالات هي أن نظام التشغيل سوف ترسل إشارة إلى التطبيق الخاص بك (SIGSEGV على سبيل المثال) تدل على أن هناك مشكلة.

إذا كان البرنامج يحتوي على إشارة معالج تثبيت معالج إشارة سيتم تشغيل ونأمل أن التعامل مع الوضع.إذا لم يكن لديك إشارة معالج البرنامج يمكن إنهاء أو تعليق.

وأود أن تنظر من نافذة منظم استثناء معالجات (SEH) إلى أن هذا النوع من الاستثناءات.

برنامج استثناءات

بعض اللغات مثل Java, C++ و C# يكون مفهوم البرمجيات الاستثناءات حيث اللغة ينص على التعامل مع غير متوقعة أو ظروف غير عادية المتعلقة بتشغيل البرنامج.في هذه الحالة يتم رفع استثناء في بعض نقطة في المدونة بعض التعليمات البرمجية العالي على تنفيذ البرنامج كومة من شأنه أن "الصيد" استثناء وتنفيذ.هذا هو ما حاول/catch كتل القيام به.

أنا ذاهب لوضع ما يقطع لأن هناك الحرجة نوع من المقاطعة لا أحد قد تعامل مع بعد:جهاز ضبط الوقت.

ولكن أولا اسمحوا لي أن يعود.عندما تحصل على المقاطعة ، معالج المقاطعة (الذي يعيش في kernelspace) أشواط ، والتي عادة تعطيل المقاطعات ، يرى إلى أي انتظار العمل (التعامل مع الحزمة التي وصلت للتو على شبكة معالجة المفاتيح, إلخ.) ثم (نتذكر أننا ما زلنا في النواة عند هذه النقطة) الأرقام ما هي العملية التي من المفترض أن تعمل التالي (يمكن أن يكون نفس واحدة, يمكن أن تكون مختلفة ، ويعتمد على جدولة) ثم قم بتشغيل عليه.

فقط عملية واحدة يعمل على المعالج في أي وقت.و عند استخدام تعدد المهام OS, طريقة التبديل بينهما يسمى تبديل السياق - في الأساس سجلات المعالج الحصول على ملقاة على الذاكرة ، تدفق يمر على العملية الجديدة ، وعندما تتم العملية كنت سياق التحول إلى شيء آخر.

لذا ، دعونا نقول أنا أكتب بسيطة ج البرنامج الذي يهم جميع أرقام أو سلسلة فيبوناتشي ، أو أي شيء آخر دون توقف.أو حتى أفضل:لا يفعل شيئا ولكن يدور داخل كل حين(1) حلقة.كيف العمليات الأخرى على نظام الحصول على فرصة لتشغيل ؟ ما إذا كان هناك شيء يحدث أن تتسبب في المقاطعة ؟

الجواب هو أن لديك جهاز توقيت باستمرار انقطاع.و هو ما يبقي عملية الغزل من إسقاط النظام بأكمله.على الرغم من أنني سوف نلاحظ أن يقطع معالجات تعطيل المقاطعات ، لذلك إذا كنت تفعل شيئا أن الكتل إلى أجل غير مسمى يمكنك إنزال النظام بأكمله.

استثناء

الاستثناء هو عندما يقوم المعالج بتنفيذ التعليمات البرمجية التي ليست على المسار الطبيعي.هذا هو 'استثناء' إلى التشغيل العادي ، الذي هو أساسا الحركة الخطية من خلال رمز هياكل المراقبة.لغات مختلفة قد دعم لأنواع مختلفة من الاستثناءات التي تستخدم عادة لمعالجة الأخطاء أثناء تشغيل البرنامج.

يقطع

المقاطعة هو استثناء على مستوى الأجهزة (عموما).المقاطعة هي إشارة جسدية في المعالج الذي يحكي وحدة المعالجة المركزية لتخزين حالته الراهنة والقفز إلى المقاطعة (أو استثناء) رمز معالج.مرة واحدة معالج عمله الأصلي استعادة حالة ومعالجة يمكن أن يستمر.

المقاطعة هي دائما استثناء ، حتى عندما يكون المقصود.المقاطعات قد تشير إلى:

  • أخطاء مثل ذاكرة الوصول إلى انتهاك
  • أن نظام التشغيل يحتاج إلى إجراء عملية لدعم برنامج تشغيل ، مثل برنامج المقاطعة أو ترحيل الذاكرة الطلب
  • جهاز يتطلب الاهتمام ، مثل تلقي حزمة شبكة الاتصال أو فارغة إرسال المخزن المؤقت

هذه دائما قوة المعالج إلى وقفة الحالية النشاط للتعامل مع أثار استثناء فقط استئناف مرة معالج المقاطعة كاملة.

مطبات

حيث المقاطعات ، المزالق الشائعة هي شروط السباق.فعلى سبيل المثال قد يكون لديك المقاطعة التي دوري الزيادات العالمية في الوقت الحقيقي على مدار الساعة.الساعة قد تكون 64 بت على 32 بت آلة.

إذا كان البرنامج هو قراءة على مدار الساعة, ويحصل الأول 32 بت كلمة ، ثم يقطع يحدث مرة واحدة معالج المقاطعة مخارج عملية يحصل الثانية 32 بت كلمة ، وسوف تكون البيانات غير متماسكة - اثنين من الكلمات قد تكون متزامنة.إذا كنت تحاول استخدام مزامنة أو إشارة إلى قفل المتغير في هذه العملية ، ثم يقطع سوف يتعطل في انتظار قفل ووقف النظام (الجمود) ، إلا إذا كان كل من المعالج و العمليات التي تستخدم بيانات مكتوبة بعناية فائقة.فإنه من السهل أن تحصل في ورطة عند كتابة المقاطعات.

إعادة الوافد وظائف هي أيضا مشكلة أخرى.إذا كنت تنفيذ funcA في كود البرنامج ، تأخذ المقاطعة التي ينفذ funcA كنت قد ينتهي مع عواقب غير مقصودة بسبب المتغيرات المشتركة (ثابت أو كومة المتغيرات ، الطبقات ، إلخ).عادة ما تحتاج إلى تنفيذ القليل من التعليمات البرمجية في معالج المقاطعة ، وكثيرا ما يكون ذلك تعيين إشارة لذلك عملية يمكن القيام بالعمل الحقيقي في وقت لاحق دون الحاجة إلى القلق حول الصراعات.

في بعض طرق هذا هو مماثل النامية عن المعالجات, و هو واحد من الأسباب لماذا برمجة النواة لا يزال يعتبر السحر الأسود من قبل العديد من.

-آدم

يقطع من المتوقع أن تحدث بانتظام (على الرغم من أن في بعض الأحيان أنها ليست العادية)..أنها يقطع وحدة المعالجة المركزية بسبب شيء مهم حدث وأنه يحتاج إلى العناية فورا.

الاستثناءات هي من المفترض أن تكون استثناءات إلى القاعدة ؛ هذه هي القيت من قبل البرنامج لأن حدث شيء غير متوقع و هذا هو الخاص بك فرصة لمحاولة أن تفعل شيئا حيال ذلك ، أو على الأقل تحطم الطائرة بأمان.

عندما كنت تتحدث عن المقاطعات والاستثناءات أنت عموما الحديث على مقربة من مستوى الأجهزة رمز ويقطع والاستثناءات غالبا ما تنفذ في جزء من قبل الأجهزة المشاركة في البرنامج.

المقاطعة هو الحدث في الأجهزة (أو يدويا أطلقت في الجمعية) الذي يرتبط مع ناقلات من معالجات التي يمكن استخدامها للتعامل مع المقاطعة الحدث ، IO الانتهاء ، IO خطأ (قرص الذاكرة الفشل) ، IO الحدث (تحرك الماوس على سبيل المثال).المقاطعات يمكن أن تؤدي إلى استثناءات في كثير من الأحيان عند بعض غير متوقع يقطع يحدث.

استثناء غير متوقع السلوك في معظم الأحيان عند استخدام هذه الأجهزة تأتي من مقاطعة ويتم التعامل معها بشكل منفصل في البرنامج باستخدام معالج المقاطعة.لغات البرمجة كما نراها دائما تقريبا تمويه هذا التحكم هيكل من نوع ما.

في عام المقاطعة هو الأجهزة تنفيذها فخ من نوع ما.تسجيل معالج محدد يقطع (شعبة 0 البيانات المتاحة على الطرفية, انتهت الموقت) و عندما يحدث هذا الحدث ، تجهيز جميع المنظومة توقف بسرعة عملية المقاطعة ، استمرت الأمور على.وعادة ما تكون هذه implented في تشغيل الجهاز أو النواة.

استثناء هو برنامج ينفذ طريقة التعامل مع الأخطاء في التعليمات البرمجية.إعداد معالج محددة (أو العامة) الاستثناءات.عند حدوث استثناء ، لغة وقت التشغيل سوف تبدأ الفك المكدس حتى تصل إلى معالج محددة معالج.عند هذه النقطة يمكنك التعامل مع استثناء والاستمرار ، أو إنهاء البرنامج.

الحفاظ على الأشياء البسيطة...

عندما يتم الانتهاء من معالجة المقاطعة ، (عادة) العودة إلى ما كنت تفعله قبل أن تنقطع.

التعامل مع استثناء ينطوي على رمي طبقات متعاقبة من ما يتم العمل عليه حاليا حتى فقاعة تصل إلى نقطة حيث الاستثناء يمكن التعامل معها (القبض).

أثناء التعامل مع المقاطعة ، قد تقرر رمي استثناء, ولكن هذا لا يعني أن عليك أن تنظر في المقاطعة نفسها على أنها استثناء.استثناءات لا "المقاطعة" (لأن ذلك يعني إمكانية العودة إلى ما كنت تفعل قبل توقف);بل "إحباط" (بعض فرعية) النشاط الحالي الخاص بك.

و كما ذكر عدة مرات بالفعل ، يقطع عادة سببها خارج الكيانات مثل الأجهزة أو المستخدمين (مثل الماوس أو ضغط المفاتيح مثل CTRL-C) في حين الاستثناءات الناتجة (ألقيت) بشكل متزامن من خلال برامج الكشف عن "مشكلة" أو "حالة استثنائية".

Iterrupts هي في الأساس الأجهزة مدفوعة ، مثل الطابعة indiciating هو "من ورق" أو بطاقة الشبكة مشيرا إلى أنها فقدت الاتصال.

استثناء هو ببساطة حالة خطأ في البرنامج الخاص بك ، الكشف عنها بواسطة try / catch.مثل:

Try
   {
   ... various code steps that "throw exceptions" on error ...
   }
catch (exception e)
   {
   print 'Crap! Something bad happened.' + e.toString()
   }

انها طريقة سهلة للقبض على "أي خطأ" يحدث في كتلة من التعليمات البرمجية بحيث يمكنك التعامل معها بطريقة مماثلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top