Коллеги приветствую,
Хочу обратиться с советом по архитектурной задаче, решение которой я полностью провалил.
У меня было около 20 минут на решение .
Представим себе многоядерную компьютерную систему.
Есть ряд поступающих разнородных событий, сетевые,от файловой системы, от видеокамеры к примеру ну и т.д
Задача состоит в распределении обработчиков этих задач по ядрам, так чтобы ядра процессора не простаивали.
Обработчики задач будем считать чисто вычислительными, без каких то возможных ожиданий на ввод/вывод.
Т.е будем считать, что количество активных задач должно быть равным кол-ву ядер CPU.
Обеспечить обработку следует с как можно более высокой скоростью, и без простоя процессора.
Собственно задание: спроектировать структуру классов для решения данной задачи.
Взаимосвязи, интерфейсы и все такое.
Вопрос как действовать при решении подобных задач? Я в полной растерянности сейчас пребываю.
Я столько хочу готовое решение получить, сколько понять какие походы используются при решении подобных архитектурных задач. Какую литературу может почитать и т.д.
На ум приходят только "паттерны проектирования" и Александеску "Современное проектирование .... "
К сожалению на работе практики подобных задач нет, подобными вещами занимается выделенный отдел архитекторов ПО.
Здравствуйте, salvequick, Вы писали:
S>К сожалению на работе практики подобных задач нет, подобными вещами занимается выделенный отдел архитекторов ПО.
Если я правильно понял, то вопрос сводится к выбору из типовых реализаций пула задач (потоков). Дальше всё зависит от языка / фреймворка, универсального ответа не будет.
Здравствуйте, Sinix, Вы писали:
S>Если я правильно понял, то вопрос сводится к выбору из типовых реализаций пула задач (потоков). Дальше всё зависит от языка / фреймворка, универсального ответа не будет.
могу немного конкретизировать : язык С++ и платформа linux
Здравствуйте, salvequick, Вы писали:
S>Хочу обратиться с советом по архитектурной задаче, решение которой я полностью провалил.
Подозреваю что от тебя хотели услышать про размышления на тему паттерна producer-consumer с акцентом в сторону стоимости синхронизации и неблокирующих очередей а ля disruptor
Здравствуйте, salvequick, Вы писали:
S>Я столько хочу готовое решение получить, сколько понять какие походы используются при решении подобных архитектурных задач. Какую литературу может почитать и т.д. S>На ум приходят только "паттерны проектирования" и Александеску "Современное проектирование .... "
У microsoft была статья (или даже книга?) на тему concurrency patterns. Сходу не нашел. Там конечно во всю опираются на Task Parallel Library в .NET но основные алгоритмы разобраны.
Суть решения твоей задачи состоит в очереди и рабочих потоках по числу ядер.
Несколько вопросов, на которые надо ответить:
1) Как будет происходить конкурентный доступ к очереди? Чтобы одновременное взятие задачи из очереди и исполнение ничего не поломал. Ответ — lock-free очереди.
2) Что делать если задач нет — тут надо исходить из требований. Можно гасить потоки и запускать, если нет свободных, а можно использовать примитивы синхронизации для остановки отдыхающих (с минимальным оверхедом).
3) Как сигнализировать о завершении — тут надо просто посмотреть как сделан IAsyncResult в .NET.
4) Как сделать thread affinity в такой системе, ибо не любой код может исполняться в разных потоках.
5) Скорее всего будут детали связанные именно с *nix, ибо в винде есть встроенные thread pool, там задачи неактуальна.
Здравствуйте, vsb, Вы писали:
vsb>Ставишь тред пул по числу ядер и всё. Какие там ещё классы и интерфейсы. implements Runnable и всего делов.
а потом оказывается что у тебя потоки 80% времени на локах висят. Внезапно, ога.
Здравствуйте, itslave, Вы писали:
I>Здравствуйте, vsb, Вы писали:
vsb>>Ставишь тред пул по числу ядер и всё. Какие там ещё классы и интерфейсы. implements Runnable и всего делов. I>а потом оказывается что у тебя потоки 80% времени на локах висят. Внезапно, ога.
> Есть ряд поступающих разнородных событий, сетевые,от файловой системы, от видеокамеры к примеру ну и т.д
> Обработчики задач будем считать чисто вычислительными, без каких то возможных ожиданий на ввод/вывод.
Зачем додумывать то, чего нет в задаче. Никаких локов нет. Качественных реализаций Thread-пулов полно.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, salvequick, Вы писали:
S>>Я столько хочу готовое решение получить, сколько понять какие походы используются при решении подобных архитектурных задач. Какую литературу может почитать и т.д. S>>На ум приходят только "паттерны проектирования" и Александеску "Современное проектирование .... "
G>У microsoft была статья (или даже книга?) на тему concurrency patterns. Сходу не нашел. Там конечно во всю опираются на Task Parallel Library в .NET но основные алгоритмы разобраны.
Вот эта? Parallel Programming with Microsoft® .NET Или что-то поновее есть?
Здравствуйте, itslave, Вы писали:
I>Здравствуйте, vsb, Вы писали:
vsb>>Ставишь тред пул по числу ядер и всё. Какие там ещё классы и интерфейсы. implements Runnable и всего делов. I>а потом оказывается что у тебя потоки 80% времени на локах висят. Внезапно, ога.
Да, да, да, конечно. Если задачи очень маленькие, то может и будет оверхед на локах. В любом случае лучше это профилировать, чем стрелять из lock-free по воробьям. Тем более там где оно не нужно.
Здравствуйте, Spinifex, Вы писали:
S>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, salvequick, Вы писали:
S>>>Я столько хочу готовое решение получить, сколько понять какие походы используются при решении подобных архитектурных задач. Какую литературу может почитать и т.д. S>>>На ум приходят только "паттерны проектирования" и Александеску "Современное проектирование .... "
G>>У microsoft была статья (или даже книга?) на тему concurrency patterns. Сходу не нашел. Там конечно во всю опираются на Task Parallel Library в .NET но основные алгоритмы разобраны. S>Вот эта? Parallel Programming with Microsoft® .NET Или что-то поновее есть?
Похоже что она, хотя мне кажется я на сайте читал статьи. Возможно из них книга и составлена.
Здравствуйте, salvequick, Вы писали:
S>Здравствуйте, Sinix, Вы писали:
S>>Если я правильно понял, то вопрос сводится к выбору из типовых реализаций пула задач (потоков). Дальше всё зависит от языка / фреймворка, универсального ответа не будет.
S>могу немного конкретизировать : язык С++ и платформа linux
для управления задачами можно использовать Intel TBB — он работает на task stealing.
Для параллельной обработки событий из разных источников можно использовать asio — его можно запускать в многопоточном режиме, плюс асинхронка из коробки.
Здравствуйте, _Artem_, Вы писали:
I>>а потом оказывается что у тебя потоки 80% времени на локах висят. Внезапно, ога. _A_>Да, да, да, конечно. Если задачи очень маленькие, то может и будет оверхед на локах. В любом случае лучше это профилировать, чем стрелять из lock-free по воробьям. Тем более там где оно не нужно.
Давай не забывать, что речь шла о собеседовании, а не о решении реальных задач.
Здравствуйте, salvequick, Вы писали:
S>Здравствуйте, itslave, Вы писали:
I>>Давай не забывать, что речь шла о собеседовании, а не о решении реальных задач.
S>надо понимать, что в конечном счете всех реальные задачи интересуют
На собеседовании обычно стараются понять есть ли у автора нужный бекграунд и умеет ли он этим бекграундом правильно пользоваться. А реальные задачи — это в проде.