2.1 前驱图和程序执行
2.1.1 前驱图
- 前驱图是指一个有向无循环图可记为DAG
- 前驱图用于描述进程之间执行的先后顺序。
- 前驱图的每个节点用来表示一个进程或程序段乃至一条语句节点间的有向边表示两个节点之间存在的偏序或前驱关系。
- 进程或程序之间的前驱关系可用→来表示。
- 如果进程Pi和Pj存在前驱关系,可表示为(Pi,Pj)∈→,也可写成Pi→Pj,表示Pj开始执行之前Pi必须完成。Pj是Pif的直接前驱,Pi是Pj的直接后继。
- 没有前驱的节点称为初始节点,没有后继的节点称为终止节点。
- 每个节点还具有一个重量用于表示该节点所含有的程序量或程序的执行时间。
- 前趋图中不允许有循环,否则会产生不可实现的前驱关系。
2.1.2 程序顺序执行
- 程序顺序执行的特征
- 顺序性,处理机严格的按照程序所规定的顺序执行。
- 封闭性,程序在封闭的环境下运行,程序运行时独占全机资源,资源的状态资由本程序才能改变,程序一旦开始执行,其执行结果不受外界因素影响。
- 可再现性,只要程序执行时的环境和初始条件相同,当程序重复执行时会获得相同的结果。
2.1.3 程序并发执行。
- 系统中引入多道程序技术,使程序或程序段能并发执行,提高系统资源利用率和系统吞吐量。
- 只有不存在前驱关系的程序之间才有可能并发执行,否则无法并发执行。
- 程序并发执行时的特征。
- 间断性,程序在并发执行时,由于他们共享系统资源,这些并发执行的程序之间形成相互制约的关系,导致程序运行走走停停。
- 失去封闭性,系统中的各种资源将被并发执行的程序所共享,这些资源的状态也由这些程序来改变。每一个程序运行时,运行环境会受到其他程序的影响。程序运行环境不在独享,会被其他程序影响。
- 不可在现性,程序并发执行时由于失去了封闭性,导致其失去可再现性。程序的运行结果会受到其他程序的影响。要程序的运行结果可在现,要对进程执行加以控制。共享资源加互斥锁
2.2 进程的描述
2.2.1 进程的定义与特征
- 为了使参与并发执行的每个程序都能独立运行,设置了专门的数据结构,称为进程控制块PCB。利用进程控制快来描述进程的基本情况和活动过程,进而控制和管理进程。
- 进程实体,由程序段,相关数据段和进程控制块组成。
- 进程实体简称为进程。
- 创建进程实际上是创建进程实体中的PCB。撤销进程实际上是撤销进程的进程控制块。
- 进程的定义
- 进程是程序的执行过程,是系统进行资源分配和调度的独立单位。
- 进程的特征
- 动态性
- 进程的实质是进程实体的执行过程,动态性是进程最基本的特征。
- 进程实体具有一定的生命期,程序是静态的。进程与程序的区别。
- 并发性
- 多个进程实体同存于内存中,且能在一段时间内同时运行。
- 引入进程的目的也是为了使进程实体能和其他进程实体并发执行。
- 独立性
- 独立性是指进程实体是一个能独立运行,独立获得资源和独立接受调度的基本单位。
- 异步性
- 是指进程是按一步方式运行的,按各自独立,不可预知的速度向前推进。
- 并发执行的程序运行过程总是走走停停。会产生结果的不可再现性。
- 动态性
2.2.2 进程的基本状态及转换
- 进程的三种基本状态
- 就绪状态
- 进程已处于准备好运行的状态,进程已分配到除CPU以外的所有必要资源后,只要在获得CPU便可立即执行。
- 执行状态
- 进程已获得CPU,其程序正在执行的状态。
- 阻塞状态
- 只正在执行的进程,由于发生某事件暂时无法继续执行时的状态。进程的执行受到阻塞。
- 就绪状态
- 创建状态和终止状态。
- 创建状态
- 创建进程时,所需资源不能完全被满足。如果可以完全被满足,则直接进入就绪状态。
- 创建进程:首先由进程申请一个空白的PCB,向PCB中填写用于控制和管理进程的信息,然后为该进程分配运行时所需的资源,最后把进程转入就绪状态并插入就绪队列中。
- 如果进程所需的资源不能得到满足,创建进程的工作未完成,进程不能被调度运行,此时进程所处的状态为创建状态。
- 当进程获得了所需的资源以及对其PCB的初始工作完成后,便可由创建状态转入就绪状态。
- 终止状态
- 进程的终止:等待操作系统进行善后处理,然后将PCB清零,并将PCB空间归还系统。
- 进入终止状态的情况
- 进程到达自然结束点。
- 进程出现无法克服的错误。
- 进程被操作系统终结。
- 进程被其他有终止权的进程终结。
- 创建状态
2.2.3 挂起操作和进程状态的转换
- 为了系统和用户和分析进程的需要,还引入了一个对进程的重要操作,挂起操作。
- 与挂起操作对应的操作为激活操作。
- 引入挂起操作的原因是基于系统和用户如下的需要
- 终端用户的需要,当终端用户在自己的程序运行期间发现有可疑的问题,希望暂停程序的运行。
- 父进程希望挂起自己的某个子进程,以便考察和修改子进程或协调各子进程间的活动。
- 系统需要把一些不重要的进程挂起。实现负荷调节,保证系统的正常运行。
- 操作系统挂起某些进程,以便检查运行中的资源使用情况或进行记账。
- 引入挂起原语操作后的三个进程状态的转换
- 当进程未处于被挂起的就绪状态,为活动就绪状态。此进程可以接受调度。
- 当进程被挂起后,该进程处于静止就绪状态。此进程不可被调度。
- 当进程处于未被挂起的阻塞状态为活动阻塞状态
- 当进程处于被挂起的主色状态为静止阻塞状态。处于该状态的进程在其所期待的事件出现后,从静止阻塞变为静止就绪。
- 创建进程时,进程所需的资源不满足,进入静止就绪状态。
- 创建进程时,进程所需的资源能够被满足进入活动就绪状态。
2.2.4 进程管理中的数据结构
- 操作系统中用于管理资源和控制进程的数据结构
- 在计算机操作系统中,对于每个资源和每个进程都设置了一个数据结构用于表征其实体称之为资源信息表或进程信息表。其中包含了资源或进程的标识,描述状态等信息,以及一批指针。
- 主要分为四类。
- 内存表
- 设备表
- 文件表
- 用于进程管理的进程表。进程表又称为进程控制块PCB,多个PCB组成
- 进程控制块的作用
- 进程控制块作为进程实体的一部分,记录了操作系统所需的用于描述进程当前情况以及管理进程运行的全部信息,是操作系统中最重要的记录型数据结构。
- 进程控制块的作用
- 作为独立运行基本单位的标志。系统通过进程控制快感知进程的存在与进程状态的改变。
- 能实现间断运行方式。程序阻塞时,系统可以将程序运行的现场信息保存在进程控制块中,当阻塞结束后,通过进程控制快恢复现场,以便程序继续运行。
- 提供进程管理所需要的信息。根据进程控制块中记录程序和数据在内存或外存中的起始地址指针,可以找到相应的程序和数据。
- 提供进程调度所需的信息。在进程控制块中计入了进程处于何种状态,以及进程的优先级,进程的等待时间和已执行时间等。
- 实现与其他进程的同步和通信。在进程控制块中记录了用于实现进程通信的区域或通信队列指针。
- 进程控制块中的信息。
- 进程标识符
- 外部标识符方便用户对进程的访问。
- 内部标识符方便系统对进程的使用。
- 处理机状态。
- 处理机状态信息也称为处理机的上下文,主要是由处理机的各种寄存器中的内容组成。
- 当进程被切换时,处理机状态信息都保存在进程控制块中,以便在进程重新执行时能从断点继续执行。
- 进程调度信息
- 进程状态,进程优先级等。
- 进程控制信息
- 用于进程控制所必须的信息。包括:
- 程序和数据的地址
- 进程同步和通信机制
- 资源清单
- 链接指针
- 用于进程控制所必须的信息。包括:
- 进程标识符
- 进程控制块的组织方式
- 线性方式
- 所有的进程控制快都组织在一张线性表中,将该表的首地址存放在内存的一块专用区域中,每次查找都需要扫描整张表。
- 链接方式
- 把具有相同状态的进程的进程控制块分别通过进程控制快中的链接字链接成一个队列。
- 按照进程的优先级,将进程控制快,从高到低进行排列。
- 线性方式
2.3 进程控制
- 进程控制是进程管理中最基本的功能,主要包括创建新建成中职已完成的进程,将因发生异常情况而无法继续运行的进程置于阻塞状态,负责进程运行中状态转换。
- 进程控制一般是通过操作系统内核中的原语来实现。
2.3.1 进程的创建
- 在操作系统中允许一个进程创建另一个进程,通常把创建进程的进程称为父进程,我把被创建的进程称为子进程。
- 子进程可以继续创建更多的孙进程,由此便形成了一个进程的层次结构。
- 进程与其子孙进程共同组成一进程家族(组)。
- 子进程可以继承父进程所拥有的资源。当子进程被撤销时,应将从父进程那里获得的资源归还父进程,在撤销父进程时,必须同时撤销其所有子进程。
- 进程图
- 为了形象的描述一个进程的家族关系,引入了进程图。
- 进程图就是用于描述进程间关系的一颗有向树。
- 进程图中的节点代表进程。
- 创建父进程的进程称为祖先进程,把树的根节点作为进程家族的祖先。
- 引起创建进程的事件。
- 用户登录。
- 作业调度
- 提供服务
- 应用请求,用户进程自己创建新进程。
- 进程的创建
- 申请空白进程控制快。
- 为新进程分配其运行所需的资源,包括各种物理和逻辑资源。
- 初始化进程控制快。
- 如果进程就绪,队列能够接纳新进程,便将新进程插入就绪队列。
2.3.2 进程的终止
- 引起进程终止的事件
- 正常结束,表示进程任务已经完成,准备退出运行。
- 异常结束是指进程运行时发生某种异常事件是程序无法继续运行。
- 越界错
- 保护错,访问一个不允许访问的资源或文件。
- 非法指令。
- 特权指令错。
- 运行超时
- 等待超时
- 算数运算错
- io故障。
- 外界干预是指进程因外界的请求而终止运行。
- 进程的终止过程
- 根据被终止的进程标识符从进程控制块集合中检索出该进程的进程控制块,读出该进程的状态。
- 被终止进程正处于执行状态,立即终止该进程的执行,并设置调度标志为真,用于指示该进程被终止后应重新进行调度。
- 如果该进程还有子孙进程,将所有子孙进程终止。
- 将被终止的进程所拥有的全部资源或者归还给其父进程或者归还给系统。
- 将被终止进程从所在队列中移出,等待其他程序来搜集信息。搜集完才回收。
2.3.3 进程的阻塞与唤醒
- 引起进程阻塞或被唤醒的事件
- 向系统请求共享资源失败。
- 等待某种操作的完成。
- 新数据未到达。
- 等待新任务到达。
- 阻塞是进程自身的一种主动行为。
- 进程的阻塞过程
- 通过调用阻塞原语将自己阻塞,如果进程处于执行状态,立即停止执行,把进程控制块中的现行状态改为阻塞,并将进程控制块插入阻塞队列。保存当前进程的处理机状态。将处理机分配给另一就绪进程。
- 进程唤醒过程
- 阻塞进程所期待的事件发生,由相关进程调用唤醒原语将等待该事件的进程唤醒。
- 把阻塞进程从阻塞队列中移出。将进程控制块的状态改为就绪状态,将进程控制块插入就绪队列中。
2.3.4 进程的挂起与激活
- 进程的挂起
- 操作系统利用挂起原语将指定进程或处于阻塞状态的进程关系
- 进程的激活
- 操作系统利用激活原语将指定进程激活。
2.4 进程通信
- 进程通信是指进程之间的信息交换。
- 低级进程通信,由于进程的互斥与同步,需要在进程间交换一定的信息。
- 低级进程通信效率低,通信对用户不透明。
- 高级进程通信的特点
- 使用方便。
- 高效传送大量数据。
2.4.1 进程通信的类型
- 共享存储器系统
- 在共享存储器系统中,相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。
- 基于共享数据结构的通信方式。
- 操作系统提供共享存储器,程序员负责对共用数据结构的设置以及进程间同步的处理。
- 仅适合于传递相对少量的数据,通信效率低,属于低级通信。
- 基于共享存储区的通信方式
- 高级通信
- 先向系统申请或者共享存储区中的一个分区,并将其附加到自己的地址空间中,便可对其中的数据进行正常读写,读写完成或不需要时将其归还共享存储区。
- 管道通信系统
- 所谓管道是指用于连接一个读进程和一个写进程,以实现他们之间通信的一个共享文件,又名pipe文件。
- 管道提供输入的发送进程,以字符流形式将大量数据送入管道,接收管道输出的接收进程,从管道中接收数据。
- 管道机制必须提供的能力
- 互斥,当一个进程正在对管道进行读写操作时,其他进程必须等待。
- 同步,当进程把一定数量的数据写入管道,便去睡眠等待,直到读进程取走数据后再被唤醒。
- 确定对方是否存在,只有确定了对方存在时才能进行通信。
- 消息传递系统
- 以格式化的消息为单位将通信的数据封装在消息中,并利用操作系统提供的一组通信命令在进程间进行消息传递,完成进程间的数据交换。
- 高级通信方式
- 基于消息传递系统的通信方式属于高级通信方式。
直接通信方式,发送进程利用操作系统所提供的发送原语,直接把消息发送给目标进程。 - 间接通信方式,发送和接收进程都通过共享中间实体(邮箱)的方式进行消息的发送和接收,完成进程间的通信。
- 客户机服务器系统
- 主要实现方法有三类。
- 套接字,远程过程调用,远程方法调用。
- 套接字
- 一个套接字就是一个通信标识类型的数据结构。包含通信目的地址,通信使用的端口号,通信网络的传输协议,进程所在的网络地址,以及针对客户或服务器程序提供的不同系统调用。
- 套接字是进程通信和网络通信的基本构件
- 套接字是为客户服务器模型设计的。套街是包括两类。基于文件基于网络型
- 远程过程调用和远程方法调用。
- 远程过程调用是一个通信协议,用于通过网络连接的系统。
- 该协议允许运行在一台主机系统上的进程,调用另一台主机系统上的进程。
- 采用面向对象编程远程过程调用可称为远程方法调用。
- 主要实现方法有三类。
2.4.2 消息传递通信的实现方式
- 直接消息传递系统
- 在直接消息传递系统中采用直接通信方式发送进程,利用操作系统所提供的发送命令直接把消息发送给目标进程。
- 直接通信原语。
- 对称寻址方式,发送进程和接收进程必须以显示方式提供对方的标识符。
- 非对称寻址方式,发送进程不用显示提供对方的标识符。
- 信箱通信
-
信箱通信属于间接通信方式及进程之间的通信,需要通过中间实体来完成。
-
通常把中间实体称为邮箱,每个邮箱都有一个唯一标识符。
-
邮箱只允许核准的目标用户随时读取。
-
利用邮箱通信方式可实现实时通信,也可实现非实时通信。
-
信箱的结构
- 信箱头用于存放有关信箱的描述信息。
- 信箱体,由若干个可以存放信息的信箱格组成,信箱格的数目以及每格的大小是在创建信箱时确定。
-
信箱的类型。
- 私用信箱,用户进程为自己创建的信箱。
- 公用信箱,有操作系统创建。允许的进程才可使用该信箱。
- 共享信箱,有某进程创建所有共享进程都可使用。
-
2.5 线程的基本概念
2.5.1 线程的引入
- 在操作系统中引入线程是为了减少程序在并发执行时所付出的时空开销,使操作系统具有更好的并发性。
- 进程的两个基本属性
- 进程是一个可以拥有资源的独立单位。
- 进程是一个可以独立调度和分配的基本单位。
- 程序并发执行所需付出的时空开销
- 创建进程
- 撤销进程
- 进程切换。
- 由于进程是一个资源的拥有者,所以在创建撤销切换中,系统必须为之付出较大的时空开销。限制了系统中进程的数目,且进程切换不宜频繁,限制了并发程度进一步提高。
- 线程作为调度和分派的基本单位。
2.5.2 线程与进程的比较
- 由于线程具有许多传统进程所具有的特征,所以又称之为轻型进程或进程元
- 传统进程称为重型进程。
- 调度的基本单位,线程和进程都能作为调度的基本单位。线程的切换代价低于进程。
- 线程的并发性更好。
- 进程可以拥有资源,并作为系统中拥有资源的一个基本单位,线程本身并不拥有资源。
- 进程的独立性高于线程。同一进程中的不同线程共享进程中的内存空间和资源。
- 线程切换的系统开销小。
- 线程更适合多处理机。
2.5.3 线程的状态和线程控制块
- 线程执行的三个状态
- 执行状态,表示线程已获得处理机而正在运行。
- 就绪状态,指线程已具备了各种执行条件,只需再获得CPU便可立即执行。
- 阻塞状态,线程在执行中因某事件受阻,处于暂停状态。
- 线程控制块
- 系统为每个线程配置了一个线程控制块TCB,将所有用于控制和管理线程的信息记录在线程控制块中。
- 线程控制块包含的信息。
- 线程标识符
- 线程运行状态
- 线程专有存储区
- 线程优先级
- 一组寄存器:程序计数器,状态寄存器,通用寄存器的内容。
- 信号屏蔽,对某些信号加以屏蔽。
- 堆栈指针,将每次过程调用中所使用的局部变量以及返回地址保存起来。
- 多线程操作系统中的进程属性
- 进程是一个可拥有资源的基本单位。
- 多个线程可并发执行。
- 进程不是可执行的实体。把线程作为独立运行或调度的基本单位。
2.6 线程的实现
2.6.1 线程的实现方式
- 内核支持线程KST。
- 所有进程都在操作系统内核支持下运行。所有县城也在内核的支持下运行。
- 使用该种方式执行用户进程的线程需要从用户态转化为系统态,开销较大。
- 用户级线程ULT
- 用户及线程是在用户空间实现的,用户及线程和内核无关,内核完全不知道用户级线程的存在,其调度单位以进程为单位。
- 优点
- 线程不需要切换到内核空间,节省了模式切换的开销。
- 用户级线程的实现与操作系统平台无关,可以在不支持线程的操作系统平台上实现
- 调度算法可以是进程专用的。
- 缺点
- 由于调度单位是以进程为单位,当一个线程被阻塞时,该进程内所有线程都会被阻塞。
- 在多处理机系统中不能实现线程并发。
- 组合方式
- 内核支持多个内核支持线程的建立,调度与管理。允许用户应用程序建立调度,管理用户级线程。
- 同一个进程内的多个线程可以在多处理机上并行执行。阻塞一个线程时不会阻塞整个进程。
- 多对一模型
- 多个用户线程对应一个内核控制线程。
- 一对一模型
- 每个用户线程对应一个内核支持线程。
- 多对多模型
- 将许多用户线程映射到同样数量或更少数量的内核线程上。
2.6.2 线程的具体实现
2.6.3 线程的创建和终止
- 线程的创建
- 应用程序启动时通常只有一个线程在执行,把该线程称为初始化线程,该线程的主要功能是创建新线程。
- 在大多数的操作系统线程被终止后,并不立即释放所占有的资源,只有当进程中的其他线程执行了分离函数后,被终止的线程才与资源分离,此时的资源才能被其他线程利用。
- 对终止但未释放资源的线程仍可被需要它的线程所调用,以使被终止线程重新恢复运行。
- 线程的终止
- 终止线程通过调用相应的系统调用,对线程执行终止操作。