我应该为我的应用程序使用进程还是线程?

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

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

还有一个任务是读取这些值并创build一个json对象,然后将HTTP POST发送到特定的服务器。

networking操作可能比串行慢,特别是在低GPRS覆盖范围内。

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

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

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

  1. 传感器读写器和网络写入器需要共享地址空间吗?

在这种情况下,我认为答案显然是“不”。 当然,这不是唯一可能的问题,而是唯一的关系。 有理由更喜欢单独的进程:

  1. 申请的两半没有共同的代码; RS485与HTTP / JSON大不相同
  2. 责任划分:如果RS485端正在等待UART,你真的想拦截HTTP端吗?
  3. 让操作系统执行它的工作,所以你不必:如果使用pthreads,你必须处理大量的内核为你做的同步和抢占,你不需要写的代码也没有新的错误。

进一步的分析需要比你所提供的更多的细节,但是这里有一个额外的方法来思考这个选择:发明线程来减轻过程模型的一些限制。 除非您知道您将要达到这些限制,否则请使用单独的进程。

针对评论添加

我赞同psusi的建议设计。 只需要两个进程,一个(假设传感器读取器,这是一个很好的选择),它只分配一个http发送者。 这两个进程可以像使用管道一样使用传统的IPC进行通信 传感器进程发送数据到管道中,并且子进程(http)将进程打包到json中,并将其发送。

它只需要两个长寿命的进程,它使用的核心数量可能与pthread实现的数量大致相同,而且这样做要容易得多。

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

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

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

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