Разъемы на одном компьютере взаимодействуют намного медленнее, чем при использовании общей памяти? - PullRequest
2 голосов
/ 01 декабря 2011

У меня есть Windows DLL, которая предоставляет видео для внешнего приложения. Мое основное приложение создает каждый видеокадр, и я использую глобально разделяемую память, поддерживаемую файлом системной страницы, чтобы передать этот кадр в DLL. Затем видеокадр извлекается внешним приложением и затем отображается. Я не являюсь владельцем внешнего приложения, просто DLL, которую он загружает для получения видео. Я подумываю о переходе на подход, основанный на сокетах, чтобы поговорить между моим основным приложением и DLL и избавиться от подхода с общей памятью. Мне не нравится смотреть, как «мягкие ошибки страницы» накапливаются, поскольку я постоянно делаю недействительным место в общей памяти каждый раз, когда записываю в него новый видеокадр. Я считаю, что ошибки программных страниц безвредны, это всего лишь побочный эффект подкачки памяти, но мне было бы удобнее без него.

Поскольку видео доставляется со скоростью около 25 кадров в секунду, у меня есть примерно 1/25 секунды для передачи кадра. Размеры кадров никогда не превышают 640 x 480, и они представляют собой сжатые кадры JPEG, поэтому они не очень большие, обычно около 10 000 байт. Итак, вот мой вопрос:

С уже открытым и постоянным соединением сокетов между двумя сокетами на одном ПК, будет ли время переноса видеокадра значительно дольше с использованием сокета вместо места в общей памяти? Или на уровне O / S это просто быстрая запись в память с незначительным «оформлением окна» вокруг него для поддержки связи через сокеты?

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

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

Существует еще одна сторона установки на основе сокетов и общей памяти - гибкость - с помощью сокетов легко переключиться на распределенную настройку. Благодаря тому, что сети становятся все быстрее и быстрее, это может пригодиться вам в будущем.

Надеюсь, это поможет.

0 голосов
/ 01 декабря 2011

Строго говоря, общая память будет быстрее, так как связь с сокетом добавляет уровень косвенности и инструкций. Вам нужна поддержка вашей общей памяти? Windows позволяет совместно использовать память без поддержки диска. Я верю, что есть способ не допустить обмена регионами, но я не знаю об этом.

...