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

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


当前回答

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

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

其他回答

流程:

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

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

线程:

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

线程和进程之间的区别?

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

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

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

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

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

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

来自嵌入式世界,我想补充一点,进程的概念只存在于具有MMU(内存管理单元)的“大型”处理器(台式CPU、ARM Cortex A-9)和支持使用MMU的操作系统(如Linux)中。对于小型/老式处理器和微控制器以及小型RTOS操作系统(实时操作系统),如freeRTOS,没有MMU支持,因此没有进程,只有线程。

线程可以访问彼此的内存,并且它们由OS以交错的方式调度,因此它们看起来是并行运行的(或者对于多核线程,它们实际上是并行运行)。

另一方面,进程则生活在由MMU提供和保护的私有虚拟内存沙盒中。这很方便,因为它可以:

防止错误进程导致整个系统崩溃。通过使其他流程数据不可见和无法访问。进程内的实际工作由一个或多个线程负责。

示例1:JVM在单个进程中运行,JVM中的线程共享属于该进程的堆。这就是为什么多个线程可以访问同一个对象。线程共享堆并拥有自己的堆栈空间。这就是一个线程对方法及其局部变量的调用如何保持与其他线程的线程安全。但是堆不是线程安全的,必须同步以确保线程安全。