【问题标题】:should I use processes or threads for my application?我应该为我的应用程序使用进程还是线程?
【发布时间】:2013-09-09 17:45:48
【问题描述】:

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

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

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

网络操作可能比串行操作慢,尤其是在 GPRS 覆盖率较低的情况下。

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

您会采用哪种方式实现并发?使用 select() 还是使用 pthreads?

【问题讨论】:

    标签: c linux multithreading process


    【解决方案1】:

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

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

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

    1. 应用程序的两半没有共同代码; RS485 与 HTTP/JSON 大不相同
    2. 责任分离:如果 RS485 端在 UART 上等待,您真的要阻止 HTTP 端吗?
    3. 让操作系统完成其工作,因此您不必:如果使用 pthreads,您必须处理内核免费为您执行的大量同步和抢占以及您不必编写的代码没有新的错误。

    进一步的分析需要比您提供的更多细节,但这里有另一种考虑选择的方法:发明线程是为了减轻进程模型的一些限制。除非您知道自己会遇到这些限制,否则请使用单独的流程。

    为响应 cmets 而添加

    我一半同意 psusi 的建议设计。只需要两个进程,一个(假设是传感器读取器,这是一个不错的选择)分叉一个且只有一个 http 发送者。这两个进程可以像管道一样使用传统的 IPC 进行通信。传感器进程在有数据时将数据沿管道发送,子 (http) 进程将其打包为 json 并在途中发送。

    它只需要两个长期存在的进程,它使用的内核数量可能与 pthread 实现大致相同,而且要正确得多。

    【讨论】:

    • 那么你建议使用2个进程吗?所以这里有3个选项:1)单个进程上的手动线程2)单个进程中的select()3)使用2个进程
    • 是的,使用 select 很痛苦,线程也可以,这里没有必要。
    • @jacktrades,在这种情况下,我想最简单的方法是让串口进程成为父进程...读取串口,一旦你有样本,fork() 然后让后台进程负责将其发送到 Web 服务器,而前台返回从串行端口读取。
    • @jacktrades,他们不需要交流......这就是为什么使用线程没有意义。
    • @msw 如果每次我们需要将样本刷新到网络时我们 fork() 一个进程,如果网络出现故障,那么我们会有很多进程,因此应用程序可能会崩溃。你确定不建议使用 pthreads 吗?请记住低 MB 内存。
    【解决方案2】:

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

    【讨论】:

    • 为什么你认为你只能在进程上使用 libcurl?
    • @jacktrades 我没有提到 libcurl。如果这是您的建议,他可以将 libcurl 用于多线程解决方案。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-02-16
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 2019-08-02
      • 2012-06-24
      • 2022-10-06
      相关资源
      最近更新 更多