进程和线程之间的技术区别是什么?

我感觉像“进程”这样的词被过度使用了,而且还有硬件和软件线程。像Erlang这样的语言中的轻量级进程怎么样?是否有明确的理由使用一个术语而不是另一个术语?


当前回答

线程在共享内存空间中运行,但进程在单独的内存空间中线程是一个轻量级进程,但进程是一个重量级进程。线程是进程的一个子类型。

其他回答

我认为理解差异的最简单方法是可视化线程和进程如何执行它们的任务。


线程在共享内存空间(创建它们的进程)中并行运行:

Thread 1              Thread 2              Thread 3
   | 
   | 
   |
                         |
                         |
                                               |
                                               |
                                               |
   |
                         |
                         | 
                         |            
Complete             Complete              Complete

注意:以上可以解释为一个进程(即一个进程有3个线程)


进程并行并行运行:

Process 1              Process 2              Process 3
    |                      |                      |
    |                      |                      |
    |                      |                      |
    |                      |                      |
    |                      |                      |
    |                      |                      |
Complete               Complete               Complete

进程和线程都是独立的执行序列。典型的区别是(同一进程的)线程在共享内存空间中运行,而进程在单独的内存空间中。

我不确定你可能指的是什么“硬件”线程和“软件”线程。线程是一种操作环境特性,而不是CPU特性(尽管CPU通常具有使线程高效的操作)。

Erlang使用术语“进程”,因为它不公开共享内存多道程序模型。称它们为“线程”意味着它们共享内存。

流程:

过程是一个沉重的过程。进程是一个单独的程序,具有单独的内存、数据、资源等。进程是使用fork()方法创建的。进程之间的上下文切换非常耗时。

例子:比如,打开任何浏览器(mozilla、Chrome、IE)。此时,新流程将开始执行。

线程:

线程是轻量级进程。线程被捆绑在进程内部。线程具有共享内存、数据、资源、文件等。线程是使用clone()方法创建的。线程之间的上下文切换不像Process那样耗时。

以下是我从代码项目的一篇文章中得到的内容。我想它清楚地解释了所需的一切。

线程是另一种将工作负载拆分为单独的执行流。线程的重量比进程轻。这这意味着,它提供的灵活性不如全面流程,但可以启动速度更快,因为操作系统设置当程序由两个或多个线程组成时线程共享单个内存空间。进程被赋予单独的地址空间。所有线程共享一个堆。但每个线程都有自己的堆栈。

进程和线程都是独立的执行序列。典型的区别是(同一进程的)线程在共享内存空间中运行,而进程在单独的内存空间中。

过程

是一个正在执行的程序。它具有文本部分,即程序代码、当前活动(由程序计数器的值和处理器寄存器的内容表示)。它还包括包含临时数据(如函数参数、返回地址和局部变量)的进程堆栈和包含全局变量的数据部分。进程还可以包括堆,堆是在进程运行时动态分配的内存。

线

线程是CPU利用率的基本单位;它包括线程ID、程序计数器、寄存器集和堆栈。它与属于同一进程的其他线程共享其代码部分、数据部分和其他操作系统资源,例如打开的文件和信号。

--摘自Galvin的操作系统