代码之家  ›  专栏  ›  技术社区  ›  BarsMonster

与网络/IO绑定应用程序的进程相比,在Linux上工作时线程有哪些限制?

  •  27
  • BarsMonster  · 技术社区  · 14 年前

    有什么意见吗?是否有其他限制可能会降低应用程序的速度? 应用程序是一个网络C++应用程序,服务100个客户端,带有一些磁盘IO。

    更新: 我担心除了我自己实现的锁定之外,还有更多与IO相关的问题。。。在多个线程中同时执行网络/磁盘IO是否有任何问题?

    2 回复  |  直到 14 年前
        1
  •  64
  •   Matt Joiner    9 年前

    线程:

    • 序列化内存操作。这是内核,反过来,MMU必须为诸如 mmap() 执行页面分配的。
    • open() , accept() , fcntl() 必须锁定它才能翻译 fd 到内部文件句柄,以及何时进行更改。
    • 可能共享一些可写内存。任何由多个线程写入的内存(特别是当它需要花哨的锁定时,速度会很慢)都会产生各种缓存争用和保护问题。例如堆操作,例如 malloc() free() 在一个全局数据结构上操作(在某种程度上可以被处理)。还有其他全球结构。
    • 共享凭据,这可能是服务类型进程的问题。

    进程还是线程?

    • 如果您想使调试更容易,可以使用线程。
    • 如果您在Windows上,请使用线程。(Windows中的进程非常繁重)。
    • 如果稳定性是一个巨大的问题,尝试使用过程。(一) SIGSEGV/PIPE 这就是一切。
    • 如果线程不可用,请使用进程。(现在不常见了,但确实发生过)。
    • 如果您的线程共享多个进程无法使用的资源,请使用线程。(或者提供一个IPC机制来允许与资源的“所有者”线程通信)。
    • 如果您的处理上下文完全不共享任何内容(例如一个套接字服务器,它在运行时生成并忘记连接) 接受()
    • 线程和进程之间最大的区别之一是:线程使用软件构造来保护数据结构,进程使用硬件(这是 明显地 更快)。

    链接

        2
  •  -1
  •   MarkR    14 年前

    它真的应该没有什么区别,但可能是关于设计。

    多进程应用程序可能需要更少的锁定,但可能需要更多的内存。在进程之间共享数据可能更难。

    另一方面,多进程可以更健壮。您可以调用exit()并在不影响其他人的情况下安全地退出孩子。