Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Hyper Threading и SMP и вопросы синхронизации.  (Прочитано 6278 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« : 07-11-2005 11:29 » 

может кто подскажет, как винда потоки может распределять на мультипроцесорных платформах?
в частности интерисует вопрос могут ли паралельно исполнятся два потока один из них к примеру на PASSIVE_LEVEL а второй например на DISPATCH_LEVEL?
а то судя по всему наступил на грабли... синхронизации драйвера и апликухи....

вопрос второй... синхронизация доступа к данным (тоже на SMP).
допустим есть переменная доступ к которой может осуществлятся и драйвером и приложением... (типа счетчик - инкремент/декремент не единичный)
вопрос засинхронизировать ее изменение... может изменятся достаточно часто, поэтому не хотелось бы использовать мьютексы, семафоры и пр.... остро стоит вопрос производительности  Вот такой я вот

Внимание вопрос Ага
в ДДК есть функции InterlockedExchange - может кто-нибудь знает на чем она основана? случайно не макрос команды add с префиксом lock, и последующим обнулением кеш памяти?
в API есть аналогичная функция... - работает по тому же принципу?

PS а вырос вопрос от того, что начал запускать драйвер - полная ересь творилась, до того момента как в биосе этот самый HyperThreading не отключил. надеялся на приоритеты... мой код на Dispache висел...

PPS кстати может кто скинет ссылочек по мультипроцессорным платформам и тому как с ними микрософт работает? на русском - было бы шиарно, но и на латинице покатит Отлично
« Последнее редактирование: 07-11-2005 12:06 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 07-11-2005 12:20 » 

может быть, для первого знакомства подойдёт книга Руссиновича "Внутри Windows 2000" (Inside windows 2000)
в сети точно есть вариант на английском.

Interlocked функции, если верить отвественным товарищам, например Д. Рихтеру, используют так называемую спин-блокировку -- выставляют/проверяют флаги в ячейках памяти.  Правда, я не уверен, что Interlocked могут работать через границу процесса.  Если драйвер и приложение выполняются в разных процессах, то надо, имхо, использовать мьютексы.

Если приложение и драйвер часто взаимодействуют друг с другом, то может быть надо перепроектировать их, чтобы уменьшить число обращений к общей памяти.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 07-11-2005 12:36 » 

гыыыы! на полке лежит книжка) совсем забыл про нее! спасибо:vzhik:

ну вообще говоря со спин-локами только что то типа:
LARGE_INTEGER
  ExInterlockedAddLargeInteger(
    IN PLARGE_INTEGER  Addend,
    IN LARGE_INTEGER  Increment,
    IN PKSPIN_LOCK  Lock
    );
связана.... и то видимо потому что LARGE_INTEGER, в одну команду сделать не удается...
а
LONG
  InterlockedExchange(
    IN OUT PLONG  Target,
    IN LONG  Value
    );
- без спин-лока :nono:

часто драйвер с приложением взаимодействуют, потому что драйвер получает высокоскоростной поток от железки, демультиплексирует, и отдает в кольцевой буфер независимым приложениям наобработку... плюс следит за его переполнением (когда производительности приложений не хватает на обработку).
в общем то, реализация действительно не слишком удачная, но когда начинал разрабатывать - куча вопросов по железке "на-потом" откладывалась, ну и проектировал с ооочень дальним прицелом и широкими возможностями. в целом не промахнулся, но грабли остались... разброс скоростей потока может быть на три порядка, а задержку хотелось сминимизировать. о производительности не говорю - думали скорости порядка нескольких десятков мегобайт будет, получилось... - но в итоге не понадобилось)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
dorador
Гость
« Ответ #3 : 08-11-2005 09:27 » 

Для межпроцессорной синхронизации надо применять Spin Lock (KeInitializeSpinLock, KeAcquireSpinLock, KeReleaseSpinLock, для DPC-процедуры свои немножко особенные функции).
У Рихтера написано, что Interlocked-функции 3-го кольца выдают аппаратный сигнал, запрещающий другому процессору обращаться по тому же адресу. ИМХО в 0-ом кольце аналогично.
В кернел моде еще есть быстрые мютексы (это к вопросу о быстродействии)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 08-11-2005 15:39 » 

Всем Спасибо!
запустил софт айс....

в драйвере:
InterlockedExchangeAdd - действительно макрос, транслируется в ассемблер:
lock xadd[reg],reg

видимо все остальные механизмы межпроцессорной блокировки SpinLock и комадны Interlocked* основаны на том же префиксе.
 Целую

PS
Оттрассировал команду KeAcquireSpinLock. увы - на  Hyper Threading оттрассировать не смог - там софтайс не стоит.
что же творится на Win2000 с целероном:

   mov   ecx, DWORD PTR _deviceExtension$[ebp]
   add   ecx, 8
   call   DWORD PTR __imp_@KfAcquireSpinLock@4
   mov   edx, DWORD PTR _deviceExtension$[ebp]
   mov   BYTE PTR [edx+12], al

Call-ом вызывается системная функция HAL:KfAcquireSpinLock. она - сохраняет текущий IQRL (лежит в статической ячейке памяти) и перезаписывает в 2 (видимо переключает на DISPATCH_LEVEL).после чего делает ret.
   xor eax,eax
   mov al, [addr]
   mov byte ptr[addr], 2
   ret
Префиксов lock - НЕТ. возможно по причине того что проц один и HAL для него - однопроцессорный.

В приложении хуже....
Трассировал InterlockedExchangeAdd API - так же, Call - вызов функции Kernel32. там команда xadd, без префикса... но опять же однопроцессорная машина.
в общем такие дела.... :vzhik:
« Последнее редактирование: 08-11-2005 16:37 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines