Текущий архив: 2004.11.21;
Скачать: CL | DM;
ВнизПотокобезопасные типы хранения данных ? Найти похожие ветки
← →
Cheburek (2004-11-09 20:14) [0]Хай. Не поможете ?
Требуется тип данных, потокобезопасный.
Отвечают ли таким требованиям Variant ? Динамические массивы ? Представители класса TStringList ?
Желательно что бы был быстрый поиск, быстрая вставка и удаление, возможность хранить инфу в удобном виде.
Меня устраивает и TStringList, но вроде бы он не потокобезопасен, а Synhronize использовать не охота.
Помогите советом...
Заранее всем спасибо.
← →
Cheburek (2004-11-09 20:46) [1]Удалено модератором
← →
Anatoly Podgoretsky © (2004-11-09 20:55) [2]Не отвечает, а отвечают только типы не большие чем 4 байта, которые могут быть прочитаны/записаны одной процессорной командой. Все остальные требуют синхронизации (то бишь блокировки на операцию).
← →
panov © (2004-11-09 23:09) [3]>Anatoly Podgoretsky © (09.11.04 20:55) [2]
Даже 4-х байтные типы не являются потокобезопасными при использовании на многопроцессорных компьютерах, несмотря на то, что Borland(почему - мне непонятно до сих пор), использует тип Boolean без защиты кода критической секцией.
← →
panov © (2004-11-09 23:10) [4]>Anatoly Podgoretsky © (09.11.04 20:55) [2]
Буду рад, если убедите в обратном раз и навсегда.
← →
Anatoly Podgoretsky © (2004-11-09 23:18) [5]Ну не знаю, убежду или нет, если операция атомарная, то она потокобезопасна. Видимо ты имеешь в виду, последовательность, чтение, модификация, запись, я же рассматриваю их по отдельности. Вот пример
A := 5; (1, 2, 4, на всякий случай выровненые на границу кеша)
A := B уже не безопасно.
A := A + 5 это уже вообще один известный пушной зверек.
← →
panov © (2004-11-09 23:36) [6]>Anatoly Podgoretsky © (09.11.04 23:18) [5]
Что будет, если 2 потока, выполняющихся на разных процессорах, одновременно будут записывать данные таким образом:
Поток 1:
A := $80;
Поток 2:
A := $40;
Определено ли будет значение переменной после выполнения такой операции, либо существуют механизмы, препятствующие писать в одну ячейку памяти разным процессорам?
← →
KilkennyCat © (2004-11-09 23:40) [7]
> panov © (09.11.04 23:36) [6]
а вероятность, что они будут одновременно, высока?
← →
Anatoly Podgoretsky © (2004-11-09 23:47) [8]panov © (09.11.04 23:36) [6]
Насчет потоков все нормально, а вот насчет процессоров не могу сказать, не знаю какие сейчас механизмы доступа к памяти, но не думаю, что это возможно одновременно даже для ДМА, это был бы полнейних крах системы, так что кто последний тот и прав и это относится и к одному процессору точно также.
KilkennyCat © (09.11.04 23:40) [7]
Высокая
← →
Verg © (2004-11-10 00:06) [9]Если адрес 4-х байтника не выровнен по границе 4-х байтов, то операция записи или чтения может перестать быть атомарной?
Грубо говоря, арбитру шины может понадобится более одного цикла шины для записи этой ячейки. Между этими циклами возможен захват шины в пользу другого процессора, т.о. поток выполняющийся на нем может прочитать некое "промежуточное" значение этой ячейки.
Вот и выплывают InterLockedExchange и т.п., которые для многопроцессорного ядра выполняются с префиксом блокировки шины.
Вообще невыровненные поля структур - это я считаю недостатком проекта. Поле структуры должно иметь смещение от начала структуры кратное размеру этого поля.
← →
KilkennyCat © (2004-11-10 00:29) [10]Прошу прощения, ежели слишком ламерно выскажусь, но насколько я слышал, разработка программ под более чем один процессор, равно как и ОС, поддерживающие мультипроцессорность, несколько отличается от стандартной схемы. Может, в эти отличия входит и защитный механизм от коллизий? раз вероятность совпадения высока, то это должно просто бросаться в глаза, тем, кто всю эту кашу заварил...
А вообще давно мечтал на практике посмотреть. Пожалуй, куплю двухпроцессорную мать с получки...
← →
KilkennyCat © (2004-11-10 00:30) [11]Кроме того, аппаратная реализация может запретить подобное.
← →
Defunct © (2004-11-10 07:11) [12]KilkennyCat © (10.11.04 00:29) [10]
> но насколько я слышал, разработка программ под более чем один процессор, равно как и ОС, поддерживающие мультипроцессорность, несколько отличается от стандартной схемы.
Когда вы пишите многопоточную программу на Delphi (хотя бы 2 потока), такая программа уже является программой, способной выполняться в SMP (Symmetric MultiProcessing) системе на двух процессорах (SMP - система с общей памятью).
Отличие в программировании будет только для не симметрических систем с разделяемой памятью (MPP - Massively Parallel System, NUMA - Non Uniform Memory Access) и расределенных систем (кластерная организация).
> либо существуют механизмы, препятствующие писать в одну ячейку памяти разным процессорам?
Обязательно существуют, исключения составляют системы с многопортовой памятью, но и там действует правило - кто последний тот и прав, а при одновременной записи конфликт разрешается контроллером памяти в пользу порта с меньшим номером.
← →
Defunct © (2004-11-10 07:35) [13]> А вообще давно мечтал на практике посмотреть. Пожалуй, куплю двухпроцессорную мать с получки...
PS: это хорошее вложение.
> Может, в эти отличия входит и защитный механизм от коллизий?
Все гораздо проще, как отметил
Verg © (10.11.04 00:06) [9]
Между этими циклами возможен захват шины в пользу другого процессора
применяется механизм захвата системной магистрали, т.е. в конкретный момент времени с памятью может работать только одно устройство (либо процессор, либо КПДП).
> раз вероятность совпадения высока, то это должно просто бросаться в глаза, тем, кто всю эту кашу заварил...
Вопрос разрешения конфликтов по доступу к общему ресурсу является если не самым важным, то уж одним из наиболее важных в огранизации параллельных систем. Над ним и работают целые институты. Вот к примеру SUN Microsystems уже добилась того, что в SMP системе может быть сотни процессоров, а всего лишь пару лет назад число процессоров ограничивалось десятками.
← →
KSergey © (2004-11-10 07:43) [14]> [13] Defunct © (10.11.04 07:35)
Вы так изящно выражаетесь, что нифига я не понял ;)
А можно для тупых конкретно сказать: для процессоров Intel, применяемых в IBM PC (хотя какое оно IBM?) и подобных при современной архитектуре построения шин, магистралей и прочих умных слов запись константы в 4-х байтную переменную есть потокобезопастная операция или нет? А чтение значения (из ячейки памяти в регистр процессора, например)?
Что вообще есть признак атомарности? Одна процессорная инструкция? Или как?
← →
Defunct © (2004-11-10 08:09) [15]> Что вообще есть признак атомарности?
Признак атомарности - команда выполняется за один цикл обращения к памяти.
> Одна процессорная инструкция?
Нет, инструкция может быть неатомарной.
примеры:
Rep MovsD <-- будет как минимум ECx*2 обращений к памяти
MovQ [EAx], EAx <-- будет 2 или 3 обращения к памяти
Mov [001], EAx <-- будет 2 обращения к памяти
А может быть и атомарной:
Mov [000], Eax <-- одно обращение к памяти
Mov [EAx], AL <-- одно обращение к памяти (всегда)
Вопрос: Когда инструкция перестает быть атомарной?
Ответы:
1. Когда в память записывается суммарное количество информации, превышающее разрядность одного машинного слова (для IA-32 разрядность машинного слова = 32 bit, для 8088 - 8 bit, 8086 - 16 bit.
2. Когда запись машинного слова происходит по адресу не выровнянному на границу машинного слова (т.е. в памяти захватывается два машииных слова)
картинка, иллюстрирующая 2:
адрес байта: 0123 4567
память: XXXX XXXX
^
запись XX XX (пишется слово по невыровненному адресу)
> Или как?
собсно вот так ;>
> конкретно сказать: для процессоров Intel
Можно:
на базе Intel можно создать SMP систему до 4-х процессоров, более большое число процессоров использовать неактуально (прирост производительности сильно снизится из-за возрастания числа конфликтов).
> запись константы в 4-х байтную переменную есть потокобезопастная операция или нет?
Есть потокобезопастная операция если переменная лежит по адресу кратному четырем
> А чтение значения (из ячейки памяти в регистр процессора, например)?
Чтение потокобезопастно тоже если инструкция атомарна. Иначе можно прочитать часть поля данных, в это время другой поток изменит вторую часть поля данных, вы ее прочитаете и получите ерунду.
← →
Defunct © (2004-11-10 08:12) [16]Defunct © (10.11.04 08:09) [15]
очепятка:
MovQ [EAx], MM0 <-- будет 2 или 3 обращения к памяти
← →
Verg © (2004-11-10 08:20) [17]
> Когда запись машинного слова происходит по адресу не выровнянному
> на границу машинного слова (т.е. в памяти захватывается
> два машииных слова)
Я думаю, что дело скорее даже в разрядности системной шины. Вроде у пентюхов она 64 бита, т.е. 8 байтов.
Выравнивание на 8-байтовую кратность - гарантия атомарности?
Да, вот и компилер постоянно "подбивает" Record Field Aligment установить = 8...
← →
Defunct © (2004-11-10 08:33) [18]> Выравнивание на 8-байтовую кратность - гарантия атомарности?
Я тоже начинаю склоняться, что в P4 выравнивание на 8-ми байтовую кратность есть гарантия атомарности (по работе с MMX)
команда MOVQ работает быстрее если соблюдается выравние на границу DQ.
Чего не могу сказать о P1 (там не замечал никакого ускорения при выравнивании на DQ (DD, DQ - одинаково))
> Да, вот и компилер постоянно "подбивает" Record Field Aligment установить = 8...
Да желательно, SSE вот вообще только при выравнивании на DQ работает (MOVDQA) нет выравнивания - exception, причем сразу.
← →
Defunct © (2004-11-10 08:41) [19]> Я думаю, что дело скорее даже в разрядности системной шины. Вроде у пентюхов она 64 бита, т.е. 8 байтов.
Насчет этого сомнительно. Зависит все от контроллера памяти.
Ведь можно сделать котроллер памяти который будет записывать машинное слово по любому адресу, а не только по вырровненному.
← →
Verg © (2004-11-10 08:49) [20]
> Ведь можно сделать котроллер памяти который будет записывать
> машинное слово по любому адресу, а не только по вырровненному.
Под выравниванием я понимаю условие "не пересечения" ячейкой границы слова системной шины.
Т.е запись word-а по адресам, например, 0-6 может быть произведена за один цикл, а по адресу 7 - уже только в два.
← →
KSergey © (2004-11-10 09:30) [21]> [15] Defunct © (10.11.04 08:09)
Спасибо большое.
Распечатаю, заучу.
> > конкретно сказать: для процессоров Intel
> Можно:
> на базе Intel можно создать SMP систему до 4-х процессоров,
> более большое число процессоров использовать неактуально
> (прирост производительности сильно снизится из-за возрастания
> числа конфликтов).
Во тут маненько не понял: MS заявляет о поддержке в серверных редакциях Win число процессоров много больше 4-х. Я, правда, не интересовался подробностями, но предполагал, что такое железо (на основе Intel) имеет место быть и какой-то смысл его применения есть. Я заблуждался?
← →
Defunct © (2004-11-10 10:29) [22]> Под выравниванием я понимаю условие "не пересечения" ячейкой границы слова системной шины.
> Т.е запись word-а по адресам, например, 0-6 может быть произведена за один цикл, а по адресу 7 - уже только в два.
Видимо все так и есть, во всяком случае для P4.
> Во тут маненько не понял: MS заявляет о поддержке в серверных редакциях Win число процессоров много больше 4-х.
Да можно и больше, располагаете финансами берите 16! 32! ;>
По сведениям компании ИКС, SMP системы на базе процессоров Intel показывают высокий КПД если в системе используется от одного до 4-х процессоров. Больше процессоров поставить конечно можно, но при этом упадет КПД.
Проще говоря картина примерно такая:
Был один процессор работает как 100%
2 процессора - 190%
4 процессора - 370%
8 процессоров - 700% (уже производительность одного процессора пропала из-за конфликтов)
больше процессоров - меньше прирост производительности.
Оптимальнее всего использовать системы на базе Intel с одним или двумя процессорами.
> Я, правда, не интересовался подробностями, но предполагал, что
> такое железо (на основе Intel) имеет место быть и какой-то
> смысл его применения есть.
> Я заблуждался?
нельзя сказать что вы заблуждаетесь, просто вероятно вы слышали не о SMP машинах (с общей памятью) в которых Intel не особо хорош (SMP лучшие решения от SUN и HP), а о суперкомпьютерах в которых Intel кстати на 3-м месте (если мне не изменяет память). Есть кластерные суперкомпьтеры на базе Intel и MPP суперкомпьтеры (тоже на базе обычных P-Pro)
← →
Defunct © (2004-11-10 10:37) [23]> Есть кластерные суперкомпьютеры на базе Intel и MPP суперкомпьютеры (тоже на базе обычных P-Pro)
Забыл добавить, в них число процессоров измеряется сотнями и тысячами.
← →
panov © (2004-11-10 10:48) [24]Резюмирая все выше сказанное:
1. Механизм защиты от одновременного использования памяти (4-х байтовых кусков) разными процессорами есть на аппаратном уровне.
2. Для использования этого механизма программисту необходимо отслеживать в своем коде границы, по которым выравниваются эти переменные.
В таком случае следующий вопрос.
А решения всех ли производителей одинаково полезны в этом отношении?
Существует ли стандарт и все ли производители обязаны его придерживаться?
PS.
И означает ли все это, что класс TThread не является потокобезопасным из-за прямого использования, например, FTerminated. Ведь явного выравнивания не указано в модуле.
← →
Verg © (2004-11-10 11:10) [25]
> И означает ли все это, что класс TThread не является потокобезопасным
> из-за прямого использования, например, FTerminated. Ведь
> явного выравнивания не указано в модуле.
Нет, не означает. Допустим даже, что FTerminated не выравнено, хотя, по-моему поля классов всегда выравниваются.
Там всего-то надо понять - надо уже выходит из цикла или еще не надо. По-сути FTerminated - ноль или не ноль.
← →
VMcL © (2004-11-10 12:10) [26]>>panov © (10.11.04 10:48) [24]
Дык, FTerminated, вроде ж Boolean, то есть SizeOf -> 1 байт. Значит, с ним д. б. всё ОК.
← →
Defunct © (2004-11-10 13:04) [27]> А решения всех ли производителей одинаково полезны в этом отношении?
Кто ж его знает. Вот например, контроллер памяти с буфферизацией записи это хорошо или плохо?
- хорошо там где он установлен (не надо думать о выравнивании, каждая транзакция к памяти - потокобезопастна).
- плохо для совместимости (программу написали с учетом такого контроллера, соотв. там где нет такого контроллера она работать не сможет)
> Существует ли стандарт и все ли производители обязаны его придерживаться?
IEEE
конечно, иначе бы каждая китайская конторка делала бы что-то свое.
← →
KSergey © (2004-11-10 13:17) [28]> [27] Defunct © (10.11.04 13:04)
Как-то не клеятся слова
> Кто ж его знает.
и
> конечно, иначе бы каждая китайская конторка делала бы что-то свое
Так как же оно на самом-то деле? ;)
← →
icWasya © (2004-11-10 14:17) [29]>Defunct [15]
...
Mov [EAx], AL <-- одно обращение к памяти (всегда ?)
...
Сдаётся мне что при 32-х разрядной шине данных тут будут иметь место такие действия
1) считывание из памяти 32 бита
2) замена 8 бит содержимым регистра AL
3) запись в память 32 бит
Поправьте меня, если я не прав, и как тут быть с атомарностью операции??
← →
Cheburek (2004-11-10 15:12) [30]Спасибо, господа, за ваши высказывания. Но хочу всё же уточнить:
1. Глобальные переменные разделяются всеми потоками одного процесса?
2. Если разделяются - то нужно ли их синхронизировать
на операции чтений?
3. Если синхронизации на чтение не надо, то может исполлзовать списки ? ТStringList?
4. Я планирую, что у меня глобальные переменные будут изменяться одним потоком, остальные потоки будут его только читать. Во время записи - элементы будут захватываться критической секцией. Остальные потоки будут синхронизироваться. Так нормально ?
← →
panov © (2004-11-10 15:54) [31]Cheburek (10.11.04 15:12) [30]
1. Да, все потоки могут читать глобальные переменные.
2. Только если изменяются эти глобальные переменные.
3. Использовать можно все, что угодно, так как защищается код, в котором происходит обращение к разделенным участкам памяти.
4. Нормально, но нужно учитывать логику. Т.е. один случай - это когда всем читающим потокам безразлична согласованность данных, и другой случай, если все читающие потоки должны получить одинаковые данные.
← →
Anatoly Podgoretsky © (2004-11-10 20:21) [32]Verg © (10.11.04 08:20) [17]
Я думаю, что дело скорее даже в разрядности системной шины.
Можно дополнить, P-IV (a-c) ширина кеша 16 байт, это же обеспечивается за один такт при двух канальной памяти, а вот с P-IV (е) уже не так, там кеш 32 байта, надо разрабатывать 4 канальную память или память с шириной 16 байт, думаю Интел что ни будь сделает в этом плане.
← →
Defunct © (2004-11-10 21:04) [33]icWasya © (10.11.04 14:17) [29]
Поправляю, скорее дополняю:
в приведенном примере, до завершения операции чтение-модификация-запись шина будет занята одним и тем же процессором.
Страницы: 1 вся ветка
Текущий архив: 2004.11.21;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.049 c