【问题标题】:What is easier for OS to set up, a new process or a new thread?操作系统更容易设置,新进程还是新线程?
【发布时间】:2011-09-07 22:39:54
【问题描述】:

如上所述的问题..从操作系统的角度来看,哪个更容易创建,线程还是进程?

【问题讨论】:

  • 只是一个猜测,但它可能是线程。要创建一个进程,操作系统需要在特定于该进程的内存中创建空间。多个线程可以在一个进程中运行。

标签: process operating-system pthreads


【解决方案1】:

传统上,线程被称为“轻量级进程”,所以我想它们更容易设置。

Linux 中的 IIRC 分叉和启动新线程 (clone(2)) 都是通过调用相同的函数 (do_fork) 来实现的,并且设置时间对于体面的数字来说是相当的。对于大量的分叉/克隆(想想数千个),它们开始加起来。

在 TLPI 中有一个很好的比较:

  • 分叉 100,000 次:22.27 秒
  • 克隆 100,000 次:2.97 秒

特别是clone 的一个非常好的特性是即使克隆的进程的大小增加,速度也保持不变。

线程的真正优势在于它们不需要IPC。

【讨论】:

  • 在某些操作系统中,可以在进程之间设置共享内存区域,以避免 IPC 开销并通过共享内存上下文实现类似线程的通信。它确实需要一些操作系统支持来进行初始设置——例如,可以直接支持共享内存,或者可以通过共享文件(可能驻留在内存中)上的内存映射文件 io 来完成。
【解决方案2】:

新线程更容易创建,因为当创建新进程时,它需要比线程更多的设置,例如安全上下文、可继承句柄、当前目录等。

【讨论】:

    【解决方案3】:

    创建新线程应该比创建新进程更快。

    进程是一个重量级的系统结构。它拥有自己的虚拟内存空间,拥有所有句柄(互斥体、信号量、打开的文件),并受到其他进程的保护。跨进程通信必须经过操作系统。

    线程是进程的“子”。线程只是一个执行上下文(寄存器、堆栈和线程本地状态),它可以在另一个硬件内核上运行,也可以与进程中的其他线程在同一内核上共同调度。多个线程共享单个进程的资源,包括进程拥有的地址空间和操作系统句柄。

    有些结构甚至比在程序运行时实现多任务处理时动态创建线程更快。

    某些系统或代码库支持具有线程池(轻量级线程)。在这种情况下,您告诉系统您要运行多少线程并预先创建它们。然后,您可以从这个池中分配和释放线程,而不是创建和销毁线程(这仍然是一个相对较慢的过程)。

    Job Tasking 是另一种类似的轻量级多核结构,其中您有多个线程和一个任务队列来执行。他们在其作业队列中运行任务,然后在队列为空时休眠。

    对于线程池和作业任务,除了创建和销毁全局池和队列时,不需要线程启动/关闭成本。

    【讨论】:

      【解决方案4】:

      线程和进程之间的主要区别是 1.线程共享进程的地址空间 创建它;进程有自己的地址。

      2.线程可以直接访问其数据段 过程;进程有自己的数据段副本 的父进程。

      3.线程可以直接与其他线程通信 其过程;进程必须使用进程间通信 与兄弟进程通信。

      4.线程几乎没有开销;过程有 相当大的开销。

      5.新线程很容易创建;新工艺需要 父进程的重复。

      6.Threads 可以对 相同的过程;流程只能行使控制权 子进程。

      7.主线程的变化(取消,优先级 更改等)可能会影响其他线程的行为 过程;对父进程的更改不会 影响子进程。

      【讨论】:

        【解决方案5】:

        线程必须与创建进程一样容易或更容易,因为创建进程意味着创建至少一个线程来运行进程代码。

        Rgds, 马丁

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-09
          • 2020-04-04
          • 1970-01-01
          • 2017-11-18
          • 1970-01-01
          • 2018-11-03
          • 2011-05-24
          • 2020-02-20
          相关资源
          最近更新 更多