информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetSpanning Tree Protocol: недокументированное применениеЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Блокировка российских аккаунтов... 
 Отзыв сертификатов ЦБ РФ, ПСБ,... 
 Памятка мирным людям во время информационной... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Саттера не читал, но мнение имею [upd] 28.03.09 08:48  Число просмотров: 2369
Автор: amirul <Serge> Статус: The Elderman
Отредактировано 28.03.09 09:14  Количество правок: 1
<"чистая" ссылка>
> > Кроме того, нужно
> > придумать способ лочить очередь без захвата шины (уже
> в
> > однопроцессорном окружении), но на мой взгляд это
> довольно
> > легко.
>
> А как? ... Саттер не так давно написал нескольно статей по
> этому поводу. Но я признаться не смотрел.

Саттера не читал, но мнение имею

Вообще интуиция подсказывает, что обычный CMPXCHG (без префикса LOCK) - должен отлично сработать. Я могу ошибаться, но насколько я понимаю поток может быть вытеснен только между инструкциями, а не прямо посреди (если прерывание приходит посреди инструкции, то процессор дожидается окончания этой инструкции) - а для однопроцессорной среды этого достаточно для обеспечения атомарности. Соответственно, когда флаг, блокирующий очередь для процессора (одна очередь - один флаг) не получается "захватить" - отдаем квант чем то вроде sleep(0) или подобным и делаем спин. Огромная стоимость такой операции для ожидающего потока будет нивелироваться крайне низкой вероятностью рейса на участке из десятка инструкций (pop из односвязного списка и освобождение очереди).

-------------------
Кстати, о текущем процессоре. В Win2k3 появилась полезная функция GetCurrentProcessorNumber. Вот так выглядит версия из Win7 (в других скорее всего что то подобное):

ntdll!RtlGetCurrentProcessorNumberEx:
7787cab6 8bff            mov     edi,edi
7787cab8 55              push    ebp
7787cab9 8bec            mov     ebp,esp
7787cabb 8b5508          mov     edx,dword ptr [ebp+8]
7787cabe 33c0            xor     eax,eax
7787cac0 668902          mov     word ptr [edx],ax
7787cac3 b93b000000      mov     ecx,3Bh
7787cac8 0f03c1          lsl     eax,ecx
7787cacb c1e80e          shr     eax,0Eh
7787cace 884202          mov     byte ptr [edx+2],al
7787cad1 c6420300        mov     byte ptr [edx+3],0
7787cad5 5d              pop     ebp
7787cad6 c20400          ret     4

---

Передается туда указатель на структуру:
typedef struct _PROCESSOR_NUMBER {
  WORD Group;
  BYTE Number;
  BYTE Reserved;
} PROCESSOR_NUMBER, *PPROCESSOR_NUMBER;

---

Так что болдом выделено конкретно получение номера процессора. Висты сейчас под рукой нет - проверить не могу, но как я уже сказал вряд ли она уходит в ядро, так что можно смело использовать эту функцию - оверхед на IPI и коллизии по идее должен быть больше. Так что можно сделать более продуктивную версию для 2k3+ с откатом к бейскейс реализации на interlocked-очереди для 2k/xp
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach