powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обзор средств меж-поточной синхронизации.
11 сообщений из 11, страница 1 из 1
Обзор средств меж-поточной синхронизации.
    #38184863
Фотография Ivan Ignatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Считаю себя близко знакомым с многопоточным программированием, но только из-за некоторых успехов в прикладной области, а не из-за понимания всех процессов, стоящих за потоками, примитивами синхронизации и т.п. Успехи были связаны сначала с применением pthread под linux при реализации сетевых серверов, затем связаны с применением boost::thread, boost::mutex, boost::condition_variable и т.п. в кросс-платформенных приложениях. Что стоит за вызовом pthread_lock() или блокировкой примитива из boost - не знаю, ассемблерный код не смотрел.

Понимаю, что синхронизация потоков реализуема на процессоре, если на нём есть (атомарная) машинная инструкция типа compare-and-change. Или ещё что-то? Догадываюсь, что высокоуровневая сущность типа семафор (который wait/post, [0,1,2,...)) достаточна, чтобы заменить собой мьютекс (который lock/unlock).

Интересно: (наивно и в лоб)

1. На каких конкретно машинных командах современных актуальных процессоров (intel core, arm v7, ...) обычно реализована (или может быть реализована) синхронизация? Какая последовательность ассемблерных команд обычно реализует семафор, например? (желателно с комментариями, чтобы было понятно как работает механизм и видно, где там атомарность).
2. Как изнутри устроена pthreads - делает ли она вызовы в ядро linux? Какие основные вызовы WinAPI наших дней являются краеугольным камнем меж-поточной синхронизации и вообще нужны ли вызовы в ядро? Подозреваю, что нужны, ведь сон (в который надо уйти, если примитив синхронизации заблокирован)- это понятие шедулера ОС.
3. Какие ядерные вызовы в linux/windows на тему синхнонизации потоков существуют вообще, на каких местах рейтинга быстродействия они находятся? Какие устаревшие, какие новые? Какие для каких особых ситуаций?
4. Какие современные/хитрые/быстрые принципы синхронизации потоков сущетвуют, возможно без вызовов в ядро? Например рассчитанные на то, что ресурс заблокирован менее короткое время, чем требуется процессорного времени на гуляние внутри соответствующего вызова ядра?
5. К каким WinAPI / linux-kernel-API вызовам сводятся основные манипуляции с примитивами синхронизации из boost?
6. Работал с Qt4, но никогда не было желания воспринимать её как библиотеку для чего-то, отличного от интерфейса. Никогда не стану использовать её сетевые или многопоточные средства. Но если кто-нибудь черкнёт про особенности реализации средств синхронизации потоков в Qt4 - будет спасибо.
7. Чего такого хитрого желательно понимать или почитать при разработке многопоточных приложений для многопроцессорных машин с NUMA-блоками и прочими крутыми вещами?
8. Совсем нечёткий вопрос. Что почитать на тему снижения хаотичности переключения/переназначения (между процессорами) потоков на многопроцессорных машинах с целью минимизации порчи кешей разных ЦП? Вопрос должен быть связан с вопросом (7).

Спасибо.

P.S.
Ясно, что я бы не мучал форум дурацкими вопросами, усердно поковырявшись в исходниках соответствующих библиотек. Но если мимо будет пробегать гуру, которому будет не лень черкнуть ответ на эти вопросы, ковыряние в исходниках было бы более замотивировано и сужено.
...
Рейтинг: 0 / 0
Обзор средств меж-поточной синхронизации.
    #38184922
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читай Джеффри РИХТЕР
"WINDOWS Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows" Глава 8 и дальше.

вот еще по Windows:
12289910
12294042
...
Рейтинг: 0 / 0
Обзор средств меж-поточной синхронизации.
    #38185168
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор2. Как изнутри устроена pthreads - делает ли она вызовы в ядро linux? Какие основные вызовы WinAPI наших дней являются краеугольным камнем меж-поточной синхронизации и вообще нужны ли вызовы в ядро? Подозреваю, что нужны, ведь сон (в который надо уйти, если примитив синхронизации заблокирован)- это понятие шедулера ОС
Точно не помню но кажется у Роберта Лава в книге было написано что создание Linux thread и
process вызывают одну и ту-же функцию ядра с разными атрибутами типа разрешений на шаринг
родительской памяти и дескрипторов файлов е.t.c.
...
Рейтинг: 0 / 0
Обзор средств меж-поточной синхронизации.
    #38185730
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. На каких конкретно машинных командах современных актуальных процессоров (intel core, arm v7, ...) обычно реализована (или может быть реализована) синхронизация? Какая последовательность ассемблерных команд обычно реализует семафор, например? (желателно с комментариями, чтобы было понятно как работает механизм и видно, где там атомарность).

