Я разрабатываю систему на C++ под Windows 7. Я имею дело с кучей процессов, которые развертываются на разных процессорах и которые общаются друг с другом. Поскольку коммуникация является критичной по времени (на самом деле я занимаюсь системой реального времени, я понимаю, что Win7 - не самая подходящая ОС для моей цели.) Мне нужно, чтобы она была как можно быстрее. Я прочитал о IPC под Win7 (Pipes, MemMappedFiles, Sockets). Самый быстрый способ - это файлы с памятью (Fastest IPC method on Windows 7). Тем не менее, я не согласен с идеей, что swapper Win7 запускает фоновое копирование данных взад и вперед от RAM до HD. Кроме того, диспетчер виртуальной памяти должен вычислять адреса физической памяти всякий раз, когда я обращаюсь к адресу виртуальной памяти.Как распределить консекутивный патрон физической памяти для быстрого IPC
Мой подход: я хотел бы выделить пару МБ в ОЗУ и написать/прочитать их напрямую, используя их физический адрес. Кроме того, я хотел бы удалить этот патрон RAM-памяти из управления памятью Win7. Это возможно? Это должен быть самый быстрый способ совместного использования данных между процессами на отдельных процессорах, правильно? Я понимаю, что таким образом я не позволяю Win7 использовать любые алгоритмы кеширования, но поскольку все мои процессы развернуты на отдельных процессорах и, следовательно, не могут получить доступ к кеш-памяти друг от друга, это меня не беспокоит, верно?
Любые комментарии (также очень общие) очень ценятся, поскольку я все еще в фазе проектирования моей системы и поиска ввода!
Некоторые вопросы из любопытства: вы рассматривали ядро Linux? Он может (и был) настроен для использования в средах реального времени, поэтому он доказан. Кроме того, зачем пытаться обойти механизмы ОС? Вы просите больше проблем, чем это стоит. Если вы находитесь в среде RTOS, пусть сама ОС позаботится о том, чтобы не отставать от ограничений. Получите его на работу * сначала *, и * затем * беспокойтесь о производительности. Кажется, у вас еще ничего нет, поэтому вам слишком рано думать о том, как сделать вас еще не «быстрее». – ray
Я бы с радостью использовал Linux, но, к сожалению, привязан к Win7. Как объяснялось выше: я думаю об обходе функций Win7, чтобы повысить производительность. Я никогда этого не делал, поэтому я оставляю его на обсуждение. – Johannes
Начните с простой общей памяти. Затем профиль. Если вы заметили низкую производительность *, возникающую из-за ошибок страницы *, исследуйте методы, чтобы ваши страницы находились в физической памяти (самый простой из них просто отключил файл подкачки).Если вы заметили низкую производительность *, исходящую из thrashed TLB *, исследуйте методы доступа к физической памяти без накладных расходов MMU (что я даже не уверен, что это возможно на x86 в защищенном режиме). Все это, конечно, после того, как вы уже пытались сохранить рабочий набор как минимум. –