2013-09-09 3 views
3

У меня есть устройство ARM, работающее под ядром Linux 2.6, с общим RAM объемом 64 МБ.Должен ли я использовать процессы или потоки для моего приложения?

Существует источник данных, который состоит из счетчика, запрашиваемого ящиком Linux, через RS485 и ModBus в качестве протокола приложения.

Есть еще одна задача, состоящая в том, чтобы прочитать эти значения и сделать объект json, а затем HTTP POST на конкретный сервер.

Работа в сети может быть медленнее, чем серийный, особенно при низком покрытии GPRS.

мне нужно параллелизм, программа написана на C.

Какой путь вы бы параллелизм? С помощью select() или с помощью pthreads?

ответ

5

При анализе данного конкретного приложения есть действительно только один вопрос, отношение к выбирающих Pthreads:

  1. ли читатель датчик и сетевой писатель нужно разделить адресное пространство?

В этом случае, я думаю, что ответ явно «нет». Конечно, это не единственный возможный вопрос, а единственный вопрос. Есть причины предпочесть отдельные процессы:

  1. две половинки приложения не имеют общего кода; RS485 сильно отличается от HTTP/JSON
  2. Сегрегация ответственности: если сторона RS485 ожидает на UART, действительно ли вы хотите заблокировать HTTP-сторону?
  3. , позволяющий ОС выполнять свою работу, поэтому вам не нужно: при использовании pthreads вы должны обрабатывать большую синхронизацию и предварительное исправление, которое ядро ​​делает для вас бесплатно, и код, который вам не нужно писать не имеет новых ошибок.

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

добавил в ответ на комментарии:

Я наполовину согласен с предлагаемой конструкцией psusi в. Нужно только два процесса: один (скажем, сенсорный считыватель, это прекрасный выбор), который разворачивает одного и только одного отправителя http. Эти два процесса могут взаимодействовать с использованием традиционного IPC, такого как труба. Процесс датчика отправляет данные по трубе, когда он имеет некоторые, а дочерний (http) процесс упаковывает его в json и отправляет его на своем пути.

Требуется только два долгоживущих процесса, они используют, вероятно, примерно столько же ядра, сколько и реализация pthread, и это намного проще.

+0

Так вы предлагаете использовать 2 процесса? Таким образом, существует 3 варианта: 1) Ручные потоки по одному процессу. 2) select() в одном процессе. 3) Использовать 2 процесса. – jacktrades

+1

Да, с помощью select это боль, и потоки тоже могут быть и здесь не нужны. – psusi

+0

@jacktrades, в этом случае я бы предположил, что самое простое дело в том, чтобы процесс последовательного порта был родительским ... читайте последовательный порт, и как только у вас есть образец, 'fork()' и пусть фоновый процесс будет заботиться отправки его на веб-сервер, в то время как передний план возвращается к чтению из последовательного порта. – psusi

1

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

+0

Почему вы думаете, что вы можете использовать libcurl только для процесса? – jacktrades

+0

@ jacktrades Я не упоминал о libcurl. Он мог использовать libcurl для многопоточного решения, если это то, что вы предлагаете. – wingedsubmariner

0

Зачем вам нужен параллелизм? Должен ли счетчик быть опрошен в строгий временной интервал?

Если ответ ДА: Просто используйте два процесса, один опрос данных счетчика и запишите в кольцевой буфер в nand storage, а другой - данные из кольцевого буфера и отправьте данные HTTP.

Если ответ НЕТ: вам не нужны параллелизм и неблокирование вообще. Использовать большой цикл в main() достаточно.

Смежные вопросы