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

Discussion in 'WASM.BEGINNERS' started by Novi4ek, Jan 22, 2009.

  1. Novi4ek

    Novi4ek New Member

    Blog Posts:
    0
    Joined:
    Aug 3, 2007
    Messages:
    317
    В статье http://wasm.ru/article.php?article=scheduler

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

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

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

    Blog Posts:
    8
    Joined:
    Jun 4, 2007
    Messages:
    1,610
    Location:
    г. Санкт-Петербург
    А что тут непонятного? Поток завершился на обработке прерывания - для продолжения он должен выйти из обработчика.
     
  3. Novi4ek

    Novi4ek New Member

    Blog Posts:
    0
    Joined:
    Aug 3, 2007
    Messages:
    317
    т.е и в первом прдложении цитаты и во втором речь идет об одном и том же потоке? а где же происходит переключение на другие потоки?
     
  4. Novi4ek

    Novi4ek New Member

    Blog Posts:
    0
    Joined:
    Aug 3, 2007
    Messages:
    317
    Еще непонятна такая фраза в статье:
    Что имеется ввиду под словом "перезагрузка"? Просто сохранение KTRAP_FRAME?

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

    Phantom_84 New Member

    Blog Posts:
    0
    Joined:
    Jun 6, 2007
    Messages:
    820
    Попробую объяснить на своем коде. Так выглядит конец обработчика:
    Code (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

    Blog Posts:
    0
    Joined:
    Aug 3, 2007
    Messages:
    317
    Phantom_84, спасибо за ответ. так значит я верно понял что после возврата из switchcontext будет работать уже другой поток, не тот который был до входа свитчконтекст? Вот это собственно вопрос темы
     
  7. Novi4ek

    Novi4ek New Member

    Blog Posts:
    0
    Joined:
    Aug 3, 2007
    Messages:
    317
    >>Это сохранение регистров одного потока и восстановление регистров другого.

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

    Phantom_84 New Member

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

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

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

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

    Blog Posts:
    8
    Joined:
    Jun 4, 2007
    Messages:
    1,610
    Location:
    г. Санкт-Петербург
    Это верно при реализации программной многозадачности. При аппаратной всё немного по-другому.
     
  10. Novi4ek

    Novi4ek New Member

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

    Phantom_84 New Member

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