进程、线程管理
1.进程的基本概念
进程是程序的一次执行过程,是OS进行处理机调度和资源分配的基本单位。为有效记录和管理进程,OS为每个进程在系统中设立了一个数据结构—进程控制块(PCB),用它来记录当前系统中的情况和管理进程所需的主要信息。为提高系统内部的并发执行程度,降低并发运行的系统开销,OS又引入了线程概念。
1.1程序执行过程
(1)顺序执行:CPU按程序计数器中的指令地址,顺序执行各条指令。
(2)并发执行:内存中一次装入多道用户程序,以并发执行的方式运行。
1、前趋图
前趋图:描述多个程序(或进程)先后执行顺序的有向无环图。
2.顺序执行及其特征
顺序执行的特征:
(1)顺序性。严格按照程序所规定的顺序执行。
(2)封闭性。程序在封闭环境下运行,独占系统所有资源。程序一旦开始运行,其执行结果不受其它程序和外界因素影响。
(3)可再现性。只要程序执行时的初始条件和执行环境相同,程序重复执行时获得完全相同的结果。
3.并发执行及其特征
并发执行的多个程序之间,存在各种制约关系,产生了如下新特征。
(1)间断性。程序执行过程中,由于等待资源或与其它程序协作,每个程序执行不是“一气呵成”,而是呈现“执行-暂停-执行”的间断性。
(2)失去封闭性。程序并发执行时,多个程序共享资源,系统资源的状态将由多个程序改变,失去了顺序执行的封闭性。
(3)不可再现性。程序并发执行时,由于失去了封闭性,导致其失去可再现性。即使初始条件相同,程序多次执行的结果也可能不同。
(4)相互作用和制约性。并发执行程序之间相互独立;也有时也会直接或间接制约的一面。
例:两个程序共享一个全局变量N,程序A中设N=5;程序B中设N=3,并打印N。
A、B两个程序并发执行,可能出现3种情况:
(1)执行程序A,N=5执行程序B,N=3,打印N,则打印结果为3。
(2)执行程序B中的语句N=3切换执行程序A,N=5执行程序B中的打印N,则打印结果为5。
(3)执行程序B,N=3,打印N 执行程序A,N=5,则打印结果为3。
1.2 进程的定义和特征
1.为何引入进程
为了清晰刻画系统的内在活动规律,有效调度和管理进入内存的程序。
2.进程的定义
程是一个可并发执行的具有独立功能的程序,在某个数据集合的一次执行过程,它是操作系统进行资源分配和保护的基本单位。为更好的描述和管理并发执行的多个进程,OS中为每个进程配置了一个进程控制块PCB(Process Control Block)。
3.进程的构成
(1)独立的用户地址空间:每个进程都是具备代码和数据的一段可执行程序,存放在其独立的地址空间中。该空间由OS在创建进程时分配。
(2)进程控制块:是OS管理进程的重要依据,也是进程的存在标识。PCB包含有进程标识、进程说明、处理机状态、进程控制等信息。进程执行期间所需资源及系统已为其分配的资源,都记录在PCB中。
(3)执行栈区:创建进程时,OS在进程空间中定义一个用户栈,保存该进程运行的现场信息,同时在系统核心空间分配一个核心栈,用来保存中断/陷入点现场等信息。
4.进程的上下文
进程的物理实体和支持进程运行的环境,称为进程上下文(Process Context)。进程上下文包括:
1.用户级上下文:由进程的用户地址空间、执行栈区、共享存储区组成,其在编译目标文件时生成;
2.系统级上下文:是由PCB、内存管理信息、进程环境块、系统堆栈组成的进程地址空间;
3.寄存器上下文:由程序状态、各类控制、地址、通用寄存器以及用户栈指针组成。
当一个进程被系统调度而获得CPU时,发生进程切换,切换内容主要是切换进程上下文。
5.进程的特征
(1)动态性 (2)共享性 (3)并发性
(4)独立性 (5)异步性
在没有引入线程技术的系统中,进程是CPU调度的基本单位;引入线程后,线程是调度的基本单位,但进程仍是其它系统资源分配的基本单位。
6.进程和程序的区别
① 进程是动态概念,程序是静态概念。
②进程和程序之间是多对多的关系。一个程序可被多个进程共用,一个进程在其活动中又可调用若干个程序。
1.3 进程状态和进程转换
1. 进程的三种基本状态及其转换
(1)就绪状态:进程获得了除CPU以外的所有必要资源,只要再获得CPU便可立即执行。系统中处于就绪状态的进程可以有多个,通常按某种调度策略把它们排成就绪队列。
(2)执行状态:进程获得CPU并正在运行,则处于执行状态。单处理机系统中,只能有一个进程处于执行状态。N处理器系统中,要有不多于N个进程处于执行状态。
(3)阻塞状态:正在执行的进程,由于发生某事件而暂停执行,如:请求I/O、申请缓冲空间,此时它不参与CPU竞争。处于阻塞状态的进程,可有多个,通常排成阻塞队列。
进程创建初始时处于就绪状态->调试程序为它分配CPU后,它进行执行状态
它的CPU时间片用完或被高优先级进程剥夺后,则晢停执行,转为就绪状态
若出现阻塞事件,则它主动调用阻塞原语将自己阻塞,转为阻塞状态。当事件解除,满足某种条件后,则由OS唤醒,之后进入就绪状态(不能直接转为执行状态)。
例题:
在一个只有单处理机(不考虑多核)的操作系统中,进程有运行、就绪、阻塞三个基本状态。假如某时刻该系统中有10个进程并发执行,且CPU为非核心态情况下,试问:
(1)这时刻系统中处于运行状态的进程数最多有几个?最少有几个?
(2)这时刻系统中处于就绪状态的进程数最多有几个?最少有几个?
(3)这时刻系统中处于阻塞状态的进程数最多有几个?最少有几个?
(1)最多只有1个,最少可能有0个。
(2)最多只有9个,因为一旦CPU有空,调度程序马上调度;最少为0个,1个进程运行,9个进程阻塞。
(3)最多有10个,阻塞状态的进程数最少是0个。
2.创建状态和终止状态
(1)创建状态
进程拥有者申请PCB,并在其中填写管理和控制信息由OS为该进程分配各种资源资源分配成功,则OS将该进程插入到就绪队列中。
(2)终止状态
一个进程正常结束、因错误无法运行、被OS/其他进程终止时,它将进入终止状态并被系统收回所占用的资源。终止后,该进行会在OS中保留一个记录,保存进程的状态码和 些统计数据,共其他进程收集。
记录信息被OS/其他信息读取后,该进程的PCB被OS置成空闲态并返回系统,此时该进程被彻底销毁。
3.挂起操作
进程被挂起后,处于静止状态。如进程正在执行,挂起后晢停执行,变为静止就绪状态;如原本处于就绪状态,进程将对换到外存,变为静止就绪状态;如进程处于阻塞状态,进程将对换到外存,变为静止阻塞状态。
活动就绪到静止就绪:执行挂起操作;
静止就绪到活动就绪:执行**操作;
活动阻塞到静止阻塞:执行挂起操作;
静止阻塞到活动阻塞:执行**操作;
静止阻塞到静止就绪:释放,引起阻塞事件的完成;
活动阻塞到活动就绪:释放,引起阻塞事件的完成;
执行到活动就绪:CPU时间片用完;
执行到静止就绪:执行挂起操作;
执行到活动阻塞:发生某些事件(请求I/O),进程无法继续执行。
活动就绪到执行:进程调度。
1.4 进程控制块及其组织方式
1.进程控制块的作用
(1)PCB是进程在系统中存在的唯一标识。
(2)保存CPU现场信息:进程因阻塞晢停执行时,PCB中保存CPU现场信息,供它再次被调度时恢复现场。
(3)提供进程管理所需信息:进程访问文件或I/O设备、程序及数据的内存或外存地址、进程运行所需资源等信息。
(4)提供进程调度所需信息:该进程状态、优先级、等待时间、已执行时间等信息。
(5)实现与其它进程的同步和通信。
PCB几乎被OS的所有模块访问和修改,如进程调度、资源分配、中断处理、性能监督分析等。
2.进程控制块的信息
(1)进程标识信息。
外部标识符:由进程创建提供,方便用户对进程访问,由字母和数字组成。
内部标识符:由OS设置的、唯一的数字形式的系统内码,即进程号。
为描述进程家庭关系,还设置有父进程标识、子进程标识;为标识拥有该进程的用户,还设置的用户标识。
(2)进程说明信息。
进程状态:进程当前状态和执行情况,如阻塞原因等。
存储管理信息:进程程序和数据的内存/外存信息。
进程所用资源列表;
链接信息:OS通常按状态或优先级,把进程链接到一个进程队列中,PCB中保存这些队列的头指针,以满足OS处理同类进程时的访问请求。
(3)处理机状态信息。
用于记录处理机中各寄存器的内容,这些内容反映了进程在CPU中运行时的情况。当进程被中断或异常打断时,需将各寄存器的内容保存在PCB中,以便进程重新执行时恢复现场。
(4)进程的控制信息。
进程调度信息;
进程通信机制。
3.进程控制块的组织方式
(1)线性方式:无论进程状态如何,将所有PCB连续存放在内存系统区中,组织成一个线性表,并将表的首地址放在内存的一个专用区域内。适用于系统中进程数目不多的情况。
(2)链接方式:通过PCB中的链接字,将具有相同状态进程的PCB链接成队列,从而形成PCB的就绪队列、阻塞队列、空闲队列等。
(3)索引方式
系统分别建立PCB的就绪索引表和阻塞索引表,状态相同进程的PCB组织在同一张索引表中,索引表的表目中存入PCB在PCB表中的地址,OS通过索引表来管理系统中的进程。
2.进程控制
进程由创建而产生、由调度而执行、由撤销而消亡。操作系统对进程生命周期中各个环节,均能进行控制。
进程控制主要职责:
对系统中的全部进程实施有效管理,包括:进程创建、进程执行、进程撤销、进程阻塞、进程唤醒、进程状态转换等。
OS通过执行各种原语,来实现进程控制。原语是由若干条机器指令组成、用于完成一定功能的一个过程。
原语具有不可分割性,其执行期间不允许被中断,要么从头到尾执行一遍,要么根本不执行。
原语常驻内存,只在核心态下运行,并以系统调用方式提供原语接口。原语在执行过程中,采用屏蔽中断的方式,来保证其不被中断。
内核用于控制的原语有以下6种:创建原语、撤销原语、阻塞原语、唤醒原语、挂起原语、**原语。
2.1 进程创建
OS提供了创建进程的系统调用—创建原语,用户进程可通通过创建原语,创建新进程。当一个进程创建另一个进程时,前者叫父进程,后者叫子进程。子进程又可创建其子进程,从而形成进程之间形成家族树。
子进程继承父进程所拥有的资源。当子进程撤消时,应将从父进程继承来的资源还给父进程。父进程撤消时,也须同时撤消共所有的子进程。
1.引起进程创建的事件
① 操作系统初始化。当操作系统启动时,通常会创建若干进程,特别是一些常驻系统进程。
② 作业调度。在多道批处理系统中,当作业调度程序选中某个作业时,将其装入内存,为其创建进程,并把创建好的进程插入到就绪进程队列。
③ 提供服务。当某一进程向OS提出某种服务请求时,系统将专门创建一个进程来提供其所要求的服务。
④ 应用请求。当用户向OS提出某种应用请求时,OS为其创建新进程。
2、进程的创建过程
操作系统主要完成:
(1)接收父进程传来的参数(新建进程各种初始值、初始执行程序描述等);
(2)申请空白PCB;
(3)为新进程分配内存空间等资源,若程序或数据不在内存中则从外存调入内存;
(4)初始化PCB中的信息;
(5)将新进程设置为就绪状态;
(6)新PCB表挂入就绪队列,等待调度程序选中执行。
进程派生出了进程后,有两种执行方式:
父进程和子进程并发(交替)执行;
父进程阻塞,等待其子进程执行完毕后才执行。
子进程的地址空间,有两种形式:
子进程复制父进程地址空间,二者地址空间相同;
子进程具有自己执行程序,用它替代父进程地址空间中的内容。
2.2 进程执行与进程切换
创建进程时,操作系统为它的运行,准备了初始现场并保存到相应栈中。若进程被选中执行,调度程序会马上把栈中存放的初始现场信息,恢复到CPU各寄存器中,进程会运行创建进程时所指定的程序。该指定的运行程序,是由进程在用户模式下运行的。
如果进程在运行程序过程中发生了中断或陷入,进程会转入执行OS的内核程序。进程运行系统内核程序时,系统要保存被中断进程的运行现场,包括:所有处理机状态、现场信息等,并保证用户程序所使用的用户栈不被内核程序使用。OS会为内核程序分配核心栈空间,这样,当核心程序调用子程序或被中断时可利用核心栈保存现场。
系统进行进程切换时,通常进行如下工作:
① 保存被中断进程的处理器现场信息;
② 修改当前运行进程的PCB,将运行状态改为其他状态,并把它插入到相应的PCB队列;
③ 选择另一个进程运行,并修改该进程的PCB,使其状态变为运行态;
④ 将当前进程的存储管理数据,修改为新选进程的存储管理数据;
⑤ 恢复被选进程上次切换出处理机时的处理机现场,开始运行该进程。
2.3 进程的阻塞与唤醒
进程阻塞与唤醒,分别用阻塞原语和唤醒原语实现。阻塞原语将进程由执行状态转换为阻塞状态,唤醒原语将进程由阻塞状态转换为就绪状态 。
1.引起进程阻塞的事件
请求系统服务;
启动某种操作;
新数据尚未到达;
无新工作可做。
2.进程的阻塞过程
若该进程处于运行态,先立即停止该进程执行,并保存现场信息到其PCB中;
把PCB中的进程状态由运行态改为阻塞态,并将其PCB挂入阻塞队列;
最后系统执行调度程序,将CPU分配给另一个就绪的进程。
3.进程的唤醒过程
当阻塞进程期待的事件发生时,会产生相应的中断。在OS控制下,阻塞进程被唤醒,把该进程从阻塞队列中移出,将其改为就绪态并把其PCB插入到就绪队列中,等待调试执行。
2.4 进程挂起与**
进程挂起过程:先检查被挂起进程的状态,将其从相应队列中移出;若该进程处于活动就绪状态,将其改为静止就绪状态;若该进程处于活动阻塞状态,将其改为静止阻塞状态;若该进程处于执行状态,将其改为静止就绪,并转向调度程序重新调度另一处于活动就绪状态的进程。
当系统中发生**进程的事件时,操作系统将使用**原语,将指定挂起进程**。
进程**过程:先将欲**的挂起进程从外存调入到内存;检查该进程的状态,若是静止阻塞状态则改为活动阻塞状态,若是静止就绪状态则改为活动就绪状态,将修改后进程的PCB插入到相应的PCB队列中。
阻塞原语和唤醒原语是一对功能相反的原语。如某进程调用了阻塞原语,则必有一个与之对应的相关进程,调用唤醒原语,来唤醒被阻塞的进程。否则,被阻塞进程将因不能被唤醒,而一直处于阻塞状态,不能被执行。 (在进程同步中经常出现)
2.5 进程撤销
1.引起进程撤销的事件
进程正常/异常结束;
进程等待时间,超过了系统设置的最长等待时间;
出现了严重的I/O故障;
外界干预。
2.进程的撤销过程
3.线程
1980中后期,为进一步提高程序并行度和资源利用率,提出了线程(Thread),线程也叫轻型进程。在引入进程的OS中,一个进程内部可包含多个并发执行的线程,线程成为CPU调度的基本单位,进程只做为其他系统资源分配的基本单位。
1990年后,在DBMS及高级语言(如JAVA)中,也引入了多线程技术。
3.1 线程的局限性
① 每个进程都有一个PCB和一个私有用户地址空间,如按进程进行并发控制,则在同一个地址空间中,只允许单个执行序列运行。
② 一个进程内只有一个执行序列,不能满足用户让一个进程内部并发执行多个任务的要求。
③ 进程在CPU上频繁切换,给系统造成大量时空开销,限制了系统中并发执行进程的数目。
④ 进程通信代价大。进程间传递信息时,要把消息从一个进程的工作区,传送到另一个进程的工作区,这需要操作系统提供进程通信机制并给编程者带来负担。
⑤ 不适合并行计算和分布并行计算的要求。
3.2 线程及其属性
1.线程定义
1.线程是进程内的一个执行单元。
2.线程是进程内的一个可调度实体。
3.线程是进程中相对独立的一个控制流序列 。
综合:线程是进程内部一个相对独立的、具有可调度特性的执行单元。
同一进程的所有线程共享所在进程的地址空间和全部资源,但线程间都相对独立的并发执行,所以每个线程都有自己的运行状态、保存执行信息的用户栈和核心栈、静态局部变量、保存线程上下文的控制块等。
每个线程都有一个线程控制块TCB,用于保存线程的私有信息,主要包括:(1)线程标识符;(2)描述CPU状态的一组寄存器。(3)栈指针。每个线程都有用户栈和核心栈,用于保存线程执行过程中的信息。
2.线程属性
① 轻型实体。除了运行中必不可少的资源(如线程控制块、用户栈、核心栈、静态局部变量)外,基本不拥有系统资源。
② 独立调度单位。线程是能独立运行的基本单位,也是独立调度单位。为此,线程中必须包含调度所必需的信息。
③ 可并发执行。同一个进程中的多个线程、以及不同进程中的多个线程,均可以并发执行。
④ 共享进程资源。同一个进程中的各线程共享该进程所拥有的全部资源,如进程的地址空间、己打开的文件、定时器和信号量机构等。
3.线程与进程
3.3 线程状态与控制
1.线程是进程的一个执行体,是系统进行调度的独立单位,它本身是一个动态过程。因此,线程也有生命周期,即:由创建而产生,由调度而执行,由撤销而消亡。
2.每个线程被创建后,便可与其它线程一起并发运行。并发运行的线程间,也存在共享资源、相互合作的制约关系,致使线程在运行时,也具有间断性。
3.与进程类似,线程具有就绪、执行和阻塞三种基本状态,线程随自身运行和外界环境的变换,而不断在三种状态之间转换。
4.线程执行完后正常终止,也可能因出现错误或其它原因被强行终止。
3.4 线程间同步和通信机制
1.互斥锁
在线程运行时,为避免对共享资源的交替使用,可使用互斥锁进行管理。当某线程希望其它线程在其运行期间,不对共享资源进行修改访问时,可对该资源设定互斥锁。
操作互斥锁的时间、空间都较低,适合高频度使用的关键共享数据和程序段。
可对它进行开锁(lock)、关锁(unlock)两种操作。由于以上特点,它使得多线程串行执行,降低了系统的并发程度。
2.条件变量
利用互斥锁来实现互斥访问,可能会因线程互相等待对方释放资源而引起死锁。条件变量可解决此类问题,但条件变量必须和互斥锁配合起来使用。
当定义一个条件变量时,系统同时建立一个相应的等待队列。单纯的互斥锁用于短期锁定,主要用来保证对临界区的互斥进入;条件变量则用于线程长期等待,直至所等待的资源成为可用。
-
利用互斥锁+条件变量对资源R进行访问时,线程首先对互斥锁执行关锁操作,若成功便进入临界区,然后查找描述资源状态的数据结构。
-
若发现资源R处于忙碌状态,则执行条件变量的wait操作,将线程加入到该条件变量的等待队列中,并对互斥锁执行开锁操作;
-
若资源R处于空闲状态,表明该线程可使用资源,于是将该资源设置为忙碌状态,再对互斥锁执行开锁操作;
-
该线程使用资源R完毕后,释放该资源,用wakeup操作唤醒在指定条件变量上等待的另一线程。
3.信号量机制
信号量机制也可用于实现线程间的同步,线程使用的信号量可分为两类:
① 私用信号量
当某线程实现同一进程中各线程间同步时,可调用创建信号量命令,来创建一私用信号量,其数据结构存放在应用程序地址空间中。私用信号量属特定进程所有,OS并不知道私用信号量的存在。
一旦发生私用信号量占用者异常或正常结束,但并未释放该信号量所占有空间的情况时,OS将无法使它恢复为0(空),也不能将它传送给下一个请求它的线程。
② 公用信号量
公用信号量可实现不同进程中各线程之间的同步。它有一个公开的名字,供所有进程中的线程使用。公用信号量的数据结构存放在受保护的系统存储区中,由OS为它分配空间并进行管理。如公用信号量的占有者在结束时未释放,OS自动将该信号量空间回收,并通知下一线程。
3.5 线程的实现
不同系统实现线程的方式不相同。线程类别:内核级线程、用户级线程。
1.内核级线程(KLT)
由内核负责线程的创建、撤消、切换等操作,并在内核空间为每个KLT设置 个线程控制块TCB。内核根据TCB感知KLT的存在,并对它进行管理。所有对线程的操作,都通过系统调用,由内核中相应程序完成。
2.用户级线程(ULT)
ULT仅存在于用户空间中,与内核无关。线程的创建、撤消、切换、同步、通信等操作,无需系统调用实现。内核只是管理进程,不会感知ULT的存在。线程的TCB设置在用户空间中,对线程的所有操作,也在用户空间中,由线程库中的函数完成。
3.混合方式
两种线程同时存在,并可建立对应关系,从而使得同一进程中的多个线程,可同时在多个处理器上运行。此外,一个线程阻塞,不会使整个进程的所有线程阻塞,只需切换到其它线程执行即可。
3.6 多线程模型
不同操作系统中,实现ULT-KLT的连接,有3种模型。
1.一对一:每个ULT设置一个KLT与之连接,在多处理机系统中可多个线程同时执行,系统并发程度高但系统开销大。
2.多对一:一个KLT管理属于同一进程的多个线程。系统开销小但多个线程不能在并行的在多处理机上运行。
3.多对多:集合了以上两种方式的优点。打破了前两种方式对用户级线程数量的限制,并使多个用户线程真正意义上并发执行。
4 Linux进程管理概述
4.1 Linux中的进程及其进程控制块
Linux中的进程可以分为三种类型:
(1)交互式进程。由shell控制运行,既可以在前台运行,也可以在后台运行。
(2)批处理进程。运行于后台,不属于某个终端。先被提交到一个队列,以便顺序执行。
(3)守护进程。只有在需要时才被唤醒执行,且在后台运行。
task_struct结构的组成主要包含以下几个部分:
进程状态信息
进程标示信息
进程调度信息
进程通信信息
进程链接信息
时间和定时器信息
打开的文件以及文件系统信息
内存管理信息
处理器信息
4.2 Linux中的进程控制
进程的创建
fork系统调用用于从已存在进程中创建一个新进程,新进程称为子进程,而原进程称为父进程。fork调用一次,返回两次,在父进程中的返回值是子进程的进程号,在子进程中的返回值则返回0。因此,可以通过返回值来判定该进程是父进程还是子进程。
假设id=fork(),父进程进行fork系统调用时,fork所做工作如下。
①为新进程分配task_struct任务结构体内存空间。
②把父进程task_struct任务结构体复制到子进程task_struct任务结构体。
③为新进程在其内存上建立内核堆栈。
④对子进程task_struct任务结构体中部分变量进行初始化设置。
⑤把父进程的有关信息复制给子进程,建立共享关系。
⑥把子进程加入到可运行队列中。
⑦结束fork()函数,返回子进程ID值给父进程中栈段变量id。
⑧当子进程开始运行时,操作系统返回0给子进程中的栈段变量id。
进程的撤销
当Linux的进程执行完毕正常结束,或当进程受某种信号(如SIGKILL)的作用时,进程要被系统撤销。
进程自身只能释放那些外部资源,如内存、文件,但进程本身的task_struct结构无法释放,只能由进程的父进程或内核初始进程(如果父进程已经死掉)调用exit()来释放。
进程被撤销时,一方面要回收进程所占的资源,另一方面还必须通知其父进程,让父进程“料理后事”,包括将进程从进程树中删除。
4.3 Linux中的线程
1.早期的Linux版本不支持线程,只提供传统的fork()系统调用,用来产生一个新的进程。随着内核版本的更新,内核中开始加入了新的系统调用vfork()和clone()。Linux2.4.0已经能够支持POSIX标准线程。
2.Linux支持内核级的多线程。Linux将线程定义为“执行上下文”,是进程上下文的一部分。Linux可以通过复制(clone)当前进程的属性创建一个子进程,子进程可以共享父进程的文件、信号处理程序和虚拟内存等资源。
3.当子进程共享父进程的虚拟内存空间时,该子进程就是一个线程。
- Linux系统中创建线程与创建进程不同的是,除了task_struct和系统空间堆栈以外的全部或部分资源通过数据结构指针的复制“遗传”。新创建的线程共享父进程的存储空间、文件描述符和软中断处理程序。
- Linux在调度上不区分进程和线程。但线程切换时的“执行上下文”比进程切换时的“执行上下文”要少很多信息,只包含少量寄存器的内容和属于线程自身的堆栈指针等。
- 严格意义上讲,Linux内核的调度单位仍然是进程,在此基础上进行线程切换执行,从而提高系统并发度和系统资源使用效率。