11.1进程的概念
进程的定义
进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程
精髓:正在执行的程序。
正在计算机上执行的程序实例。
能分配给处理器并由处理器执行的实体。
具有以下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系统资源集。
也可以把进程当成由一组元素组成的实体,进程的两个基本的元素是程序代码(可能被执行相同程序的其他进程共享)和代码相关联的数据集。假设处理器开始执行这个程序代码,且我们把这个执行实体叫做进程。在进程执行时,任意给定一个时间,进程都可以唯一地被表征为以下元素:
标识符:跟这个进程相关的唯一标识符,用来区别其他进程。
状态:如果进程正在执行,那么进程处于运行态。
优先级:相对于其他进程的优先级。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其
他进程共享内存块的指针。
上下文数据:进程执行时处理器的寄存器中的数据。
IO状态信息:包括显式的IO请求、分配给进程的IO设备
(例如磁带驱动器)和被进程使用的文件列表等。
记账信息:可能包括处理器时间总和、使用的时钟数总和、时间限制、记账号等。
进程的组成
进程包含了正在运行的一个程序的所有状态信息
代码数据状态寄存器
CPU状态CR0、指令指针IP
通用寄存器
AX、BX、CX…
进程占用系统资源
打开文件、已分配内存…
以上所有的构成一个进程控制块
进程的特点
动态性
可动态地创建、结束进程
并发性
进程可以被独立调度并占用处理机运行
制约性
因访问共享数据/资源或进程间同步而产生制约
独立性
不同进程的工作不相互影响
进程与程序的联系
■进程是操作系统处于执行状态程序的抽象
程序=文件(静态的可执行文件)
进程=执行中的程序=程序+执行状态
■同一个程序的多次执行过程对应为不同进程
内存:保存代码和数据
CPU:执行指令
■进程执行需要的资源
如命令“ls”的多次执行对应多个进程
进程与程序的区别
■进程是动态的,程序是静态的
程序是有序代码的集合
进程是程序的执行,进程有核心态/用户态
■进程是暂时的,程序的永久的
进程是一个状态变化的过程
程序可长久保存
■进程与程序的组成不同
进程的组成包括程序、数据和进程控制块
11.2进程控制块(PCB,Process Control Block)
操作系统管理控制进程运行所用的信息集合
■操作系统用PCB来描述进程的基本情况以及运行变化的过程(例如ID,哪个程序,进程的状态)
■PCB是进程存在的唯一标志
每个进程都在操作系统中有一个对应的PCB
进程控制块的使用
■进程创建
生成该进程的PCB
■进程终止
回收它的PCB
■进程的组织管理
通过对PCB的组织管理来实现
对进程的所有操作都是通过进程控制块来实现的
进程控制信息
■调度和状态信息
调度进程和处理机使用情况
■进程间通信信息
进程间通信相关的各种标识
■存储管理信息
指向进程映像存储空间数据结构(占了那些内存,打开哪些文件,进程结束后操作系统要对其进行回收)
■进程所用资源
进程使用的系统资源,如打开文件等
■有关数据结构连接信息
与PCB相关的进程队列
程序、数据、栈和属性的集合称为进程映像。
进程控制块的组织
■链表
·同一状态的进程其PCB成一链表,多个状态对应多个不同的链表
各状态的进程形成不同的链表:就绪链表、阻塞链表
■索引表
·同一状态的进程归入一个索引表(由索引指向PCB),多个状态对应多个不同的索引表
各状态的进行形成不同的索引表:就绪索引表、阻塞索引表
注:通过指针指向进程控制块的指针放到索引表内,不同的状态构成不同的索引表
11.3进程状态
一个程序执行,启动过程中就会导致一个新的进程的创建。创建完了之后它就会是程序进入执行的状态,它会占用CPU来执行。在执行的过程当中由于等待某个资源或者等待某个数据而进入等待状态,就导致进程进行等待。一个优先级低的进程正在执行,有一个高优先级的进程等待状态结束,就是它等待的条件已经成熟了,要马上开始投入运行,当前这个进程是会抢先,先进入就绪状态这个进程叫抢先,而当前正在执行这个进程叫做被抢占。处于等待状态的进程会碰到被唤醒的情况,外界条件满足的时候它会被唤醒,唤醒之后又排到这个就绪队列里头,它等待占用CPU来继续执行。那等最后回到CPU上执行,执行到最后的某种状态,整个程序的工作全部执行完,那就有可能进到进程结束的状态,那这时候到达结束。
进程创建
一个程序执行,启动过程中就会导致一个新的进程的创建。
引起进程创建的情况
系统初始化时
用户请求创建一个新进程
正在运行的进程执行了创建进程的系统调用
注:每一个进程有一个进程控制块,这些相关的它要占用内存,把代码和数据都拷进去,这些资源的准备过程,就对应到进程创建
进程执行
创建完了之后它就会是程序进入执行的状态,它会占用CPU来执行。
内核选择一个就绪的进程,让它占用处理机并执行
■如何选择?
根据处理机调度算法来选择,不同的算法特征不一样
进程等待
在执行的过程当中由于等待某个资源或者等待某个数据而进入等待状态,就导致进程进行等待。
■进程进入等待(阻塞)的情况:
请求并等待系统服务,无法马上完成
启动某种操作,无法马上完成(例如读写操作)
需要的数据没有到达
■只有进程自身才能知道何时需要等待某种事件的发生(等待事件的进入一定是正在运行这个进程本身内部的原因所导致的,它不是由于外部原因所导致的)
进程抢占
一个优先级低的进程正在执行,有一个高优先级的进程等待状态结束,就是它等待的条件已经成熟了,要马上开始投入运行,当前这个进程是会抢先,先进入就绪状态这个进程叫抢先,而当前正在执行这个进程叫做被抢占。
■进程会被抢占的情况
高优先级进程就绪
进程执行当前时间用完(操作系统分配的运行时间(时间片)用完了)
进程唤醒
处于等待状态的进程会碰到被唤醒的情况,外界条件满足的时候它会被唤醒,唤醒之后又排到这个就绪队列里头,它等待占用CPU来继续执行。
■唤醒进程的情况:
被阻塞进程需要的资源可被满足
被阻塞进程等待的事件到达
■进程只能被别的进程或操作系统唤醒
进程结束
那等最后回到CPU上执行,执行到最后的某种状态,整个程序的工作全部执行完,那就有可能进到进程结束的状态,那这时候到达结束
■进程结束的情况:
正常退出(自愿的)
错误退出(自愿的)
致命错误(强制性的)
被其他进程所杀(强制性的)
注:要把进程执行所占用的所有资源还给操作系统以便于它能把它分配给
新的进程使用
精髓:导致进程终止的原因
11.4三状态进程模型
进程在整个生命周期分为三种基本状态:就绪,运行,等待。
运行状态(Running)
进程正在处理机上运行
注:一次只有一个进程在处理器上运行。
就绪状态(Ready)
进程获得了除处理机之外的所需资源,得到处理机即可运行。
当进程分配到CPU并执行时,可能发生以下几种事件:
1进程可能发出一个I/O请求,并被放到I/O队列中 .
2进程可能创建一个新的子进程,并等待其结束。
3进程可能会由于中断而强制释放CPU,并被放回到就绪队列中。
等待状态(又称阻塞状态Blocked )
进程正在等待某一事件的出现而暂停运行
创建状态(New)
一个进程正在被创建,还没被转到就绪状态之前的状态
结束状态(Exit)
一个进程正在从系统中消失时的状态,这是因为进程结束或由于其他原因所导致
过程解读
■NULL→创建
一个新进程被产生出来执行一个程序
■创建→就绪
当进程被创建完成并初始化后,一切就绪准备运行时,变为就绪状态
■就绪→运行
处于就绪状态的进程被进程调度程序选中后,就分配到处理机上来运行
■运行→结束
当进程表示它已经完成或者因出错,当前运行进程会由操作系统作结束处理
■运行→就绪
处于运行状态的进程在其运行过程中,由于分配给它的处理机时间片用完而让出处理机
■运行→等待
当进程请求某资源且必须等待时
■等待→就绪
当进程要等待某事件到来时,它从阻塞状态变到就绪状态
11.5挂起进程模型
处在挂起状态的进程映像在磁盘上,目的是减少进程占用内存
挂起状态
■等待挂起状态(Blocked-suspend)
进程在外存并等待某事件的出现
■就绪挂起状态(Ready-suspend)
进程在外存,但只要进入内存,即可运行
注:进不到内存里的原因是内存的空间不够或者说它的优先级不够高
与挂起相关的状态转换
挂起(Suspend):把一个进程从内存转到外存
■等待->等待挂起
没有进程处于就绪状态或就绪进程要求更多内存资源
■就绪->就绪挂起
当有高优先级等待(系统认为会很快就绪的)进程和低优先级就绪进程
■运行->就绪挂起
对抢先式分时系统,当有高优先级等待挂起进程因事件出现而进入就绪挂起
注:比如说有高优先级等待的进程因事件的出现而进入就绪,而这时候呢没有足够的内存空间,就会把当前正在运行的这个进程抢先并且把它变成挂起就绪的状态
与挂起相关的状态转换
在外存时的状态转换
■等待挂起->就绪挂起
当有等待挂起进程因相关事件出现
激活(Activate):把一个进程从外存转到内存
■就绪挂起->就绪
没有就绪进程或挂起就绪进程优先级高于就绪进程
■等待挂起->等待
当一个进程释放足够内存,并有高优先级等待挂起进程
状态队列
■由操作系统来维护一组队列,表示系统中所有进程的当前状态
■不同队列表示不同状态
就绪队列、各种等待队列
■根据进程状态不同,进程PCB加入相应队列
进程状态变化时,它所在的PCB会从一个队列
换到另一个
精髓:挂起的一些总结
挂起态进程的特点:
1)进程不能立即执行。
2)进程可能是或不是正在等待一个事件。如果是,阻塞条件不依赖于挂起条件,阻塞事件 的发生不会使进程立即被执行。
3)为阻止进程执行,可以通过代理把这个进程置于挂起状态,代理可以是进程自己,也可以是父进程或操作系统。
4)除非代理显式地命令系统进行状态转换,否则进程无法从这个状态中转移。
导致挂起的原因
11.6线程的概念
为什么引入线程
每个进程内部它的指令执行是有一个叫指令指针的寄存器来描述当前这个进程执行到什么地方,但是在实际使用的时候,在一个进程内部希望它有更好的并发性,那这就是引入线程的原因。
多线程的解决思路
在进程内部增加一类实体,满足以下特性:
(1)实体之间可以并发执行
(2)实体之间共享相同的地址空间
这种实体就是线程(Thread)
线程的概念
线程是进程的一部分,描述指令流执行状态。它是进程中的指令执行流的最小单元,是CPU调度的基本单位。
■进程的资源分配角色:进程由一组相关资源构成,包括地址空间(代码段、数据段)、打开的文件等各种资源
■线程的处理机调度角色:线程描述在进程资源环境中的指令流执行状态
注:把相关的关于执行流的状态的信息变成是线程控制块,线程控制块也从属于进程控制块,用指针指向它.此时就可以有多个指令指针,多个堆栈和多个CPU里的寄存器的现场保护,这个现场保护是和执行流相关的。
线程是CPU使用的基本单元,它由线程ID,程序计数器、寄存器集合和栈组成。它与属于同一进程的其他线程共享代码段、数据段和其他操作系统资源。
进程和线程的关系
线程= 进程 - 共享资源
线程的优点:
一个进程中可以同时存在多个线程
各个线程之间可以并发地执行
各个线程之间可以共享地址空间和文件等资源
线程的缺点:
一个线程崩溃,会导致其所属进程的所有线程崩溃
不同操作系统对线程的支持
线程与进程的比较
■进程是资源分配单位,线程是CPU调度单位
■进程拥有一个完整的资源平台,而线程只独享指令流执行的必要资源,如寄存■器和栈(相互需要保存的信息就少了,执行就快了)
■线程具有就绪、等待和运行三种基本状态和状态间的转换关系
■线程能减少并发执行的时间和空间开销
线程的创建时间比进程短
线程的终止时间比进程短
同一进程内的线程切换时间比进程短
由于同一进程的各线程间共享内存和文件资源,可不通过内核进行直接通信
11.7用户进程
线程的三种实现方式
■用户线程:在用户空间实现
POSIX Pthreads,Mach C-threads,Solaris threads
■内核线程:在内核中实现
Windows,Solaris,Linux
■轻量级进程:在内核中实现,支持用户线程
Solaris (LightWeight Process)
用户线程
由一组用户级的线程库函数来完成线程的管理,包括线程的创建、终止、同步和调度等
注:线程控制块是在用户态的,由用户应用程序自己来维护
用户线程的特征
■不依赖于操作系统的内核
内核不了解用户线程的存在
可用于不支持线程的多进程操作系统
■在用户空间实现的线程机制
每个进程有私有的线程控制块(TCB)列表
TCB由线程库函数维护
■同一进程内的用户线程切换速度快
无需用户态/核心态切换
■允许每个进程拥有自已的线程调度算法
用户线程的不足
■线程发起系统调用而阻塞时,则整个进程进入等待
■不支持基于线程的处理机抢占
除非当前运行线程主动放弃,它所在进程的其他线程无法抢占CPU
■只能按进程分配CPU时间
多个线程进程中,每个线程的时间片较少
11.8内核线程
由内核通过系统调用实现的线程机制,由内核完成线程的创建、终止和管理
内核线程的特征
■由内核维护PCB和TCB
■线程执行系统调用而被阻塞不影响其他线程
■线程的创建、终止和切换开销相对较大
通过系统调用/内核函数,在内核实现
■以线程为单位进行CPU时间分配
多线程的进程可获得更多CPU时间
精髓:
■主要缺点:在把控制从一个线程传送到同一个进程内的另一个线程时,需要到内核的状态切换。
轻权进程(LightWeight Process)
内核支持的用户线程。一个进程可有一个或多个轻量级进程,每个轻权进程由一个单独的内核线程来支持。(Solaris/Linux)
用户线程与内核线程的对应关系
线程与进程关系组合的其他方案