最近在看浏览器多进程,JS单线程、浏览器渲染机制等相关知识,(原文:掘金-从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理)觉得还是有必要总结下并行与并发、进程与线程这些知识点。文章大部分来源于《计算机操作系统 第四版》,大学的课本,现在翻翻,太香了。看了网上那么多解释后,还是书上系统的内容更容易接受。
内容速览
进程和并发是现代操作系统中最重要的基本概念,也是操作系统运行的基础。
并发性是指两个或多个事件在同一时间间隔内发生。(个人觉得强调的是有多个事件同时存在)
并行是指两个或多个事件在同一时刻发生。(个人觉得强调的是多个事件同时发生,当有多个处理机的时候能实现)
进程是cpu资源分配的最小单位(是能拥有资源和独立运行的最小单位)
线程是cpu调度的最小单位(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程)
并发与并行
并发是操作系统的一个基本特性,使得OS能有效地提高系统中的资源利用率,增加系统的吞吐量。
并发性是指两个或多个事件在同一时间间隔内发生。(个人觉得强调的是有多个事件同时存在)
并行是指两个或多个事件在同一时刻发生。(个人觉得强调的是多个事件同时发生)
倘若在计算机系统中有多个处理机,那些可以并发执行的程序(即不存在前趋关系)便可被分配到多个处理机上,实现并行执行,即利用每个处理机来处理一个可并发执行的程序。这样,多个程序便可同时执行。(这里埋个点:程序与进程的关系作为进程的下文引入)
在多道程序环境下,并发性是指在一段时间内宏观上有多个程序在同时运行。但是在单处理机系统中,每一时刻只能有一道程序执行,故微观上这些程序只能是分时地交替运行。(这里涉及到的单道批处理系统和多道批处理系统,建议去看看计算机操作系统的发展过程)
进程与线程
推荐博文:阮一峰 进程与线程的一个解释,一个超级形象的图示版,浅显易懂非常推荐。我想更深入了解,还是放了操作系统中进程的概念:
在20世纪60年代中期,人们在设计多道程序OS时,引入了进程的概念,从而解决了在单处理机环境下的程序并发执行问题。之后在长达20年的时间里,在多道程序OS中一直是以进程作为能拥有资源和独立调度(运行)的基本单位的。直到80年代中期,人们又提出了比进程更小的基本单位——线程,试图用它来提高程序并发执行的程度,以进一步改善系统的服务质量。
本质上来说,两个名词都是 CPU 工作时间片的一个描述。进程描述了 CPU 在运行指令及加载和保存上下文所需的时间,放在应用上来说就代表了一个程序。线程是进程中的更小单位,描述了执行一段指令所需的时间。
进程
在多道程序环境下,程序的执行属于并发执行,此时他们将失去其封闭性,并具有间断性,以及其运行结果不可再现性的特征。由此,决定了通常的程序是不能参与并发执行的,否则,程序的运行也就失去了意义。为了能使程序并发执行,并且可以对并发执行的程序加以描述和控制,人们引入了“进程”的概念。
为了使参与并发执行的每个进程(含数据)都能独立地运行,在操作系统中必须为之配置一个专门的数据结构,称为进程控制块(PCB)。系统利用PCB来描述进程的基本情况和活动过程,进而控制和管理进程。这样,由程序段、相关的数据段和PCB三部分便构成了进程实体(又称进程映像)。所谓创建和撤销进程,实质上是创建和撤销进程中的PCB。
所谓进程,它由一组机器指令、数据和堆栈等组成的,是一个能独立运行的活动实体。
1)典型定义:
-
进程是程序的一次执行
-
进程是一个程序及其数据在处理机上顺序执行时所发生的活动
-
进程是具有独立功能的程序在一个数据集合上运行的过程,是系统进行资源分配和调度的一个独立单位。
在引入进程实体的概念后,我们可以把传统OS中的进程定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
2)进程的两个基本属性
-
进程是一个可拥有资源的独立单位,一个进程要能独立运行,它必须有一定的资源,包括用于存放程序正文、数据的磁盘和内存地址空间,以及它在运行时所需要的I/O设备、已打开的文件、信号量等;
-
进程是一个可独立调度和分派的基本单位,保证了其独立运行。每个进程在系统中有唯一的PCB,系统可根据其PCB感知进程的存在,也可根据其PCB中的信息,对进程进行调度,还可将断点信息保存在其PCB中。反之,再利用进程PCB中的信息来回复进程运行的现场。
正是由于进程有这两个基本属性,才能使进程成为一个独立运行的基本单位,从而也就构成了进程并发执行的基础。
3)为使程序能并发执行,系统必须进行一下的一系列操作:
-
创建进程,系统在床架一个进程时,必须为它分配其所必须的、除处理机以外的所有资源,如内存空间、I/O设备,以及建立相应的PCB
-
撤销进程,系统在撤销进程时,又必须先对其所占有的资源执行回收操作,然后再撤销PCB
-
进程切换,对进程进行上下文切换时,需要保留当前进程的CPU环境,设置新选中进程的CPU环境,因而花费不少的处理机时间。
据此可知,由于进程是一个资源的拥有者,因而在创建、撤销和切换中,系统必须为之付出较大的时空开销。这就限制了系统中所设置进程的数目,而进程切换也不宜过于频繁,从而限制了并发程度的进一步提高。那么,如何能使多个程序更好地并发执行,同时又能尽量减少系统的开销?那就需要设法将进程的上述两个属性分开,由OS分开处理,即并不把作为调度和分派的基本单位也同时作为拥有资源的单位,以做到“轻装上阵”;而对于拥有资源的基本单位,又不对之施以频繁的切换。于是,引入了线程
线程
1)调度的基本单位
在引入线程的OS中,已把线程作为调度和分配的基本单位,因而线程是能独立运行的基本单位(注意,脱离了进程的线程谈这句话就是耍流氓)。当线程切换时,仅需保存和设置少量寄存器内容,切换代价远低于进程。
牛客原题:线程是比进程更小的能独立运行的基本单位,这样的说法正确吗? ✖(线程必须依附在进程里,由进程申请cpu才能运行)
2)并发性
一个进程中的多个甚至所有线程之间都可并发执行,使得OS具有更好的并发性。例如,在文字处理器中可以设置三个线程:1.显示文字和图形,2.从键盘读入数据,3.在后台进行拼写和语法检查。又如在网页浏览器中,可以设置一个线程来显示图像或文本,再设置一个线程用于从网络中接收数据。
此外,有的应用程序需要执行多个相似的任务,例如:一个网络服务器经常会接收到许多客户的请求,如果人采用传统的单线程的进程来执行该任务,则每次只能为一个客户服务。但如果在一个进程中可以设置多个线程,将其中一个专用于监听客户的请求,则每当有一个客户请求时,便立即创建一个线程来处理该客户的请求。
3)拥有资源
注意,线程系统中一个可拥有资源的基本单位。但并不拥有系统资源,而是仅有一点必不可少的、能保证独立运行的资源。比如,在每个线程中都应具有一个用于控制线程运行的线程控制块TCB、用于指示被执行指令序列的程序计数器、保留局部变量、少量状态参数和返回地址等的一组寄存器和堆栈。
线程除了拥有自己的少数资源外,还允许多个线程共享该进程锁拥有的资源。表现在:属于同一进程的所有线程都具有相同的地址空间,这意味着,线程可以访问该地址空间中的每一个虚地址;此外,还可以访问进程所拥有的资源,如它申请到的I/O设备等。一个线程的堆栈可以被其它线程读写,甚至完全清除。由一个线程打开的文件可以供其它线程读、写。
4)系统开销
在创建或撤销进程时,系统都要为之分配和回收进程控制块、分配或回收其它资源,如内存空间和I/O设备等。OS为此所付出的开销,明显大于线程创建或撤销时所付出的开销。类似的,在进程切换时,涉及到进程上下文的切换,而线程的切换代价也远低于进程的。此外,由于属于同一进程的所有线程都具有相同的地址空间,线程之间的同步和通信也比进程的简单。
相关链接
阮一峰 进程与线程的一个解释
掘金-从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理