Передача данных между вызовами процесса - PullRequest
3 голосов
/ 27 марта 2011

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

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

Можете ли вы предложить быстрые способы сделать это?Я знаю, что могу использовать файлы для ввода-вывода и хотел бы избежать этого по очевидным причинам производительности.Должен ли (может?) Создать именованный канал для чтения / записи, чтобы избежать реального дискового ввода-вывода?

Ответы [ 3 ]

3 голосов
/ 27 марта 2011

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

В случае разделяемой памяти ваша программа создает сегмент с помощью shm_open (), если он не существует, или открывает его, если он существует. Вы mmap () памяти и вносите любые изменения и выход. Вы используете shm_unlink () только тогда, когда знаете, что ваша программа больше не будет вызываться и вам больше не нужна общая память.

Для очередей сообщений просто настройте очередь. Ваша программа читает очередь, вносит любые изменения, записывает очередь и завершает работу. Mq_unlink (), когда вам больше не нужна очередь.

Оба метода имеют постоянство ядра, поэтому вы теряете общую память и очередь при перезагрузке.

0 голосов
/ 27 марта 2011

... Я могу использовать файлы для ввода-вывода и хотел бы избежать этого по очевидным причинам производительности.

Интересно, каковы эти причины, пожалуйста ...

Linux кэширует файлы в памяти ядра в кэше страницы .Сначала записи идут на страницу наличными, другими словами, системный вызов write() - это вызов ядра, который копирует данные только из пространства пользователя в кэш страницы (это немного сложнее, когда система находится в состоянии стресса).Некоторое время спустя pdflush записывает данные на диск асинхронно.

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

Если вы хотите избежать записи на дискполностью, то есть состояние не требуется сохранять при перезагрузках ОС, эти файлы могут быть помещены в /dev/shm или /tmp, которые обычно являются точками монтирования файловых систем в памяти.

0 голосов
/ 27 марта 2011

Похоже, у вас есть процесс, который постоянно выполняется чем-то.

Почему бы не создать фабрику, которая порождает рабочие потоки?Фабрика может предоставить рабочим любую необходимую информацию.

...