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

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


当前回答

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

其他回答

流程:

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

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

线程:

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

我已经仔细阅读了几乎所有的答案,唉,作为一名正在修OS课程的本科生,我目前还不能完全理解这两个概念。我的意思是,大多数人都从一些操作系统书籍中读到了不同之处,即线程能够访问事务单元中的全局变量,因为它们利用了进程的地址空间。然而,新的问题出现了,为什么会有进程,我们已经知道线程相对于进程更轻。让我们通过使用从先前答案之一中摘录的图像来浏览以下示例,

我们有3个线程同时处理一个word文档,例如Libre Office。第一种方法通过下划线检查单词是否拼写错误。第二个从键盘上取下并打印字母。最后一个确实会在短时间内保存文档,以免在出现问题时丢失正在处理的文档。在这种情况下,3个线程不能是3个进程,因为它们共享一个公共内存,该内存是它们进程的地址空间,因此所有线程都可以访问正在编辑的文档。因此,道路是文字文档,还有两台推土机,它们是线索,尽管其中一台在图像中缺失。

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

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

关于并发编程的更多解释

流程有一个独立的执行环境。一个进程通常有一套完整的、私有的基本运行时资源;特别是,每个进程都有自己的内存空间。

线程存在于一个进程中-每个进程至少有一个线程。线程共享进程的资源,包括内存和打开的文件。这有助于高效但可能存在问题的沟通。

来源:Java™ 教程:进程和线程

记住普通人的一个例子:

在计算机上,打开Microsoft Word和web浏览器。我们称这两个过程为。

在Microsoft Word中,您键入一些内容,它会自动保存。现在,您已经观察到编辑和保存是并行进行的——在一个线程上编辑,在另一个线程中保存。

到目前为止,我找到的最好答案是Michael Kerrisk的《Linux编程界面》:

在现代UNIX实现中,每个进程可以有多个线程执行。设想线程的一种方式是作为一组进程共享同一虚拟内存以及一系列其他属性。每个线程执行相同的程序代码并共享相同的数据区域和堆。但是,每个线程都有自己的堆栈包含局部变量和函数调用链接信息。[LPI 2.12]

这本书非常清晰;JuliaEvans在本文中提到了它在澄清Linux组真正工作方式方面的帮助。