进程和线程之间的技术区别是什么?
我感觉像“进程”这样的词被过度使用了,而且还有硬件和软件线程。像Erlang这样的语言中的轻量级进程怎么样?是否有明确的理由使用一个术语而不是另一个术语?
进程和线程之间的技术区别是什么?
我感觉像“进程”这样的词被过度使用了,而且还有硬件和软件线程。像Erlang这样的语言中的轻量级进程怎么样?是否有明确的理由使用一个术语而不是另一个术语?
当前回答
基本上,线程是进程的一部分,如果没有进程线程就无法工作。线程是轻量级的,而进程是重量级的。进程之间的通信需要一些时间,而线程需要更少的时间。线程可以共享同一个内存区域,而进程则单独存在。
其他回答
尝试从Linux内核的OS视图回答
程序在启动到内存中时成为一个进程。进程有自己的地址空间,这意味着在内存中有各种段,例如用于存储编译代码的.text segment,用于存储未初始化的静态或全局变量的.bss等。每个进程都有自己的程序计数器和用户空间堆栈。在内核内部,每个进程都有自己的内核堆栈(由于安全问题,它与用户空间堆栈分离)和一个名为task_struct的结构,该结构通常被抽象为进程控制块,存储有关进程的所有信息,例如其优先级、状态(以及大量其他块)。一个进程可以有多个执行线程。
对于线程,它们驻留在一个进程内,并与线程创建过程中可以传递的其他资源(如文件系统资源、共享挂起的信号、共享数据(变量和指令))共享父进程的地址空间,从而使线程轻量级,从而允许更快的上下文切换。在内核内部,每个线程都有自己的内核堆栈以及定义线程的task_struct结构。因此,内核将同一进程的线程视为不同的实体,并且它们本身是可调度的。同一进程中的线程共享一个称为线程组id(tgid)的公共id,它们也有一个名为进程id(pid)的唯一id。
它们几乎一样。。。但关键的区别在于线程是轻量级的,而进程在上下文切换、工作负载等方面是重量级的。
线程是一个子进程,它们共享一个进程内的代码、数据和文件等公共资源。然而,两个进程无法共享资源(例外情况是,如果一个进程(父进程)分叉为另一个进程,则默认情况下,它们可以共享资源。),对CPU的资源要求较高的负载,而线程在此上下文中要轻得多。虽然两者都有相同的功能。场景中,考虑一个单线程进程由于I/o而被阻塞,那么整个1将进入等待状态,但当多线程进程被I/o阻塞时,其唯一的1个I/o相关线程将被阻塞。
来自Erlang编程(2009):Erlang并发是快速和可扩展的。它的进程是轻量级的,因为Erlang虚拟机不会为每个创建的进程创建OS线程。它们在VM中创建、调度和处理,与底层操作系统无关。
Erlang实现了一个抢先调度程序,它允许每个进程在一段设定的时间内运行,而不会阻塞系统线程太长时间,这给了每个进程一些执行的cpu时间。如果我没有弄错的话,系统线程的数量取决于内核的数量,如果负载变得不均匀,进程可以从一个线程中删除,然后移动到另一个线程,这都是由Erlang调度程序处理的。
关于并发编程的更多解释
流程有一个独立的执行环境。一个进程通常有一套完整的、私有的基本运行时资源;特别是,每个进程都有自己的内存空间。
线程存在于一个进程中-每个进程至少有一个线程。线程共享进程的资源,包括内存和打开的文件。这有助于高效但可能存在问题的沟通。
来源:Java™ 教程:进程和线程
记住普通人的一个例子:
在计算机上,打开Microsoft Word和web浏览器。我们称这两个过程为。
在Microsoft Word中,您键入一些内容,它会自动保存。现在,您已经观察到编辑和保存是并行进行的——在一个线程上编辑,在另一个线程中保存。
流程:
进程基本上是一个正在执行的程序。它是一个活跃的实体。一些操作系统使用术语“任务”来指代正在执行的程序。进程总是存储在也称为主存储器或随机存取存储器的主存储器中。因此,流程被称为活动实体。如果重新启动机器,它将消失。多个进程可以与同一程序相关联。在多处理器系统上,可以并行执行多个进程。在单处理器系统上,虽然没有实现真正的并行性,但应用了进程调度算法,处理器被调度为每次执行一个进程,从而产生并发的错觉。示例:执行“计算器”程序的多个实例。每个实例都称为一个过程。
线程:
线程是进程的子集。它被称为“轻量级进程”,因为它类似于真实进程,但在进程的上下文中执行,并共享内核分配给进程的相同资源。通常,一个进程只有一个控制线程——一次执行一组机器指令。进程也可以由并发执行指令的多个执行线程组成。多个控制线程可以利用多处理器系统上可能的真正并行性。在单处理器系统上,应用线程调度算法,并调度处理器每次运行一个线程。进程中运行的所有线程共享相同的地址空间、文件描述符、堆栈和其他与进程相关的属性。由于进程的线程共享相同的内存,因此在进程内同步对共享数据的访问变得空前重要。
参考-https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread