статья про многозадачность windows

Тема в разделе "WASM.BEGINNERS", создана пользователем Novi4ek, 22 янв 2009.

  1. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    В статье http://wasm.ru/article.php?article=scheduler

    есть такая фраза:

    первое и последнее предложения какие-то невнятные, возникает ощущение что речь идет про выполнение одного и того же потока, но ведь это не так?
     
  2. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    А что тут непонятного? Поток завершился на обработке прерывания - для продолжения он должен выйти из обработчика.
     
  3. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    т.е и в первом прдложении цитаты и во втором речь идет об одном и том же потоке? а где же происходит переключение на другие потоки?
     
  4. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    Еще непонятна такая фраза в статье:
    Что имеется ввиду под словом "перезагрузка"? Просто сохранение KTRAP_FRAME?

    Вобщем мне непонятно, по мне так на выходе из обработчика должен исполняться уже другой поток (и если б не первая цитата в этой теме я бы так и думал),объясните тогда плз если это не так, когда же успевает выполниться другой поток?
     
  5. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Попробую объяснить на своем коде. Так выглядит конец обработчика:
    Код (Text):
    1.   ...
    2.   mov ebx, [current]
    3.   dec [ebx+TS.ActivePriority]
    4.   jnz @f
    5.   mov eax, [ebx+TS.Priority]
    6.   mov [ebx+TS.ActivePriority], eax
    7.   cmp ebx, [ebx+TS.Next]
    8.   je @f
    9. ; я тут сохраняю es, т.к. основной код обработчика не использует es,
    10. ; однако внутренние функции ядра, к которым относится и SwitchToNext,
    11. ; предполагают при вызове наличие селектора KDATA в ds, es и ss
    12.   push es
    13.   push ds ; KDATA
    14.   pop es
    15.   call SwitchToNext
    16.   pop es
    17. @@:
    18.   pop ds
    19.   pop ebx
    20.   pop eax
    21.   iret
    Внутри SwitchToNext происходит переключение, т.е. конец обработчика будет завершен только после реактивации потока.

    Это сохранение регистров одного потока и восстановление регистров другого. В виндах вероятно большая часть регистров общего назначения сохраняется и восстанавливается в коде обработчика с помощью pusha/popa и т.п. Я же это делаю в Switch-фрейме, однако и на моем примере можно понять, как это происходит. Можно посмотреть на сохраняемые мной регистры eax, ebx, ds и es. Внутри SwitchToNext они не сохраняются. Однако их значения не теряются в процессе переключения контекстов, т.к. их обязан сохранять код, вызывающий SwitchToNext. Т.е. регистры сохраняются в стеке одного потока, потом происходит переключение (одна из наиболее значимых операций здесь - перезагрузка esp) и аналогичные регистры восстанавливаются, но уже из стека другого потока.
     
  6. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    Phantom_84, спасибо за ответ. так значит я верно понял что после возврата из switchcontext будет работать уже другой поток, не тот который был до входа свитчконтекст? Вот это собственно вопрос темы
     
  7. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    >>Это сохранение регистров одного потока и восстановление регистров другого.

    Вот это и смущает, т.к. после сохранения KTRAP_FRAME там регистры другого потока как я понимаю еще не восстанавливаются, а восстанавливаются тоько вконце обработчика
     
  8. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Так и есть - внутри SwitchContext будет перезагружен esp и при возврате из этой функции будет извлечено значение eip уже из "нового" стека, т.е. относящееся к другому потоку.
    Регистры восстанавливаются, но уже в контексте другого потока. А когда через некоторое время опять получит управление данный поток, регистры будут восстановлены и для него как раз с помощью кода в конце обработчика.

    Это все очень просто, если смотреть под правильным углом зрения :)

    Edited: поправил свой предыдущий пост.
     
  9. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Это верно при реализации программной многозадачности. При аппаратной всё немного по-другому.
     
  10. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    Phantom_84 спасибо. Действительно все несложно, просто в статье как-то кривовато построено повествование о судьбе переключаемого потока, создается впечатление что после swapcontext'а и выхода из прерывания он продолжает выполняться благодаря фразам
    и
    т.е. проблемы с русским языком у меня или у автора не знаю.
     
  11. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Ну при аппаратной многозадачности перезагрузка регистров, включая eip, будет выполняться по команде аппаратного переключения задач внутри SwitchContext (например, jmp NEXT_TASK_SELECTOR:?), а при программной явно и плюс загрузка eip по команде ret. Принципиальной разницы здесь нет.