【问题标题】:What is the difference between a thread/process/task?线程/进程/任务之间有什么区别?
【发布时间】:2011-03-03 19:57:45
【问题描述】:

线程/进程/任务有什么区别?

【问题讨论】:

标签: process task terminology


【解决方案1】:

Wikipedia 总结得很好:

线程与进程的比较

线程与传统的多任务操作系统进程的不同之处在于:

  • 进程通常是独立的,而线程作为 进程的子集
  • 进程携带大量状态信息,而多个 进程共享状态中的线程 以及内存和其他资源
  • 进程有单独的地址空间,而线程共享它们的 地址空间
  • 进程仅通过系统提供的进程间交互 沟通机制。
  • 同一进程中线程之间的上下文切换是 通常比上下文更快 在进程之间切换。

Windows NT 和 OS/2 等系统据说具有“廉价”线程和“昂贵”进程;在其他操作系统中,除了地址空间切换的成本(这意味着 TLB 刷新)之外,没有太大的区别。

任务和流程是同义词。

【讨论】:

    【解决方案2】:

    简答:

    线程是一个调度概念,它是 CPU 实际“运行”的内容(您不运行进程)。一个进程至少需要一个 CPU/OS 执行的线程。

    流程是数据组织的概念。为进程分配资源(例如用于保存状态的内存、允许的地址空间等)。

    【讨论】:

      【解决方案3】:

      流程:

      进程是正在执行的计算机程序的一个实例。 它包含程序代码及其当前活动。 根据操作系统 (OS),一个进程可能由同时执行指令的多个执行线程组成。 基于进程的多任务处理使您能够在使用文本编辑器的同时运行 Java 编译器。 在使用单个 CPU 的多个进程时,使用了各种内存上下文之间的上下文切换。 每个进程都有一套完整的自己的变量。

      线程:

      线程是 CPU 利用率的基本单位,由程序计数器、堆栈和一组寄存器组成。 执行线程由计算机程序的一个分支产生两个或多个同时运行的任务。 线程和进程的实现因操作系统而异,但在大多数情况下,线程包含在进程中。多个线程可以存在于同一个进程中并共享内存等资源,而不同的进程不共享这些资源。 同一进程中的线程示例是自动拼写检查和写入时自动保存文件。 线程基本上是在相同内存上下文中运行的进程。 线程可以在执行时共享相同的数据。 Thread Diagram i.e. single thread vs multiple threads

      任务:

      任务是加载到内存中的一组程序指令。

      【讨论】:

      • 进程和线程是相关但相互正交的概念。线程是 CPU 实际运行的;它是关于调度对共享资源(例如 CPU)的访问。进程是为指令和数据分配的内存(进程需要用于代码和数据的内存)。当然,一个进程将需要一个或多个线程 b/c,这实际上是由 CPU 运行的。多线程只是意味着该进程在同一个 CPU 上获得更多时间片或同时在更多 CPU 上运行。将线程视为时间片,将进程视为空间片(在本例中为内存区域)。
      【解决方案4】:

      来自wiki的清晰解释

      1:1(内核级线程)

      用户创建的线程与内核中的可调度实体一一对应。[3]这是最简单的线程实现。 Win32 从一开始就使用了这种方法。在 Linux 上,通常的 C 库实现了这种方法(通过 NPTL 或更旧的 LinuxThreads)。 Solaris、NetBSD 和 FreeBSD 使用相同的方法。

      N:1(用户级线程)

      N:1 模型意味着所有应用程序级线程都映射到单个内核级调度实体;[3] 内核不知道应用程序线程。使用这种方法,上下文切换可以非常快速地完成,此外,它甚至可以在不支持线程的简单内核上实现。然而,主要缺点之一是它无法从多线程处理器或多处理器计算机上的硬件加速中受益:同时调度的线程永远不会超过一个。 [3]例如:如果其中一个线程需要执行一个I/O请求,则整个进程被阻塞,线程优势无法发挥。 GNU 可移植线程使用用户级线程,状态线程也是如此。

      M:N(混合线程)

      M:N 将 M 数量的应用程序线程映射到 N 数量的内核实体,[3] 或“虚拟处理器”。这是内核级(“1:1”)和用户级(“N:1”)线程之间的折衷。一般来说,“M:N”线程系统比内核或用户线程更复杂,因为需要更改内核和用户空间代码。在 M:N 实现中,线程库负责在可用的可调度实体上调度用户线程;这使得线程的上下文切换非常快,因为它避免了系统调用。然而,这增加了复杂性和优先级反转的可能性,以及在用户空间调度程序和内核调度程序之间没有广泛(且昂贵)协调的情况下的次优调度。

      【讨论】:

      • 记住我们用来创建线程的线程库负责进程内部的线程调度。
      【解决方案5】:

      用更简单的术语解释

      进程:进程是一组指令即代码,对相关数据进行操作,进程有自己的各种状态,睡眠、运行、停止等。当程序加载到内存中时,它就成为进程。每个进程在分配 CPU 时至少有一个线程,称为单线程程序。

      线程:线程是进程的一部分。多个线程可以作为进程的一部分存在。线程有自己的程序区和内存区。一个进程内的多个线程不能互相访问数据。进程必须处理线程的同步以实现所需的行为。

      任务:任务不是世界范围内广泛使用的概念。当程序指令被加载到内存中时,人们会调用进程或任务。如今,任务和流程是同义词。

      【讨论】:

      • 我质疑“一个进程内的多个线程不能互相访问数据”这句话的准确性。如果线程有自己的数据,那是出于意图、策略或约定。他们当然可以访问彼此的数据,即使他们不应该访问,而且他们经常有目的地合作处理相同的数据。
      • 一个进程内的多个线程不能互相访问数据。这条线是正确的..?我们知道线程并不独立于其他类似进程,因此线程与其他线程共享它们的代码段、数据段、操作系统资源。
      • 错字。更改为“一个进程内的多个线程可以访问彼此的数据”
      【解决方案6】:

      process 调用或启动程序。它是一个程序实例,可以是多个并运行相同的应用程序。 thread 是进程中的最小执行单元。一个进程可以运行多个线程。线程的执行导致任务。因此,在多线程环境中,会发生多线程。

      正在执行的program 称为process。一个程序可以有任意数量的进程。每个进程都有自己的地址空间。

      线程使用进程的地址空间。线程和进程的区别在于,当 CPU 从一个进程切换到另一个进程时,需要将当前信息保存在 Process Descriptor 中并加载新进程的信息。从一个线程切换到另一个线程很简单。

      task 只是加载到内存中的一组指令。线程本身可以将自己拆分为两个或多个同时运行的任务。

      更多了解参考链接:http://www.careerride.com/os-thread-process-and-task.aspx

      【讨论】:

      • 该链接仅指向一个网站,该网站正在抓取 stackoverflow 并重复此处已发布的答案。如果您不喜欢递归,请不要点击链接。
      【解决方案7】:

      至少,流程或任务需要以下内容:

      在成员线程之间共享

      1.代码或固件,说明 这些在内存中并且有地址 2.代码正在操作的数据 数据从内存开始,可以移动到寄存器中。数据有地址

      每个线程专有

      3.CPU和相关的物理寄存器 4.一个栈 5.状态信息 进程(任务)与线程

      【讨论】:

        猜你喜欢
        • 2021-11-07
        • 1970-01-01
        • 2010-09-17
        相关资源
        最近更新 更多