лекции СПО
.pdfпрерыв ние/исключение |
|
вызыв ется |
диспетчер |
прерыв ний, |
который |
||||||||
з помин ет |
информ цию |
о |
источнике |
прерыв ния |
и |
н лизирует |
е о |
||||||
приоритет. Если приоритет з прос |
ниже или р вен IRQL прерв нно о код , то |
||||||||||||
о служив ние это о з прос |
откл дыв ется и д нные о з просе помещ ются в |
||||||||||||
соответствующую очередь з просов, после че о происходит |
ыстрый возвр т к |
||||||||||||
прерв нному |
о р |
отчику |
прерыв ний. |
По |
з вершении |
о р |
отки |
||||||
высокоприоритетно о |
прерыв ния |
упр вление |
возвр щ ется |
диспетчеру |
|||||||||
прерыв ний, |
который |
просм трив ет |
очереди отложенных прерыв ний и |
||||||||||
вы ир ет из них н и олее приоритетное. При этом уровень IRQL сниж ется до |
|||||||||||||
уровня вы р нно о прерыв ния. |
|
|
|
|
|
|
|
|
|
||||
Если же з прос имеет |
олее высокий приоритет, чем IRQL текуще о |
||||||||||||
код , то текущий о р |
отчик прерыв ний вытесняется и ст вится в очередь, |
||||||||||||
соответствующую |
е о |
зн чению |
IRQL, |
упр вление |
перед ется новому |
о р |
отчику в |
соответствии с IRQL з прос . После это о уровень IRQL |
||||||
процессор дел ется р вным уровню IRQL принято о н |
выполнение з прос . |
|||||||
|
Т ким |
о р зом, |
з прос н |
прерыв ние |
приним ется |
диспетчером |
||
прерыв ний все д нез висимо от текуще о уровня IRQL выполняемо о код , |
||||||||
но |
диспетчер |
прерыв ний не перед ет е о н |
о р |
отку соответствующей |
||||
процедуре о р отки |
прерыв ний, |
помещ ет |
в |
про р ммную очередь |
||||
з просов, если в д нный момент выполняется |
олее приоритетн я процедур |
|||||||
о р |
отки прерыв ний. |
Опер ционн я систем |
имеет полный контроль н д |
|||||
ситу цией, не |
позволяя контроллер м устройств ввод -вывод |
приним ть |
||||||
решения о ходе вычислительно о процесс . |
|
|
|
|
ВWindows NT низший уровень IRQL соответствует о ычным поток м,
нзн ч емым н выполнение диспетчером потоков (рис. 4.13). Это является некоторым допущением, т к к к код потоков н чин ет выполняться
процессором не в результ те з прос н прерыв ние, но это допущение хорошо
р от ет, поскольку позволяет лю ому «н стоящему» з просу прерыв ть код о ычно о поток .
Рис. 4.13. Диспетчериз ция прерыв ний в Windows NT
Высший уровень в иер рхии IRQL отводится т ким в жным со ытиям,
к к исключение по оши ке шины и дру им тяжелым |
пп р тным с оям, д лее |
р спол ются з прос н прерыв ние по с ою |
пит ния и з прос н |
межпроцессорное прерыв ние. |
|
Прерыв ния от внешних устройств з ним ют промежуточные уровни
IRQL. Конкретное соотношение между приоритет ми внешних устройств
определяется приоритет ми, з д в емыми |
пп р тной пл тформой, н пример |
||||||||
уровнем IRQ шины PCI, н зн ченным устройству. |
|
|
|
||||||
Осо ую роль в р |
оте вычислительной системы |
и р ет |
системный |
||||||
т ймер: |
н основ нии |
|
е о |
прерыв ний |
о новляются |
системные |
ч сы, |
||
определяющие очередной |
момент |
вызов |
пл нировщик |
потоков, |
момент |
||||
выд чи |
упр вляюще о |
воздействия |
потоком ре льно о |
времени |
и |
мно ое |
|||
дру ое. Ввиду в жности немедленной о р |
отки прерыв ний от т ймер , ему в |
||||||||
Windows NT д н весьм |
высокий уровень приоритет — |
олее высокий, чем |
|||||||
уровень лю о о устройств |
ввод -вывод . |
|
|
|
|
||||
В |
системе очередей |
диспетчер |
прерыв ний несколько |
очередей |
|||||
отведено для о служив ния отложенных про р ммных прерыв ний. |
|
|
Про р ммные прерыв ния, о служив ющие системные вызовы от
приложений, выполняются с низшим уровнем приоритет , что соответствует концепции продолжения одно о и то о же процесс , но только в системной ф зе, при выполнении системно о вызов . А вот для про р ммных прерыв ний,
исходящих от модулей ядр ОС, отводится олее высокий уровень з просов,
имеющий двойное н зв ние «диспетчерский/DPO.
Этот уровень приоритет н зыв ется диспетчерским, потому что именно
в эту очередь помещ ются про р ммные з просы, вызыв ющие диспетчер
потоков. Ч сто при о р отке высокоприоритетных прерыв ний возник ет ситу ция, тре ующ я перепл ниров ния потоков. Н пример, при о р отке очередно о прерыв ния от т ймер нужно проверить, не исчерп н ли кв нт,
выделенный текущему потоку. Дру им примером может служить о р отк прерыв ния от контроллер диск после з вершения дисковой опер ции,
которую мо ут жд ть несколько потоков. Во всех т ких ситу циях в Windows NT пл нировщик/диспетчер вызыв ется высокоуровневыми процедур ми ядр
не прямо посредством |
вызов |
процедуры, |
косвенно, |
с помощью |
|
про р ммно о |
прерыв ния. Это д ет возможность отделить |
короткую, но |
|||
тре ующую |
ыстрой |
ре кции |
системы |
процедуру |
о служив ния |
высокоприоритетно о прерыв ния (н пример, н р щив ние системных ч сов)
от менее критичной опер ции перепл ниров ния пользов тельских потоков.
Прямой вызов пл нировщик /диспетчер потоков т кой возможности ы не
д л, и критичные з просы прерыв ния от контроллеров устройств ввод -вывод
вынуждены ыли ы жд ть, |
пок отр от ет пл нировщик. |
При этом |
пл нировщик, возможно, вы р л |
ы для выполнения дру ой поток, если ы |
|
р от л после процедур о служив ния пп р тных прерыв ний, |
т к к к он |
получил ы свежие сведения о з вершении некоторых опер ций ввод -вывод .
Помещение вызов пл нировщик потоков в очередь позволяет выполнять е о только в тех ситу циях, ко д в системе отсутствуют ожид ющие пп р тные з просы прерыв ний.
Н личие отдельно о уровня для пл нировщик /диспетчер потоков не озн ч ет то о, что он все д вызыв ется с помощью про р ммных прерыв ний.
В тех случ ях, ко д он вызыв ется из код , имеюще о низкий уровень з прос
н прерыв ние (если он выполняется, зн чит, высокоприоритетные з просы н
прерыв ние отсутствуют), пл нировщик может |
ыть вызв н ыстрее путем |
непосредственно о внутрисе ментно о вызов |
процедуры. Н пример, |
системному вызову, переводящему поток по со ственному жел нию в
состояние ожид ния, нет смысл вызыв ть пл нировщик |
потоков по |
про р ммному прерыв нию. |
|
Второе н зв ние диспетчерско о уровня, DPC, являясь |
реви турой от |
Deffered Procedure Call (вызов отложенной процедуры), оворит о том, что н
этом уровне ожид ют своей очереди отложенные вызовы и дру их процедур ОС, не только пл нировщик /диспетчер . Процедуры ОС мо ут вызыв ть
дру дру |
и |
непосредственно, но при мно ослойном построении ядр |
|||
существуют |
олее и менее приоритетные процедуры, и вызов менее |
||||
приоритетных |
процедур из |
олее приоритетных с помощью мех низм |
|||
про р ммных |
прерыв ний позволяет, |
к к |
и в случ е с пл нировщиком, |
||
упорядочить во времени их выполнение, |
что оптимизирует р оту ОС в целом. |
||||
Примером |
процедур ОС, р |
от ющих |
н |
высоком приоритетном уровне, |
являются те ч сти др йверов устройств ввод -вывод , которые выполняют короткие, но критичные ко времени ре кции действия. В то же время существуют и дру ие ч сти др йверов, которые выполняют менее срочную, но
олее о ъемную р оту. В Windows NT т кие ч сти др йверов оформляют к к
процедуры, вызыв емые с помощью |
про р ммных |
прерыв ний уровня |
«диспетчерский/DPC» (ВРОпроцедуры), |
с мо про |
р ммное прерыв ние |
выполняет критичн я ч сть др йвер . Естественно, существуют и дру ие модули ОС, оформляемые подо ным о р зом.
Опис нн я про р ммн я ре лиз ция приоритетно о о служив ния прерыв ний приводит к однотипной р оте ОС Windows NT н р зличных
пп р тных пл тформ х, что упрощ ет ло ику р оты ОС и ее перенос н
новые |
пл тформы. |
Отриц тельным |
следствием |
т ко о центр лизов нно о |
||||||||||
подход |
является некоторое з медление о р |
отки прерыв ний, т к к к вместо |
||||||||||||
непосредственной перед чи упр вления др йверу устройств |
или о р |
отчику |
||||||||||||
исключений |
выполняется |
вызов |
некое о |
посредник |
— |
|
диспетчер |
|||||||
прерыв ний. |
В |
ОС семейств |
UNIX |
принят |
похожий, |
|
но |
менее |
||||||
центр лизов нный подход к ведению и |
о р |
отке |
очередей |
прерыв ний. |
||||||||||
Вместо едино о диспетчер |
прерыв ний е о функции выполняют процедуры, |
|||||||||||||
о служив ющие |
к ждый приоритетный кл сс |
прерыв ний. |
Тем |
не |
менее, |
|||||||||
о щий |
подход |
к |
упорядочив нию |
о р |
отки |
прерыв ний |
з |
счет их |
||||||
мно оуровневой приоритез ции и ведения системы очередей |
присутствует |
|||||||||||||
пр ктически во всех современных опер ционных систем х. |
|
|
|
|
6.5 Системные вызовы
Системный вызов позволяет приложению о р титься к опер ционной системе с прось ой выполнить то или иное действие, оформленное к к
процедур (или |
н ор процедур) кодово о се мент |
ОС. Для |
прикл дно о |
про р ммист |
опер ционн я систем вы лядит |
к к нек я |
и лиотек , |
предост вляющ я некоторый н ор полезных функций, с помощью которых
можно |
упростить |
прикл дную |
про р мму |
или выполнить |
действия, |
з прещенные в пользов тельском |
режиме, н пример о мен |
д нными с |
|||
устройством ввод -вывод . |
|
|
|
||
Ре лиз ция |
системных вызовов должн |
удовлетворять |
следующим |
||
тре ов ниям: |
|
|
|
|
|
|
о еспечив ть переключение в привиле иров нный режим; |
о л д ть высокой скоростью вызов процедур ОС;
о еспечив ть по возможности единоо р зное о р щение к
системным вызов м для всех пп р тных пл тформ, н которых
р |
от ет ОС; |
|
допуск ть ле кое р сширение н ор системных вызовов; |
о еспечив ть контроль со |
стороны ОС з |
корректным |
использов нием системных вызовов. |
|
|
Первое тре ов ние для ольшинств |
пп р тных пл тформ может ыть |
выполнено только с помощью мех низм про р ммных прерыв ний. Поэтому удем счит ть, что ост льные тре ов ния нужно о еспечить именно для т кой
ре лиз ции системных вызовов. К к это о ычно ыв ет, некоторые из этих тре ов ний вз имно противоречивы.
Для о еспечения высокой скорости ыло ы полезно использов ть
векторные свойств системы про р ммных прерыв ний, имеющиеся во мно их
процессор х, то есть з крепить з |
к ждым системным вызовом определенное |
||
зн чение вектор . Приложение при |
т ком спосо е вызов |
непосредственно |
|
ук зыв ет в р ументе з прос |
зн |
чение вектор , после |
че о упр вление |
немедленно перед ется тре уемой процедуре опер ционной системы (рис. 4.14,
). Одн ко этот децентр лизов нный спосо перед чи упр вления привяз н к
осо енностям пп р тной пл тформы, т кже не позволяет опер ционной
системе ле ко модифициров ть н ор системных вызовов и контролиров ть их
использов ние. Н пример, в процессоре Pentium количество системных вызовов определяется количеством векторов прерыв ний, выделенных для этой
цели из о ще о пул в |
256 |
элементов (ч сть которых используется |
под |
|||||
пп р тные |
прерыв ния |
и о р отку |
исключений). |
До вление |
ново о |
|||
системно о вызов |
тре ует от системно о про р ммист |
тщ тельно о поиск |
||||||
сво одно о элемент |
в т |
лице прерыв ний, которо о к тому же н |
к ком-то |
|||||
эт пе р звития ОС может и не ок з ться. |
|
|
|
|
||||
В |
ольшинстве |
ОС |
системные вызовы |
о служив ются |
по |
|||
центр лизов нной схеме, |
основ нной н |
существов нии диспетчер системных |
||||||
вызовов (рис. 4.14, |
). При лю ом системном вызове приложение выполняет |
про р ммное прерыв ние с определенным и единственным номером вектор .
Н пример, ОС Linux использует для системных вызовов ком нду INT 80h, ОС
Windows NT (при р оте н пл тформе Pentium) — INT 2Eh. Перед выполнением про р ммно о прерыв ния приложение тем или иным спосо ом
перед ет опер ционной системе номер системно о вызов , который является
индексом в т лице дресов процедур ОС, ре лизующих системные вызовы
(т лиц sysent н рис. 4.14). Спосо перед чи з висит от ре лиз ции, н пример
номер можно поместить в определенный ре истр |
о ще о н зн чения |
||||||
процессор |
или перед ть через |
стек (в |
этом |
случ е |
после |
прерыв ния |
и |
переход |
в привиле иров нный |
режим |
их |
нужно |
удет |
скопиров ть |
в |
системный стек из пользов тельско о, это действие в некоторых процессор х
втом тизиров но). Т кже некоторым спосо ом перед ются р ументы
системно о вызов , они мо ут к к помещ ться в ре истры о ще о н зн чения,
т к и перед в ться через стек или м ссив, н ходящийся в опер тивной п мяти.
М ссив удо ен при ольшом о ъеме д нных, перед в емых |
в к честве |
р ументов, при этом в ре истре о ще о н зн чения ук зыв ется |
дрес это о |
м ссив . |
|
Диспетчер системных вызовов о ычно предст вляет со ой простую |
|
про р мму, котор я сохр няет содержимое ре истров процессор |
в системном |
стеке (поскольку в результ те про р ммно о прерыв ния процессор переходит в привиле иров нный режим), проверяет, поп д ет ли з прошенный номер вызов в поддержив вмый ОС ди п зон (то есть не выходит ли номер з
р ницы т лицы) и перед ет упр вление процедуре ОС, дрес которой з д н в т лице дресов системных вызовов.
Рис. 4.14. Децентр лизов нн я и центр лизов нн я схемы о р отки системных вызовов
Процедур ре лиз ции системно о вызов извлек ет из системно о стек р ументы и выполняет з д нное действие. Это действие может ыть весьм
простым, н пример чтение зн чения системных ч сов, т к что системный вызов оформляется в виде одной функции. Более сложные системные вызовы,, т кие
к к чтение из ф йл или выделение процессу дополнительно о |
се мент |
||
п мяти, тре уют о р щения .основной |
функции |
системно о |
вызов к |
нескольким внутренним процедур м ядр |
ОС, прин |
длеж щим к р зличным |
подсистем м, т ким к к подсистем ввод -вывод или упр вления п мятью.
После з вершения р оты системно о вызов упр вление возвр щ ется
диспетчеру, при этом он получ ет т кже код з вершения это о вызов .
Диспетчер восст н влив ет ре истры процессор , помещ ет в определенный ре истр код возвр т и выполняет инструкцию возвр т из прерыв ния, котор я восст н влив ет непривиле иров нный режим р оты процессор .
Для приложения системный вызов внешне ничем не отлич ется от вызов о ычной и лиотечной функции язык С, связ нной (дин мически или
ст тически) с о ъектным |
кодом приложения и выполняющейся в |
пользов тельском режиме. |
т к я ситу ция действительно имеет место — для |
всех системных вызовов в и лиотек х, предост вляемых компилятором С,
имеются т к н зыв емые «з |
лушки» (в |
н лоязычном в ри нте используется |
||||||||||||||||
термин «stub» — ост ток, о рызок). К жд я |
з |
лушк |
оформлен |
к к |
С- |
|||||||||||||
функция, при этом он |
содержит несколько |
ссем лерных строк, нужных для |
||||||||||||||||
выполнения |
|
инструкции |
про р ммно о |
прерыв ния. |
Т ким о р зом, |
|||||||||||||
пользов тельск я про р мм |
вызыв ет з |
лушку, |
т , в свою очередь, вызыв ет |
|||||||||||||||
процедуру ОС. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Для ускорения выполнения некоторых дост точно простых системных |
||||||||||||||||||
вызовов, которым к тому же не тре уется р |
от |
в привиле иров нном режиме, |
||||||||||||||||
тре уем я р |
от |
полностью выполняется |
и лиотечной функцией, которую |
|||||||||||||||
неспр ведливо |
н зыв ть |
в |
д нном |
случ е |
з |
лушкой. Более точно, т к я |
||||||||||||
функция не является системным вызовом, |
предст вляет со ой «чистую» |
|||||||||||||||||
и лиотечную функцию, |
выполняющую всю свою р |
оту в пользов тельском |
||||||||||||||||
режиме |
в вирту льном |
дресном |
простр нстве |
процесс , но |
прикл дной |
|||||||||||||
про р ммист может о |
этом и не зн ть — для не о системные вызовы и |
|||||||||||||||||
и лиотечные |
функции |
вы лядят |
единоо р зно. |
Прикл дной |
про р ммист |
|||||||||||||
имеет дело с н |
ором функций прикл дно о про р ммно о интерфейс |
— API |
||||||||||||||||
(н пример, Win32 или POSIX), — состояще о и из |
и лиотечных функций, |
|||||||||||||||||
ч сть из которых пользуется для з вершения р |
оты системными вызов ми, |
|||||||||||||||||
ч сть — нет. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Опис нный т |
личный спосо |
ор |
низ ции системных вызовов принят |
|||||||||||||||
пр ктически |
|
во |
всех |
опер ционных |
систем х., |
Он |
позволяет |
ле ко |
||||||||||
модифициров ть сост в системных вызовов, просто до вив в т |
лицу новый |
|||||||||||||||||
дрес и р сширив ди п зон допустимых номеров вызовов. |
|
|
|
|
||||||||||||||
Опер ционн я |
систем |
может |
выполнять |
системные |
вызовы |
в |
||||||||||||
синхронном |
или |
синхронном |
режим х. |
Синхронный |
системный |
вызов |
||||||||||||
озн ч ет, |
что |
процесс, |
сдел вший |
т кой |
вызов, |
приост н влив ется |
(переводится пл нировщиком ОС в состояние ожид ния) до тех пор, пок
системный вызов не выполнит всю тре ующуюся от не о р |
оту (рис. 4.15, ). |
|
После это о пл нировщик переводит процесс в состояние |
отовности и при |
|
очередном выполнении процесс |
р нтиров нно может |
воспользов ться |
результ т ми з вершивше ося |
к этому времени системно о вызов . |
Синхронные вызовы н зыв ются т кже локирующими, т к к к вызв вший системное действие процесс локируется до е о з вершения.
Асинхронный системный вызов не приводит к переводу процесс в
режим ожид ния после выполнения некоторых н ч льных системных действий,
н пример з пуск опер ции вывод -вывод , упр вление возвр щ ется
прикл дному процессу (рис. 4.15, 6).
Большинство системных вызовов в опер ционных систем х являются
синхронными, т к к к этот режим |
из |
вляет |
приложение от |
р оты |
по |
||
выяснению момент |
появления результ т |
вызов . Вместе с тем в новых |
|||||
версиях опер ционных систем количество |
синхронных системных вызовов |
||||||
постепенно увеличив ется, что д ет |
ольше сво оды р зр отчик м сложных |
||||||
приложений. Осо енно |
нужны |
синхронные системные |
вызовы |
в |
|||
опер ционных систем х н |
основе микроядерно о подход , т к к к при этом в |
||||||
пользов тельском режиме |
р от ет |
ч сть ОС, которым нео ходимо иметь |
|||||
полную сво оду в ор |
низ ции своей р оты, |
т кую сво оду д ет только |
синхронный режим о служив ния вызовов микроядром.