Вопрос по регистрам и стеке

Тема в разделе "WASM.BEGINNERS", создана пользователем Charm0nt, 23 сен 2010.

  1. Charm0nt

    Charm0nt New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2010
    Сообщения:
    22
    Привет!
    У меня вопрос по регистрам и стеке.
    Возьмем к примеру какой нибудь процесс, который выполняется на компе. Припустим, что у него работает несколько потоков. Объясните, как программа сохраняет правильный баланс работы, если в коде постоянно вызываются какие нибудь функции, модифицируются флаги, добавляются и восстанавливаются данные из стека. Если один поток записывает в eax какое то свое значение, а другой в это время считывает с eax, но должен считать какое то другое, то в самом eax могли бы оказаться вовсе не те данные.
    В общем я запутался, и не совсем понимаю архитектуры работы программ на компьютере, архитектуры работы процессора.
     
  2. Toxasoft

    Toxasoft New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2010
    Сообщения:
    188
    Отдельный поток это чтото типа отдельной программы(вроде):-|
     
  3. Toxasoft

    Toxasoft New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2010
    Сообщения:
    188
    Отдельный поток это чтото типа отдельной программы(вроде):-|
     
  4. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    При активации потока, ядерного или юзермодного загружается контекст этого потока, регистры, флаги, сегментные регистры, меняется в CR3 указатель на таблицу страниц и так. далее. Если не прав поправьте.
     
  5. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    Вот тут-то и состоит искусство программера - сохранить правильный как ты выражаешься "баланс работы". Т.е. контролировать состояние стека, флагов, семафоров, данных в регистрах. Поэтому и были придуманы языки высокого уровня, чтобы избавиться от этого геморроя и сосредоточиться исключительно на алгоритмах.
     
  6. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    Для каждой программы система, при переключении задач (потоков), сохраняет регистры предыдущей задачи, и загружает для следующей. А стек и вовсе для каждой свой т.к. это просто область памяти, которая тоже для всех своя единственная и неповторимая.
     
  7. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    artkar
    шо за бред? регистры сохраняет ос, и не как это не относится я яп высокого уровня
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Поток это задача, со всеми вытекающими отсюда последствиями.
     
  9. Charm0nt

    Charm0nt New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2010
    Сообщения:
    22
    Абсолютно всем спасибо за ответы.
    Если так и есть на самом дела, тогда все намного понятнее.
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    sysexit
    CR3 не меняется. CR3 меняется при переключение между процессами.
    Сегментные регистры тоже не трогаются. Если только нет эмуляции. Но это тоже относится к процессам.
    У каждого потока свой стек.

    Все просто на однопроцессорной(одноядерной) системе потоки не выполняются одновременно. Но несколько раз в секунду переключается, что называется многозадачностью. Во время переключения процессор сохраняет текущее состояние процесса и загружает состояние другого.

    В много процессорных системах и многоядерных разные потоки могут выполняться на разных ядрах где у каждого ядра свой регистр eax, сови регистры. И они не пересекаются. Память только общая. Вот тут и возникают проблемы синхронизации. Есть переменная a1 расположенная в ячейки 1 если первый поток ее считает в регистр eax а второй ее изменит то в регистре она не поменяется. Ну и тут используют методы синхронизации. Есть операция xchg которая блокирует ячейку до тех пор пока не выполниться. На основе нее делают светофоры мьютексы которые и позволяют синхронизировать работу.
     
  11. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Charm0nt
    Есть два варианта: либо оба потока выполняются на одном процессоре, либо на разных процессорах (или ядрах).
    Если они выполняются на разных, то у каждого потока свой собственный eax. Если они выполняются на одном, то они не выполняются одновременно никогда: один немного поработает, потом ОС остановит его, сохранит все регистры, восстановит сохранённые регистры другого потока и даст немного поработать другому потоку. Потоки работают по-очереди.
    Где-то -- по-моему у Зубкова -- был пример реализации простейших потоков для DOS'а, там всё очень прозрачно показано.
     
  12. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Это знаю, просто лишнего в пост вписал
     
  13. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    А Ос это разве не программа?
    Программируя на яз выс. уровня вы думаете о регистрах и стеке?
    Не понял што Вас возмутило? Вопрос был как там всё сбалансировано - ответ- задача ложится на программиста (если мы говорим про самый низкий уровень)! Што не так?
     
  14. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    artkar
    Программирование на ассемблере, точно также не заставляет вас думать о регистрах которые используют другие потоки....
     
  15. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    о сохранении и балансировке между потоками ни один программист никогда не думает независимо от используемого языка
     
  16. DoctorWho

    DoctorWho New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2010
    Сообщения:
    87
    spa, MSoft: Просто человек вобще "не в теме"... не кормите троля.
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    MSoft
    Приходится думать иногда, например при атаках типо race condition, синхронизации, трассировке и пр.
     
  18. Toxasoft

    Toxasoft New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2010
    Сообщения:
    188
    Вы еще поговорите как картошку жарить! Человек спросил: у потоков программы одни регистры и стек или отдельные для каждого потока. - они ОТДЕЛЬНЫЕ ДЛЯ КАЖДОГО ПОТОКА!
     
  19. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    ну ты щас в крайности какие-то лезешь. Был вопрос относительно состояния регистров в разных потоках. Арткар начал нести какую-то чушь про программистов, яву и искусство баланса. Ему ответили, что программист сохранением контекста не занимается ни на каком языке. Конечно, это не касается специфических задач, но мы ведь рассматриваем общие случаи, не так ли?
     
  20. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    Вообще то я зря вписался в этот глупый спор ни очём

    Чё Вы все привезались к контексту при многопоточном программировании существует не только контекст, а дофига ещё чего и глобальные переменные и семафоры и пр.
    Причём сохранение контекста то же сделал программист,а не дух Интел и благодаря этому пограммисту мы можем не думать о его, контексте сохранении

    Это вообще ново для меня. Всегда думал что "балансировка" (не контекст прим. для ...)между потоками самое сложное в многопоточном программировании.

    Человек спросил что не понимает архитектуры работы программ на компьютере, архитектуры работы процессора, мой ответ вкратце такой: чтобы не вникать в низкоуровневую архитектуру, пограммируй на языках высокого уровня!

    Всё!