Ни на каких. Это реализуется средствами ядра OS, а не специальными ассемблерными коммандами.

2. Как изнутри устроена pthreads - делает ли она вызовы в ядро linux?

Обязательно. линукса или винды или другой операционки, где она работает.

Какие основные вызовы WinAPI наших дней являются краеугольным камнем меж-поточной синхронизации и вообще нужны ли вызовы в ядро?

Иногда нужны, иногда нет. В Win это WaitForSingle/MultipleObject.


3. Какие ядерные вызовы в linux/windows на тему синхнонизации потоков существуют вообще, на каких местах рейтинга быстродействия они находятся? Какие устаревшие, какие новые? Какие для каких особых ситуаций?

C чего они устаревшие? Я не понял, ты найти какие-то супер-быстрые методы синхронизации ? Их нет.
В винде есть мьютексы и критические секции. Последние побыстрее , но они могут работать только в рамках одного процесса.

4. Какие современные/хитрые/быстрые принципы синхронизации потоков сущетвуют, возможно без вызовов в ядро? Например рассчитанные на то, что ресурс заблокирован менее короткое время, чем требуется процессорного времени на гуляние внутри соответствующего вызова ядра?

Ну, спинлоки всякие. Но это busy wait-ы всё, что плохо.

5. К каким WinAPI / linux-kernel-API вызовам сводятся основные манипуляции с примитивами синхронизации из boost?

Не знаю буст на эту тему.

6. Работал с Qt4, но никогда не было желания воспринимать её как библиотеку для чего-то, отличного от интерфейса. Никогда не стану использовать её сетевые или многопоточные средства.

Ну, зря. Эти средства позволяют делать многое на разных ОС независимо от этой конкретной ОС, может быть, не всегда так хорошо, как можно было бы, но это тоже полезно и часть бывает достаточно для задачи. Особенно для GUI, для которых QT в общем предназначена.
...
Рейтинг: 0 / 0
Обзор средств меж-поточной синхронизации.
    #38186066
MasterZiv1. На каких конкретно машинных командах современных актуальных процессоров (intel core, arm v7, ...) обычно реализована (или может быть реализована) синхронизация? Какая последовательность ассемблерных команд обычно реализует семафор, например? (желателно с комментариями, чтобы было понятно как работает механизм и видно, где там атомарность).

Ни на каких. Это реализуется средствами ядра OS, а не специальными ассемблерными коммандами.
Уточню:
- atomic-переменные и atomic_thread_fence-барьеры памяти - в общем случае реализованы чисто командами процессора. m_Sla уже показал первой ссылкой, как команда atomic_fetch_add реализуется процессорной lock xadd [ecx],eax.
- А вот все вариации mutex, semaphore, cond_var, ... - это функции ядра ОС, завязанные на переключение потоков, и в своей основе они так же реализуются через множество атомарных процессорных команд.


по пункту 4: для каждого конкретного случая существуют хитрые вещи, читайте про паттерны межпоточной синхронизации и неблокируемые контейнеры.
...
Рейтинг: 0 / 0
Обзор средств меж-поточной синхронизации.
    #38186377
Фотография Ivan Ignatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv1. На каких конкретно машинных командах современных актуальных процессоров (intel core, arm v7, ...) обычно реализована (или может быть реализована) синхронизация? Какая последовательность ассемблерных команд обычно реализует семафор, например? (желателно с комментариями, чтобы было понятно как работает механизм и видно, где там атомарность).

Ни на каких. Это реализуется средствами ядра OS, а не специальными ассемблерными коммандами.

Вот про то как оно реализовано в ядре OS и нужно рассказать )
...
Рейтинг: 0 / 0
Обзор средств меж-поточной синхронизации.
    #38186386
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan IgnatovMasterZiv1. На каких конкретно машинных командах современных актуальных процессоров (intel core, arm v7, ...) обычно реализована (или может быть реализована) синхронизация? Какая последовательность ассемблерных команд обычно реализует семафор, например? (желателно с комментариями, чтобы было понятно как работает механизм и видно, где там атомарность).

