2012-06-07 1 views
0

У меня есть существующее приложение, написанное на C++, которое выполняет ряд задач в настоящее время, считывая transactiosn из базы данных для всех клиентов, обрабатывая их и записывая результаты назад.Обертка неуправляемого кода с использованием нескольких процессоров

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

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

Я буду обертывать код C++ в .NET C# интерфейсе и управлять всеми этими процессами - локальным и распределенным из родительской службы управления C#, ответственной за создание, запуск и остановку процессов, а также всю связь и управление между ними ,

Что я хочу знать, если я создаю четыре экземпляра каждый в отдельном фоновом потоке на четырехъядерном ящике, независимо от того, будут ли CLR и .NET автоматически распределять нагрузку на четыре процессора на каждом поле или мне нужно что-то сделать, чтобы использовать возможности параллельной обработки?

ответ

1

Если вы имеете в виду, что вы будете запускать приложение в четырех процессах в одном и том же поле, то это операционная система (Windows), которая контролирует, как эти процессы распределяют процессорное время. Если процессы выполняют аналогичную работу, то обычно они получат примерно равное процессорное время.

Но, рассмотрели ли вы использование четырех потоков в рамках одного процесса? Потоки гораздо более легкие, чем процессы, и тогда вам не понадобится отдельная служба управления, т. Е. У вас будет один процесс (с четырьмя потоками) вместо 5 процессов. Вы случайно пришли из фона unix?

+0

Перед запуском вы можете установить [сродство к процессу] (http://msdn.microsoft.com/en-us/library/system.diagnostics.process.processoraffinity.aspx). –

+0

Причина, по которой я решал сделать это через процессы и процесс управления, - это то, что я хотел иметь возможность запускать и создавать процессы на разных серверах, местах и ​​т. Д. Если в ящике есть 4 процессора, то в идеале четыре потока будут оптимальными, но Я могу, например, использовать 15 потоков, разбитых на 4 ящика. Который в этом случае приведет к 4 процессам, некоторые из которых состоят из 4 потоков, а один - с 3, что будет намного сложнее управлять, контролировать состояние сети и запускать/выключать удаленно – NZJames

1

Вы можете установить сродство процесса при запуске процесса через объект Process (или ProcessThread в зависимости от того, как вы запускаете приложение).

Here is an SO post, который охватывает тему (я не голосовал, чтобы закрыть как дубликат (пока), потому что я не уверен на 100%, если это именно то, что вам нужно).