进程和线程之间的技术区别是什么?
我感觉像“进程”这样的词被过度使用了,而且还有硬件和软件线程。像Erlang这样的语言中的轻量级进程怎么样?是否有明确的理由使用一个术语而不是另一个术语?
进程和线程之间的技术区别是什么?
我感觉像“进程”这样的词被过度使用了,而且还有硬件和软件线程。像Erlang这样的语言中的轻量级进程怎么样?是否有明确的理由使用一个术语而不是另一个术语?
当前回答
到目前为止,我找到的最好答案是Michael Kerrisk的《Linux编程界面》:
在现代UNIX实现中,每个进程可以有多个线程执行。设想线程的一种方式是作为一组进程共享同一虚拟内存以及一系列其他属性。每个线程执行相同的程序代码并共享相同的数据区域和堆。但是,每个线程都有自己的堆栈包含局部变量和函数调用链接信息。[LPI 2.12]
这本书非常清晰;JuliaEvans在本文中提到了它在澄清Linux组真正工作方式方面的帮助。
其他回答
在用Python(解释语言)构建包含多线程的算法时,我惊讶地发现,与我之前构建的顺序算法相比,执行时间并没有任何改善。为了理解导致这种结果的原因,我做了一些阅读,并相信我所学到的内容提供了一个有趣的背景,可以更好地理解多线程和多进程之间的差异。
多核系统可能会执行多个线程,因此Python应该支持多线程。但Python不是一种编译语言,而是一种解释语言1。这意味着必须对程序进行解释才能运行,并且在程序开始执行之前,解释器不知道程序。然而,它所知道的是Python的规则,然后动态地应用这些规则。Python中的优化必须主要是解释器本身的优化,而不是要运行的代码。这与C++等编译语言形成对比,并对Python中的多线程产生影响。具体来说,Python使用全局解释器锁来管理多线程。
另一方面,编译语言是编译的。程序被“完全”处理,首先根据其语法定义进行解释,然后映射到语言不可知的中间表示,最后链接到可执行代码中。这个过程允许代码得到高度优化,因为在编译时所有代码都可用。在创建可执行文件时定义了各种程序交互和关系,可以做出关于优化的稳健决策。
在现代环境中,Python的解释器必须允许多线程,这必须既安全又高效。这就是解释语言与编译语言的区别所在。解释器必须不干扰来自不同线程的内部共享数据,同时优化处理器的计算使用。
如前几篇文章所述,进程和线程都是独立的顺序执行,主要区别在于内存在进程的多个线程之间共享,而进程隔离了它们的内存空间。
在Python中,全局解释器锁防止不同线程同时访问数据。它要求在任何Python程序中,任何时候只能执行一个线程。另一方面,可以运行多个进程,因为每个进程的内存都与任何其他进程隔离,并且进程可以在多个内核上运行。
唐纳德·克努思在《计算机编程的艺术:基本算法》中对解释例程有很好的解释。
我从知识探索中复制了这些信息!博客:
流程:程序的执行实例称为进程。一些操作系统使用术语“任务”来指代正在执行的程序。进程总是存储在也称为主存储器或随机存取存储器的主存储器中。因此,流程被称为活动实体。如果重新启动机器,它将消失。多个进程可以与同一程序相关联。在多处理器系统上,可以并行执行多个进程。在单处理器系统上,虽然无法实现真正的并行性,但应用了进程调度算法,处理器计划每次执行一个过程,产生一种错觉并发性。示例:执行“计算器”程序的多个实例。每个实例都称为一个过程。线程:线程是进程的子集。它被称为“轻量级进程”,因为它类似于真实进程,但在进程的上下文中执行并共享内核分配给进程的相同资源。通常,一个进程只有一个控制线程——一次执行一组机器指令。进程也可以由并发执行指令的多个执行线程组成。多个控制线程可以利用多处理器系统上可能的真正并行性。在单处理器系统上,应用线程调度算法,并调度处理器每次运行一个线程。进程中运行的所有线程共享相同的地址空间、文件描述符、堆栈和其他与进程相关的属性。由于进程的线程共享相同的内存,同步进程内共享数据的访问将获得前所未有的效果重要性
我已经仔细阅读了几乎所有的答案,唉,作为一名正在修OS课程的本科生,我目前还不能完全理解这两个概念。我的意思是,大多数人都从一些操作系统书籍中读到了不同之处,即线程能够访问事务单元中的全局变量,因为它们利用了进程的地址空间。然而,新的问题出现了,为什么会有进程,我们已经知道线程相对于进程更轻。让我们通过使用从先前答案之一中摘录的图像来浏览以下示例,
我们有3个线程同时处理一个word文档,例如Libre Office。第一种方法通过下划线检查单词是否拼写错误。第二个从键盘上取下并打印字母。最后一个确实会在短时间内保存文档,以免在出现问题时丢失正在处理的文档。在这种情况下,3个线程不能是3个进程,因为它们共享一个公共内存,该内存是它们进程的地址空间,因此所有线程都可以访问正在编辑的文档。因此,道路是文字文档,还有两台推土机,它们是线索,尽管其中一台在图像中缺失。
进程和线程都是独立的执行序列。典型的区别是(同一进程的)线程在共享内存空间中运行,而进程在单独的内存空间中。
过程
是一个正在执行的程序。它具有文本部分,即程序代码、当前活动(由程序计数器的值和处理器寄存器的内容表示)。它还包括包含临时数据(如函数参数、返回地址和局部变量)的进程堆栈和包含全局变量的数据部分。进程还可以包括堆,堆是在进程运行时动态分配的内存。
线
线程是CPU利用率的基本单位;它包括线程ID、程序计数器、寄存器集和堆栈。它与属于同一进程的其他线程共享其代码部分、数据部分和其他操作系统资源,例如打开的文件和信号。
--摘自Galvin的操作系统
流程:
过程是一个沉重的过程。进程是一个单独的程序,具有单独的内存、数据、资源等。进程是使用fork()方法创建的。进程之间的上下文切换非常耗时。
例子:比如,打开任何浏览器(mozilla、Chrome、IE)。此时,新流程将开始执行。
线程:
线程是轻量级进程。线程被捆绑在进程内部。线程具有共享内存、数据、资源、文件等。线程是使用clone()方法创建的。线程之间的上下文切换不像Process那样耗时。