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

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


当前回答

它们几乎一样。。。但关键的区别在于线程是轻量级的,而进程在上下文切换、工作负载等方面是重量级的。

线程是一个子进程,它们共享一个进程内的代码、数据和文件等公共资源。然而,两个进程无法共享资源(例外情况是,如果一个进程(父进程)分叉为另一个进程,则默认情况下,它们可以共享资源。),对CPU的资源要求较高的负载,而线程在此上下文中要轻得多。虽然两者都有相同的功能。场景中,考虑一个单线程进程由于I/o而被阻塞,那么整个1将进入等待状态,但当多线程进程被I/o阻塞时,其唯一的1个I/o相关线程将被阻塞。

其他回答

我从知识探索中复制了这些信息!博客:

流程:程序的执行实例称为进程。一些操作系统使用术语“任务”来指代正在执行的程序。进程总是存储在也称为主存储器或随机存取存储器的主存储器中。因此,流程被称为活动实体。如果重新启动机器,它将消失。多个进程可以与同一程序相关联。在多处理器系统上,可以并行执行多个进程。在单处理器系统上,虽然无法实现真正的并行性,但应用了进程调度算法,处理器计划每次执行一个过程,产生一种错觉并发性。示例:执行“计算器”程序的多个实例。每个实例都称为一个过程。线程:线程是进程的子集。它被称为“轻量级进程”,因为它类似于真实进程,但在进程的上下文中执行并共享内核分配给进程的相同资源。通常,一个进程只有一个控制线程——一次执行一组机器指令。进程也可以由并发执行指令的多个执行线程组成。多个控制线程可以利用多处理器系统上可能的真正并行性。在单处理器系统上,应用线程调度算法,并调度处理器每次运行一个线程。进程中运行的所有线程共享相同的地址空间、文件描述符、堆栈和其他与进程相关的属性。由于进程的线程共享相同的内存,同步进程内共享数据的访问将获得前所未有的效果重要性

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

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

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

http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html

莱纳斯·托瓦尔兹(torvalds@cs.helsinki.fi)1996年8月6日星期二12:47:31+0300(欧洲东部夏令时)邮件排序依据:[date][thread][subject][author]下一条消息:Bernd P.Ziller:“回复:get_hash_table中的错误”上一条消息:Linus Torvalds:“Re:I/O请求排序”1996年8月5日星期一,Peter P.Eiserloh写道:我们需要明确线程的概念。太多人了似乎混淆了线程和进程。以下讨论不反映linux的当前状态,而是试图保持高级别的讨论。不!没有理由认为“线程”和“进程”是独立实体。这是传统的做法,但我我个人认为这样想是一个重大错误。唯一的有理由认为这种方式是历史包袱。线程和进程实际上只是一件事:试图人为地区分不同的案例只是自我限制。一个“执行环境”,这里称为COE,只是一个企业集团该状态包括CPU等状态(寄存器等)、MMU状态(页面映射)、权限状态(uid、gid)和各种“通信状态”(打开文件、信号处理器等)。传统上,“线程”和“进程”主要是指线程具有CPU状态(+可能一些其他最小状态),而所有其他上下文都来自过程然而,这只是一种划分COE总状态的方法,没有任何东西表明这是正确的方法。限制自己对那种形象来说简直是愚蠢至极。Linux对此的思考方式(以及我希望的工作方式)是没有所谓的“进程”或“线程”。有只有整个COE(Linux称为“任务”)。不同的COE可以彼此共享部分上下文共享是传统的“线程”/“进程”设置,但应该真正被视为仅仅是一个子集(它是一个重要的子集,但是这种重要性不是来自设计,而是来自标准:我们显然希望在Linux上运行符合标准的线程程序也是)。简而言之:不要围绕线程/进程的思维方式进行设计。这个内核应该围绕COE的思维方式进行设计,然后pthread库可以将有限的pthread接口导出给用户他们想用这种方式来看待COE。作为一个例子,当你认为COE是与线程/进程相反:您可以执行外部“cd”程序,这在UNIX和/或进程/线程中传统上是不可能的(愚蠢的例子,但想法你可以拥有这些类型的“模块”传统的UNIX/threads设置)。执行以下操作:克隆(clone_VM|clone_FS);child:execve(“外部cd”);/*“execve()”将解除VM的关联,因此使用CLONE_VM是为了更快地进行克隆*/您可以自然地执行“vfork()”(它需要最少的内核支持,但这种支持完全符合CUA的思维方式):克隆(clone_VM);child:继续运行,最终执行()妈妈:等高管您可以执行外部“IO deamons”:克隆(clone_FILES);child:打开文件描述符等妈妈:用孩子打开的fd和vv。以上所有的工作都是因为您没有绑定到线程/进程思维方式。以web服务器为例,其中CGI脚本作为“执行线程”完成。你不能用传统线程,因为传统线程总是必须共享整个地址空间,所以你必须链接所有你曾经希望在web服务器本身(一个“线程”不能运行另一个可执行)。将此视为“执行上下文”问题任务现在可以选择执行外部程序(=将来自父级的地址空间)等,或者他们可以示例与父级共享除文件之外的所有内容描述符(这样子“线程”可以打开大量文件家长需要担心它们:当子“线程”退出,并且不会使用父级中的fd)。例如,设想一个线程化的“inetd”。你想要低开销fork+exec,所以用Linux的方式可以代替使用“fork()”您编写了一个多线程inetd,其中每个线程都是用仅CLONE_VM(共享地址空间,但不共享文件描述符等等)。然后,如果它是外部服务(rlogind,例如),或者可能是内部inetd服务之一(echo,timeofday)在这种情况下,它只是做它自己的事情,然后退出。你不能用“线程”/“进程”这样做。莱纳斯牌手表

进程和线程的真实示例这将为您提供有关线程和进程的基本信息

我从Scott Langham的回答中借用了上述信息-谢谢

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

过程

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

线

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

--摘自Galvin的操作系统