2015-12-28 1 views
-3

Я разрабатываю систему на C++ под Windows 7. Я имею дело с кучей процессов, которые развертываются на разных процессорах и которые общаются друг с другом. Поскольку коммуникация является критичной по времени (на самом деле я занимаюсь системой реального времени, я понимаю, что Win7 - не самая подходящая ОС для моей цели.) Мне нужно, чтобы она была как можно быстрее. Я прочитал о IPC под Win7 (Pipes, MemMappedFiles, Sockets). Самый быстрый способ - это файлы с памятью (Fastest IPC method on Windows 7). Тем не менее, я не согласен с идеей, что swapper Win7 запускает фоновое копирование данных взад и вперед от RAM до HD. Кроме того, диспетчер виртуальной памяти должен вычислять адреса физической памяти всякий раз, когда я обращаюсь к адресу виртуальной памяти.Как распределить консекутивный патрон физической памяти для быстрого IPC

Мой подход: я хотел бы выделить пару МБ в ОЗУ и написать/прочитать их напрямую, используя их физический адрес. Кроме того, я хотел бы удалить этот патрон RAM-памяти из управления памятью Win7. Это возможно? Это должен быть самый быстрый способ совместного использования данных между процессами на отдельных процессорах, правильно? Я понимаю, что таким образом я не позволяю Win7 использовать любые алгоритмы кеширования, но поскольку все мои процессы развернуты на отдельных процессорах и, следовательно, не могут получить доступ к кеш-памяти друг от друга, это меня не беспокоит, верно?

Любые комментарии (также очень общие) очень ценятся, поскольку я все еще в фазе проектирования моей системы и поиска ввода!

+1

Некоторые вопросы из любопытства: вы рассматривали ядро ​​Linux? Он может (и был) настроен для использования в средах реального времени, поэтому он доказан. Кроме того, зачем пытаться обойти механизмы ОС? Вы просите больше проблем, чем это стоит. Если вы находитесь в среде RTOS, пусть сама ОС позаботится о том, чтобы не отставать от ограничений. Получите его на работу * сначала *, и * затем * беспокойтесь о производительности. Кажется, у вас еще ничего нет, поэтому вам слишком рано думать о том, как сделать вас еще не «быстрее». – ray

+0

Я бы с радостью использовал Linux, но, к сожалению, привязан к Win7. Как объяснялось выше: я думаю об обходе функций Win7, чтобы повысить производительность. Я никогда этого не делал, поэтому я оставляю его на обсуждение. – Johannes

+0

Начните с простой общей памяти. Затем профиль. Если вы заметили низкую производительность *, возникающую из-за ошибок страницы *, исследуйте методы, чтобы ваши страницы находились в физической памяти (самый простой из них просто отключил файл подкачки).Если вы заметили низкую производительность *, исходящую из thrashed TLB *, исследуйте методы доступа к физической памяти без накладных расходов MMU (что я даже не уверен, что это возможно на x86 в защищенном режиме). Все это, конечно, после того, как вы уже пытались сохранить рабочий набор как минимум. –

ответ

1

То, что вы пытаетесь сделать, вообще невозможно. Во-первых, приложениям с защищенным режимом не удается получить доступ к физической памяти - любой доступ к памяти заменяется доступом к виртуальной памяти ЦП, если только он не работает в незащищенном режиме. И единственный способ запустить ваш код в незащищенном (реальном) режиме - это запустить его как ядро ​​операционной системы, потому что остальные помещаются в защищенный режим.

Теперь, учитывая, что вы добиться успеха в создании приложения реального режима (! Сложной задачей, кстати) На данный момент, вы не в памяти, в файл больше - как это отображение выполняется ОС точно с использованием виртуальной памяти ,

Я также считаю, что ваши заботы неверно истолкованы. OS на самом деле хорошо разбирается в том, что происходит для обмена, а что нет, и вероятность того, что ваша активно используемая область памяти будет меняться, ничем не ограничена при каких-либо нормальных обстоятельствах.

Последнее, но не менее важно, я не уверен, что вы действительно понимаете, что вы здесь делаете.

4

По-моему, вы начинаете с неправильной ноги. В реальном времени это не означает как можно быстрее. Это означает, что вам нужно соответствовать определенным критериям эффективности.

Чтобы правильно выбрать, вам нужно знать, какую скорость вам действительно нужно.