Ни на каких. Это реализуется средствами ядра OS, а не специальными ассемблерными коммандами.

Вот про то как оно реализовано в ядре OS и нужно рассказать )
Покупаешь вот эту книжку и читаешь:
http://www.amazon.com/Modern-Operating-Systems-3rd-Edition/dp/0136006639/ref=pd_sim_b_8
Лучше Таненбаума этот вопрос никто не описывал.
...
Рейтинг: 0 / 0
Обзор средств меж-поточной синхронизации.
    #38186430
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конкретно в Линуксе glibc который там реализует pthread API, для реализации многих примитивов синхронизации использует системные вызовы для работы с futex. Думаю вам не сложно будет открыть исходники линукса и glibc и найти что там внутри происходит.

А вообще, с точки зрения многопроцессорных систем, мьютекс/семафор это флаг/счетчик, перед установкой которого вызывается барьер памяти load/acquire, а после снятия - барьер store/release. Рядом с флагом есть список усыпленных потоков которые его ожидают. На основе этого примитива можно реализовать почти любой способ синхронизации.
Сам флаг устанавливается атомарно с операцией проверки его прежнего состояния. Для большинства современных процессоров для этого есть команда, типа CMPXCHG* на x86.
Барьеры - это инструкции процессору, которые отвечают за синхронизацию данных во всей системе, так чтобы видимый порядок изменения данных соответствовал порядку машинных инструкций до и после этих барьеров.
Есть однопроцессорные системы без аппаратного параллелизма, где барьеры не нужны, т.к. данные всех потоков всегда консистентны.
Есть многопроцессорные системы где физически существует только store barrier, а load barrier ничего не делает - это x86/x86_64. Там операция записи в память сопровожденная store barrier приводит к синхронизации этой ячейки памяти на всех ядрах.
Есть системы на основе процессора Alpha где существуют куча типов барьеров, они все нужны, и никто не знает как их применять :). К счастью этот проц не является мэйнстримом.
Еще есть распространенные в мобилах процы ARM. Там тоже есть сложности с барьерами ( в версиях до ARMv7, которой еще нигде толком нет, насколько я знаю)

Boost в основном использует примитивы ОС (например pthread_* в Линуксе), но в некоторых случаях реализует свои, полностью в userspace.

И напоследок: быстрой синхронизации не бывает.
Вот я на днях на 24-ядерном сервере тестил скорость инкрементирования счетчика из нескольких потоков: для обычного счетчика защищенного мьютексом, и для счетчика с атомарным инкрементом.
Так вот в первом случае максимальная скорость 30 млн инкрементов в секунду, а во втором 200 млн.
Это я напоминаю на 24 ядрах каждое на частоте 2ГГц. Т.е. скорость при синхронизации на порядки меньше суммарной потенциальной мощности системы.
...
Рейтинг: 0 / 0
Обзор средств меж-поточной синхронизации.
    #38186445
ARMv7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyТам тоже есть сложности с барьерами ( в версиях до ARMv7, которой еще нигде толком нет, насколько я знаю)
А в ARMv7 тоже, как и в x86 оставили только store-barrier или как решили сложности?
...
Рейтинг: 0 / 0
Обзор средств меж-поточной синхронизации.
    #38186493
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ARMv7,

Сорри, я говорил по памяти с этого видео: часть 1 часть 2 и перепутал.
Речь на самом деле шла про ARMv7 как старую платформу с недостаточно строгими барьерами, а исправлено было начиная с ARMv8, которой пока нет в вышедших на данный момент устройствах.

В ARMv8 сделали два нормальных барьера load и store.
По мнению Герба Саттера именно в этой архитектуре сделаны такие барьеры load и store, какие и должны быть, причем впервые в истории микропроцессоров :)
В том видео (часть 2) начиная с 0:28:20 идет обсуждение реализации барьеров на 4-х основных платформах.
C 0:53:40 - про ARMv8
...
Рейтинг: 0 / 0
Обзор средств меж-поточной синхронизации.
    #38186494
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и весь доклад очень интересный - обязателен к просмотру.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Обзор средств меж-поточной синхронизации.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]