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

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


当前回答

线程和进程之间的区别?

进程是应用程序的执行实例,线程是进程内的执行路径。此外,一个进程可以包含多个线程。需要注意的是,一个线程可以做一个进程所能做的任何事情。但是,由于一个进程可由多个线程组成,因此可以将一个线程视为“轻量级”进程。因此,线程和进程之间的本质区别在于每个线程用来完成的工作。线程用于小型任务,而进程用于更“重量级”的任务——基本上是应用程序的执行。

线程和进程之间的另一个区别是,同一进程中的线程共享相同的地址空间,而不同的进程不共享。这允许线程读取和写入相同的数据结构和变量,也方便了线程之间的通信。进程之间的通信(也称为IPC或进程间通信)非常困难,而且资源密集。

这里总结了线程和进程之间的区别:

线程比进程更容易创建,因为它们不需要单独的地址空间。多线程需要仔细编程,因为线程共享只能由一个线程修改的数据结构一次。与线程不同,进程不共享相同的地址空间。线程被认为是轻量级的,因为它们使用资源少于流程。流程彼此独立。线程,因为它们共享同一地址空间是相互依赖的,因此请谨慎必须采取措施,以使不同的线程不会相互踩踏。这真的是另一种方式来说明上面的#2。一个进程可以由多个线程组成。

其他回答

每个进程都是一个线程(主线程)。但每个线程都不是一个进程。它是流程的一部分(实体)。

我从知识探索中复制了这些信息!博客:

流程:程序的执行实例称为进程。一些操作系统使用术语“任务”来指代正在执行的程序。进程总是存储在也称为主存储器或随机存取存储器的主存储器中。因此,流程被称为活动实体。如果重新启动机器,它将消失。多个进程可以与同一程序相关联。在多处理器系统上,可以并行执行多个进程。在单处理器系统上,虽然无法实现真正的并行性,但应用了进程调度算法,处理器计划每次执行一个过程,产生一种错觉并发性。示例:执行“计算器”程序的多个实例。每个实例都称为一个过程。线程:线程是进程的子集。它被称为“轻量级进程”,因为它类似于真实进程,但在进程的上下文中执行并共享内核分配给进程的相同资源。通常,一个进程只有一个控制线程——一次执行一组机器指令。进程也可以由并发执行指令的多个执行线程组成。多个控制线程可以利用多处理器系统上可能的真正并行性。在单处理器系统上,应用线程调度算法,并调度处理器每次运行一个线程。进程中运行的所有线程共享相同的地址空间、文件描述符、堆栈和其他与进程相关的属性。由于进程的线程共享相同的内存,同步进程内共享数据的访问将获得前所未有的效果重要性

此信息可在Microsoft了解此处:关于进程和线程

过程每个进程提供执行程序所需的资源。进程具有虚拟地址空间、可执行代码、系统对象的开放句柄、安全上下文、唯一进程标识符、环境变量、优先级类、最小和最大工作集大小以及至少一个执行线程。每个进程都由一个线程启动,通常称为主线程,但可以从其任何线程创建其他线程。线线程是进程中的一个实体,可以被安排执行。进程的所有线程共享其虚拟地址空间和系统资源。此外,每个线程都维护异常处理程序、调度优先级、线程本地存储、唯一的线程标识符以及系统将用于保存线程上下文的一组结构,直到它被调度。线程上下文包括线程的一组机器寄存器、内核堆栈、线程环境块和线程进程地址空间中的用户堆栈。线程也可以有自己的安全上下文,可用于模拟客户端。Microsoft Windows支持抢占式多任务处理,这会产生多个进程同时执行多个线程的效果。在多处理器计算机上,系统可以同时执行计算机上处理器的数量。

尝试从Linux内核的OS视图回答

程序在启动到内存中时成为一个进程。进程有自己的地址空间,这意味着在内存中有各种段,例如用于存储编译代码的.text segment,用于存储未初始化的静态或全局变量的.bss等。每个进程都有自己的程序计数器和用户空间堆栈。在内核内部,每个进程都有自己的内核堆栈(由于安全问题,它与用户空间堆栈分离)和一个名为task_struct的结构,该结构通常被抽象为进程控制块,存储有关进程的所有信息,例如其优先级、状态(以及大量其他块)。一个进程可以有多个执行线程。

对于线程,它们驻留在一个进程内,并与线程创建过程中可以传递的其他资源(如文件系统资源、共享挂起的信号、共享数据(变量和指令))共享父进程的地址空间,从而使线程轻量级,从而允许更快的上下文切换。在内核内部,每个线程都有自己的内核堆栈以及定义线程的task_struct结构。因此,内核将同一进程的线程视为不同的实体,并且它们本身是可调度的。同一进程中的线程共享一个称为线程组id(tgid)的公共id,它们也有一个名为进程id(pid)的唯一id。

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

过程

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

线

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

--摘自Galvin的操作系统