Вопрос по поводу многозадачности

Discussion in 'WASM.NT.KERNEL' started by sysexit, Aug 27, 2010.

Thread Status:
Not open for further replies.
  1. sysexit

    sysexit New Member

    Blog Posts:
    0
    Joined:
    Aug 27, 2010
    Messages:
    176
    Допустим имеем однопроцесорную систему, диспетчер многозадачности выделяет каждому потоку свой квант времени, это все понятно, но появился вопрос, как на 1 процессоре прерывается исполнение потока и передается управление в диспетчер? Прошу прощения за возможно тупой вопрос, который не дает мне спать. Надеюсь ясно выразился.

    Может быть выполняется какое-то прерывание с высоким IRQL, и диспетчер его ловит и тормозит поток, и дальше планирует исполнение? Но где находится это прерывание, не в коде потока же.
     
  2. qwe8013

    qwe8013 New Member

    Blog Posts:
    0
    Joined:
    May 28, 2009
    Messages:
    198
    >>выполняется какое-то прерывание
    да - таймер.

    А вообще Д.Соломон и М.Руссинович "Внутреннее устройство windows".
     
  3. sysexit

    sysexit New Member

    Blog Posts:
    0
    Joined:
    Aug 27, 2010
    Messages:
    176
    Уже читаю, ту главу уже прочел. Там о мой вопрос не описан.

    Как выполняется этот таймер я все непойму. Ведь на процессоре непрерывно что-то исполняется, допустим исполняется бесконечный цикл из NOP, как процессор узнает что кончились кванты для этого кода и как процессор переключится на диспетчер?

    И еще, при переключении на новый поток, загружаются содержимое регистров, они хранятся в блоке KTHREAD в ядре?

    Посоветуйте какую книгу заказать, по разработке драйверов для Windows?
     
  4. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    sysexit
    Когда приходит железячное прерывание от любого устройства, либо поток програмно вызывает планировщик(сервисы ожидания и пр.) вначале в ядерном стеке сохраняется контекст задачи(трап-фрейм). После отработки ISR выполняется вызов HalEndSystemInterrupt(). Она посылает EOI в APIC и вызывает планировщик KiDispatchInterrupt() -> SwapContext(). Шедулер выберает новый поток и загружает некоторое окружение в процессор(трап-фрейм при этом не затрагивается, загружается PDBR, LDTR, настраивается GDT и пр.) и переключает текущий стек(прежде сохранив его) на стек иного потока, на дне которого также находится сохранённый контекст задачи. После этого выполняется возврат из HalEndSystemInterrupt(), а далее следует загрузка трап-фрейма в процессор посредством Kei386EoiHelper(). Это в общих чертах.
     
  5. sysexit

    sysexit New Member

    Blog Posts:
    0
    Joined:
    Aug 27, 2010
    Messages:
    176
    Может я не допонимаю самые низины, но ответа я так и не получил.

    Как именно прцессор узнает что кванты для потока кончились, и надо передать управление в ядро?

    Какая то инструкция в листинге сообщит ему?
    Или как этот таймер исполнится. Я понятно задаю вопрос?
     
  6. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    sysexit
    Железо посылает в процессор запросы на прерывание. Это например таймер перешёл в сигнальное состояние и пр. Тогда процессор вызывает обработчик из IDT, это ISR.
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    sysexit
    Все очень просто. Если в кратце то у каждого потока (любого) имеется свое значение кванта, в разных виндоусах оно разное. Когда приходит прерывание таймера, процедура его обработки вычитает из кванта потока постоянную величину (ну руссинович пишет что это величина = 3). Когда потока значение кванта закончилось (допустим у него вначале было значение 9, то 9 - 3 (щелк) - 3 (щелк) - 3 (посл щелк)), то квант завершается и процессору отдается другой (следующий поток) в соответствии с приоритетами.
    А инструкцию - можете глянуть дизасм обработчика прерывания таймера. Так их много :)
     
  8. sysexit

    sysexit New Member

    Blog Posts:
    0
    Joined:
    Aug 27, 2010
    Messages:
    176
    TermoSINteZ объяснил всех понятнее. А теперь вопрос про этот самый таймер. Я правильно понял, этот таймер диспетчера посылает прерывания очень часто, и каждый раз callback проверяет сколько квантов времени осталось у потока?

    А как эти аппаратные таймеры установить, что за таймер где он регулируется и все прочее?
     
  9. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    sysexit
    У диспетчера есть счётчики, а таймера никакого нет. Шедулер вызывается из всех ISR, читайте внимательнее. Включите профайлер, треды прерываться будут во много раз быстрее, но длительность кванта не изменится.
     
  10. sysexit

    sysexit New Member

    Blog Posts:
    0
    Joined:
    Aug 27, 2010
    Messages:
    176
    Все равно не пойму. Понятно то что, при нажатии кнопки просиходит прерывание, и текущий код на процессоре останавливается, и вызывается обработчик прерывания.

    Это все аппаратные прерывания, а как процессор во время исполнения кода треда, поймает прерывание которое ему скажет что нужно вычести и проверить кванты для треда?
     
  11. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    sysexit
    При возврате из всех прерываний(без разницы от таймера или клавиатуры оно) вызывается код завершающий прерывание HalEndSystemInterrupt(). Из него вызывается шедулер KiDispatchInterrupt(). Он определит что квант завершён в KiQuantumEnd().
     
  12. sysexit

    sysexit New Member

    Blog Posts:
    0
    Joined:
    Aug 27, 2010
    Messages:
    176
    Переход из этих (щелк-щелк) как происходит, я так и не понял.

    Clerk если не секрет вы названия всех переменных и функций наизусть знаете? я просто поражен, читаю ваши сообщения, столько знаний, как все это можно запомнить.
     
  13. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    sysexit
    Это базовые функции, у шедулера их не много.
    Как задача переключается на новую я описал в #4. Если вас интересует подробный механизм распределения процессорного времени, то смотрите в сурцах, это довольно сложная часть.
     
  14. sysexit

    sysexit New Member

    Blog Posts:
    0
    Joined:
    Aug 27, 2010
    Messages:
    176
    Как допустим при исполнении моего кода, он вызывает планировщик?
     
  15. Clerk

    Clerk Забанен

    Blog Posts:
    0
    Joined:
    Jan 4, 2008
    Messages:
    6,689
    Location:
    РБ, Могилёв
    sysexit
    Ну и NtYieldExecution/NtDelayExecution тоже.
     
  16. SII

    SII Воин против дзена

    Blog Posts:
    0
    Joined:
    Oct 31, 2007
    Messages:
    1,483
    Location:
    Подмосковье
    sysexit
    Аппаратные прерывания процессор ловит автоматически, без какого-либо участия исполняемой в данный момент программы. Единственное, что может делать программа, если у неё есть необходимые привилегии (фактически -- если она исполняется в нулевом кольце, хотя формально несколько сложнее), -- это разрешать или запрещать прерывания на некоторое время. Если прерывание пришло в момент, когда оно запрещено, оно просто стоит и ждёт, пока программа не разрешит прерывания.

    Когда происходит аппаратное прерывание, процессор автоматически сохраняет в стеке адрес команды, которая была бы выполнена следующей, если б прерывания не было, после чего переходит к обработчику данного прерывания: загружает его адрес в CS:EIP (если речь о 32-разрядном защищённом режиме; если о 64-разрядном -- то в RIP, если о реальном -- то в CS: IP, но суть от этого не меняется). Обработчик же уже выполняет необходимые действия, связанные с обработкой данного прерывания -- например, уменьшает значение счётчика оставшихся квантов времени текущего потока и при его обнулении (или выходе в минус, или ещё при каком-либо условии -- это уж его дело) вызывает переключение потоков.
     
  17. Sunzer

    Sunzer Member

    Blog Posts:
    0
    Joined:
    May 25, 2008
    Messages:
    256
    А программные прерывания как ловит процессор?
     
  18. SII

    SII Воин против дзена

    Blog Posts:
    0
    Joined:
    Oct 31, 2007
    Messages:
    1,483
    Location:
    Подмосковье
    Если возникает программное прерывание, текущая команда (которая это прерывание и вызвала) заканчивается положенным в соответствии с описанием способом, после чего немедленно происходит это прерывание. Сама метода прерывания в целом не отличается от внешнего аппаратного прерывания (происходит такое же сохранение адреса команды, разве что в некоторых прерываниях сохраняется ещё дополнительная информация -- это надо смотреть главу про прерывания в третьем томе интеловского мануала), но программные прерывания не могут быть замаскированы (состояние флага IF на них не влияет; если разделил на 0 -- получишь прерывание в любом случае).
     
  19. Medstrax

    Medstrax Забанен

    Blog Posts:
    0
    Joined:
    Jul 18, 2006
    Messages:
    673
    Зачем вводить в заблуждение? Есть как минимум 3 отличия между софтовым int XX и аппаратным ексепшном.
    1) Аппаратный эксепшн не проверяет права доступа дескрипторов
    2) Аппаратный эксепшн, в случае внешного прерывания, не выдает на шину цикл подтверждения
    3)Аппаратный эксепшн, может пихнуть в стек error code
     
  20. SII

    SII Воин против дзена

    Blog Posts:
    0
    Joined:
    Oct 31, 2007
    Messages:
    1,483
    Location:
    Подмосковье
    medstrax1
    Я писал в общих чертах, а не со всеми интимными подробностями; кроме того, п. 3 я упомянул. Так что никакого введения в заблуждение. Ну а со всеми подробностями если -- человек в них попросту утонет.
     
Thread Status:
Not open for further replies.