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

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


当前回答

应用程序由一个或多个进程组成。简单地说,进程是一个正在执行的程序。一个或多个线程在进程上下文中运行。线程是操作系统分配处理器时间的基本单元。一个线程可以执行过程代码的任何部分,包括当前由另一个线程执行的部分。光纤是必须由应用程序手动调度的执行单元。纤维在调度它们的线程的上下文中运行。

从这里偷来的。

其他回答

线程在共享内存空间中运行,但进程在单独的内存空间中线程是一个轻量级进程,但进程是一个重量级进程。线程是进程的一个子类型。

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

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

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

过程

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

线

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

--摘自Galvin的操作系统

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

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

从面试官的角度来看,我基本上只想听到3件主要事情,除了像流程这样的显而易见的事情外,还有多个线程:

线程共享相同的内存空间,这意味着一个线程可以从其他线程的内存访问内存。进程通常不能。资源。资源(内存、句柄、套接字等)在进程终止时释放,而不是线程终止时释放。安全进程具有固定的安全令牌。另一方面,线程可以模拟不同的用户/令牌。

如果你想要更多,Scott Langham的回应几乎涵盖了所有内容。所有这些都是从操作系统的角度来看的。不同的语言可以实现不同的概念,如任务、轻线程等等,但它们只是使用线程(Windows上的光纤)的方式。没有硬件和软件线程。存在硬件和软件异常和中断,或者用户模式和内核线程。