进程和线程之间的技术区别是什么?
我感觉像“进程”这样的词被过度使用了,而且还有硬件和软件线程。像Erlang这样的语言中的轻量级进程怎么样?是否有明确的理由使用一个术语而不是另一个术语?
进程和线程之间的技术区别是什么?
我感觉像“进程”这样的词被过度使用了,而且还有硬件和软件线程。像Erlang这样的语言中的轻量级进程怎么样?是否有明确的理由使用一个术语而不是另一个术语?
当前回答
将流程视为一个所有权单位或任务所需的资源。进程可以具有内存空间、特定输入/输出、特定文件和优先级等资源。
线程是一个可调度的执行单元,或者简单地说是一系列指令的进程
其他回答
从面试官的角度来看,我基本上只想听到3件主要事情,除了像流程这样的显而易见的事情外,还有多个线程:
线程共享相同的内存空间,这意味着一个线程可以从其他线程的内存访问内存。进程通常不能。资源。资源(内存、句柄、套接字等)在进程终止时释放,而不是线程终止时释放。安全进程具有固定的安全令牌。另一方面,线程可以模拟不同的用户/令牌。
如果你想要更多,Scott Langham的回应几乎涵盖了所有内容。所有这些都是从操作系统的角度来看的。不同的语言可以实现不同的概念,如任务、轻线程等等,但它们只是使用线程(Windows上的光纤)的方式。没有硬件和软件线程。存在硬件和软件异常和中断,或者用户模式和内核线程。
尝试从Linux内核的OS视图回答
程序在启动到内存中时成为一个进程。进程有自己的地址空间,这意味着在内存中有各种段,例如用于存储编译代码的.text segment,用于存储未初始化的静态或全局变量的.bss等。每个进程都有自己的程序计数器和用户空间堆栈。在内核内部,每个进程都有自己的内核堆栈(由于安全问题,它与用户空间堆栈分离)和一个名为task_struct的结构,该结构通常被抽象为进程控制块,存储有关进程的所有信息,例如其优先级、状态(以及大量其他块)。一个进程可以有多个执行线程。
对于线程,它们驻留在一个进程内,并与线程创建过程中可以传递的其他资源(如文件系统资源、共享挂起的信号、共享数据(变量和指令))共享父进程的地址空间,从而使线程轻量级,从而允许更快的上下文切换。在内核内部,每个线程都有自己的内核堆栈以及定义线程的task_struct结构。因此,内核将同一进程的线程视为不同的实体,并且它们本身是可调度的。同一进程中的线程共享一个称为线程组id(tgid)的公共id,它们也有一个名为进程id(pid)的唯一id。
试图回答这个与Java世界相关的问题。
进程是程序的执行,而线程是进程中的单个执行序列。一个进程可以包含多个线程。线程有时被称为轻量级进程。
例如:
示例1:JVM在单个进程中运行,JVM中的线程共享属于该进程的堆。这就是为什么多个线程可以访问同一个对象。线程共享堆并拥有自己的堆栈空间。这就是一个线程对方法及其局部变量的调用如何保持与其他线程的线程安全。但是堆不是线程安全的,必须同步以确保线程安全。
示例2:程序可能无法通过读取击键来绘制图片。该程序必须充分关注键盘输入,而缺乏一次处理多个事件的能力将导致麻烦。这个问题的理想解决方案是同时无缝执行程序的两个或多个部分。线程允许我们这样做。在这里,画图是一个过程,而读取击键是子过程(线程)。
示例1:JVM在单个进程中运行,JVM中的线程共享属于该进程的堆。这就是为什么多个线程可以访问同一个对象。线程共享堆并拥有自己的堆栈空间。这就是一个线程对方法及其局部变量的调用如何保持与其他线程的线程安全。但是堆不是线程安全的,必须同步以确保线程安全。
进程和线程的真实示例这将为您提供有关线程和进程的基本信息
我从Scott Langham的回答中借用了上述信息-谢谢