我应该为我的应用程序使用进程或线程吗?

时间:2013-09-09 17:45:48

标签: c linux multithreading process

我有一台运行Linux 2.6内核的ARM设备,总内存为64 MB RAM。

有一个数据源,包括一个由Linux机箱查询的仪表,通过RS485和ModBus作为应用程序协议。

还有另一项任务,包括读取这些值并生成json对象,然后将HTTP POST发送到特定服务器。

网络操作可能比串行慢,尤其是在低GPRS覆盖范围内。

我需要并发,程序是用C语言编写的。

你会以哪种方式实现并发?使用select()或使用pthreads?

3 个答案:

答案 0 :(得分:5)

在分析此特定应用程序时,实际上只有一个与选择pthreads相关的问题:

  1. 传感器读卡器和网络编写器是否需要共享地址空间?
  2. 在这种情况下,我认为答案显然是“#34; no"”。当然,这不是唯一可能的问题,而是唯一的密切关系。有理由更喜欢单独的流程:

    1. 应用程序的两半没有共同的代码; RS485与HTTP / JSON
    2. 完全不同
    3. 责任分离:如果RS485端正在等待UART,你真的想阻止HTTP端吗?
    4. 让操作系统完成它的工作,所以你不必:如果使用pthreads,你必须处理内核为你免费提供的大量同步和抢占以及你不需要的代码。必须写的没有新的错误。
    5. 进一步的分析需要比你给出的更多细节,但这是另一种思考选择的方法:发明线程是为了减轻过程模型的某些局限性。除非您知道要达到这些限制,否则请使用单独的流程。

      在回复评论时添加

      我同意psusi的建议设计。只需要有两个进程,一个(让我们说传感器阅读器,这是一个很好的选择),它只分配一个http发送者。这两个进程可以使用传统的IPC(如管道)进行通信。传感器进程在有一些数据时向下发送数据,子进程(http)进程将其打包在json中并在途中发送。

      它只需要两个长期存在的进程,它可能使用与pthread实现相同数量的核心,并且更容易实现。

答案 1 :(得分:1)

select()更有效,因为它避免了多线程带来的上下文切换。并且线程比单独的进程更有效,因为您可以避免复制数据(除非您设置共享内存,但此时您可能已经使用了线程)。但是,像select()一样编写非阻塞I / O更难做到并且正确,并且不享受多线程带来的多任务处理。多个进程可能是最简单的实现,尤其是因为您可以使用curl而不是自己编写HTTP POST一半。

答案 2 :(得分:0)

为什么需要并发?是否必须在严格的时间间隔内对仪表进行轮询?

如果答案为是:只需使用两个进程,一个轮询仪表数据并写入nand存储器中的环形缓冲区,另一个从环形缓冲区读取数据并发送HTTP数据。

如果答案为否:您根本不需要并发和非阻塞。在main()中使用一个大循环就足够了。