Кіріспе
Ішін алу басымдық деңгейі (IPL) – жүйелік үзіліс күйінің бір бөлігі болып табылады және қазіргі уақытта қабылданатын үзіліс сұраныстарын көрсетеді. IPL аппараттық жағынан бағдарламаланатын үзіліс басқарушыдағы тіркелгіштер арқылы, ал бағдарламалық жағынан биттік маска немесе бүтін сандық мән және жіптердің бастапқы коды арқылы көрсетілуі мүмкін.
Шолу
Бүтін санға негізделген IPL тек бір биттен тұруы мүмкін, онда тек екі мән болады: 0 (барлық үзілістер қосылған) немесе 1 (барлық үзілістер өшірілген), мысалы, MOS Technology 6502 процессорларында. Дегенмен, кейбір архитектуралар кеңірек мән диапазонын ұсынады, онда әрбір мән жоғары деңгейдегі үзіліс сұрауларын қабылдаса, ал сол деңгейдегі немесе одан төменгі деңгейдегілерді тоқтатады. Үзіліс сұрауларына әртүрлі басымдықтар тағайындау жүйенің өнімділігі мен үзіліске жауап беру уақытын теңестіруге көмектеседі. Кейбір үзілістерге басқаларына қарағанда жылдам жауап беру қажет, бірақ оларды өңдеуге көп уақыт кетпесе, онда осы үзіліске жоғары басымдық беру орынды. Үзіліс деңгейін басқару ядролық дерек құрылымдарына қол жеткізуді синхрондау үшін де пайдаланылды. Мысалы, 3-деңгейлі жоспарлаушы үзіліс кезінде кез келген жоспарлаушы дерек құрылымдарына қол жеткізбес бұрын IPL-ді уақытша 7-ге дейін көтереді, содан кейін процесс контексттерін ауыстыру алдында 3-ке дейін төмендетеді. Алайда, үзіліс басқарушыға кірген деңгейден төмен IPL-ді түсіруге рұқсат етілмейді, себебі бұл синхрондау жүйесінің тұтастығын бұзуы мүмкін. Әрине, көппроцессорлық жүйелер қосымша қиындықтар тудырады, бірақ олар осы жерде қарастырылмайды. Аппараттық қамтамасының мүмкіндіктеріне қарамастан, UNIX жүйелері әдетте тек екі деңгейді қолданады: ең төменгі (барлық үзілістер өшірілген) және ең жоғары (барлық үзілістер қосылған).
OpenVMS IPL-тер
Бұрын қолданылған ең күрделі IPL басқару жүйелерінің бірі ретінде VAX компьютері және оған байланысты VMS операциялық жүйесі 0-ден 31-ге дейінгі 32 басымдық деңгейін қолдайды. 16-дан жоғары басымдықтар сыртқы аппараттық сұраныстарға арналған, ал 16-дан төмен мәндер бағдарламалық үзілістерге арналған (операциялық жүйе өз қызметін жоспарлау үшін ішкі пайдалану). Барлық мәндер қолданылмайды, бірақ мұнда маңыздыларының кейбіреулері келтірілген: 31-деңгей – «қуат жоғалу» үзілісі үшін. 24-деңгей – сағат үзілісі. Бұл I/O үзілістерінен жоғары басымдыққа ие екенін ескеріңіз. 20-23 деңгейлері I/O құрылғылары үшін қолданылады. 8-11 деңгейлері fork үзілістері үшін қолданылады. Егер драйвер құрылғыдан үзіліс алса (басымдығы 20-23), ол осындай жоғары басымдықпен мүмкіндігінше аз өңдеуді жүзеге асыруы керек; егер уақытты көп алатын операцияларды орындау қажет болса, оларды 8-11 диапазонындағы бағдарламалық үзіліс сұрату арқылы кейінге қалдыру керек; бұл үзіліс іске қосылған кезде, одан әрі өңдеу қайта басталады. Бұған ұқсас «жарты бөліктер» және олардың Linux ядросындағы мұрагерлері бар. 7-деңгей процестерді жоспарлаушы дерек құрылымдарына қол жеткізуді синхрондау үшін қолданылады. 4-деңгей I/O-ны кейіннен өңдеу тапсырмалары үшін, яғни QIO сұранысын аяқтау үшін, соның ішінде нәтижелерді қолданба процесіне қайтару үшін қолданылады. 3-деңгей процестерді қайта жоспарлау үзілісі үшін қолданылады. Жоғары үзіліс деңгейінде орындалатын кез келген кодқа ағымдағы процесс контексі бар деп болжауға болмайды (өйткені процесс қайта жоспарлануы мүмкін). Әсіресе, осы немесе одан жоғары деңгейде беттік қателерге жол берілмейді. 2-деңгей процесс бойынша дерек құрылымдарына қол жеткізуді синхрондау үшін қолданылады. Ядроға кез келген процесс контексіне кіру қажет болған кезде ол IPL 2 процесс контекстінде орындалатын арнайы ядролық AST жібереді. 0-деңгей – үзіліссіз кодты, оның ішінде қарапайым қолданба кодты орындаудың қалыпты деңгейі. Alpha аппараттық құралдары IPL-ді табиғи түрде қолдайды. OpenVMS 2001 жылы Itanium-ға көшірілгенде, IPL схемасы Itanium аппараттық құралдары ұсынған мүмкіндіктерді пайдалана отырып, модельдеу арқылы іске асырылды.
level 31 is for the "power fail" interrupt. level 24 is for the clock interrupt. Note this is a higher priority than I/O interrupts. levels 20 23 are used for I/O devices. levels 8 11 are used for fork interrupts. When a driver receives a device interrupt (priority 20 23), it is supposed to do as little processing as possible at such a high priority; instead, if any time consuming operations need to be done, these are to be deferred by requesting a software interrupt in the 8 11 range; when this interrupt is triggered, the further processing will resume. Similar to this are "bottom halves" and their successors in the Linux kernel. level 7 is used to synchronize access to the process scheduler data structures. level 4 is used for I/O post processing tasks—that is, final completion of a QIO request including returning results to the application process. level 3 is used for the process rescheduling interrupt. Any code executing at higher interrupt levels is not allowed to assume that there was a current process context (since a process reschedule might be in progress). In particular, page faults are not allowed at this or higher levels. level 2 is used to synchronize access to per process data structures. Any time the kernel needs access to a process context, it sends that process a special kernel AST which executes in the process context at IPL 2.
level 0 is the normal level for execution of non interrupt code, including ordinary application code. Alpha hardware contains native support for IPLs. When OpenVMS was ported to Itanium in 2001, the IPL scheme was simulated using features provided by the Itanium hardware.