目录
前趋图和程序执行
进程的描述
进程控制
进程通信
线程的基本概念
线程的实现
程序顺利执行:
1)一个较大的程序通常由若干个程序段组成;2)程序在执行时,必须按照某种先后次序逐个执行,仅当前一操作执行完后,才能执行后继操作
前趋图:
1)有向无循环图,用于描述进程之间执行的先后顺序;
2)结点表示进程或程序段,有向边表示前趋关系
程序并发执行:利用多道程序技术,将多个程序同时装入内存,使之并发运行。
例:程序段如下: S1: a:=x+2 ;S2: b:=y+4 ; S3: c:=a+b; S4: d:=c+b
程序并发执行的特征:
1)间断性:并发程序之间相互制约;执行——暂停执行——执行
2)失去封闭性:多个程序共享全机资源;执行状态受外界因素影响
3)不可再现性:程序经过多次执行后,虽然其执行时的环境和初始条件都相同,但得到的结果却各不相同。
几种典型定义:
进程是程序的一次执行。
进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
定义:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
进程控制块(process control block PCB):专门的数据结构,与进程一一对应
进程的特征:
1)动态性(Concurrence,最基本的特征):生命期
2)并发性:一段时间内同时运行
3)独立性:
进程实体是一个能独立运行的基本单位
是系统中独立获得资源和独立调度的基本单位
4)异步性:按各自独立的、不可预知的速度向前推进
进程和程序的区别:
1)进程是程序的一个实例,是程序的一次执行。
2)进程是活动的,程序是静态的
3)程序是进程的代码部分。
4)进程在内存中,程序在外存中。
程序的状态及转换
1)就绪状态
> 一个较大的程序通常由若干个程序段组成
> 程序在执行时,必须按照某种先后次序逐个执行,仅当前一操作执行完成,才能执行后继操作。
2)执行状态:已获得CPU,正在执行的状态
> 单处理机:一个进程处于执行状态
> 多处理机:多个进程处于执行状态
3)阻塞状态
> 正在执行的进程由于发生某事件而暂时无法继续执行的状态
> 典型事件:请求I/O、申请缓冲空间
> 根据阻塞原因,设置多个阻塞队列
创建状态和终止状态
1)创建状态:申请一个空白PCB,填写PCB,分配资源,设置就绪状态,插入就绪队列
2)终止状态:等待OS善后;收回PCB
进程控制块PCB
PCB是进程的一部分,是操作系统中最重要的记录型数据结构,是进程存在的唯一标志,常驻内存。
PCB的作用:
作为独立运行基本单位的标志;
能实现间断性运行方式;
提供进程管理所需要的信息;
提供进程调度所需要的信息;
实现与其他进程的同步与通信。
PCB的信息:
1)进程标识符;2)处理机状态;3)进程调度信息;4)进程控制信息
PCB的组织方式
1)线性方式; 2)链接方式; 3)索引方式
进程控制:进程管理最基本的功能;一般由OS内核中的原语实现;包括:
1)进程创建;2)进程终止;3)进程阻塞与唤醒;4)进程挂起与激活
进程创建
> 进程具有层次结构
> 引起进程创建的事件:用户登录、作业调度、提供服务、应用请求
> 进程图:描述进程家族关系的有向图
> 进程创建过程:
1)申请空白PCB;2)分配所需资源;3)初始化PCB;4)插入就绪队列
进程终止
引起进程终止的事件:正常结束、异常结束、外界干预
进程的终止过程:
1)根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态;
2)若被终止进程正处于执行状态,应立即终止该进程的执行,并设置调度标志为真,用于指示该进程被终止后应重新进行调度;
3)若该进程还有子孙进程,还应将其所有子进程予以终止;
4)将该进程所拥有的全部资源,或者归还给其父进程或系统;
5)将被终止进程(PCB)从所在队列中移去。
进程的阻塞与唤醒
引起进程阻塞和唤醒的时间:向系统请求共享资源失败;等待某种操作的完成;新数据尚未到达;等待新任务的到达。
进程阻塞过程:
> 阻塞原语Block()
> 进程的阻塞是进程自身的一种主动行为
> 具体过程:停止执行;状态由执行改为阻塞;将PCB插入阻塞队列
进程唤醒过程:
> 唤醒原语WakeUp()
> 具体过程:从阻塞队列中移除;状态由阻塞改为就绪;将PCB插入就绪队列
> 必须成对使用Block和WakeUp原语
进程的挂起与激活
进程的挂起:Suspend()原语;执行过程
进程的激活过程:Active()原语;执行过程
进程通信是指进程之间的信息交换
低级进程通信:进程的同步和互斥(效率低;通信对用户不透明)
高级进程通信:使用方便;高效的传送大量数据
进程通信的类型
1)共享存储器系统
> 基于共享数据结构的关心方式(效率低)
> 基于共享存储区的通信方式(高级)
2)管道通信
管道:用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件
管道机制的协调能力:互斥、同步、对方是否存在
3)消息传递系统:
直接通信方式
间接通信方式(通过邮箱)
4)客户机-服务器系统
套接字(Socket)【套接字Socket就是一个通信标志类型的数据结构,是进程通信和网络通信的基本部件】
远程过程调用(RPC)和远程方法调用(RMI, Java)【远程过程调用是一个通信协议,用于通过网络连接的系统。如果涉及的软件采用面向对象编程,那么远程过程调用亦可称作远程方法调用。】
消息传递通信的实现方式
直接通信方式
> 发送原语send(receiver, message) :发送一个消息给接收进程
> 接受原语receive(sender, message) :接收发送进程发来的消息
间接通信方式:通过信箱来实现
> 信箱结构
>消息的发送和接收
发送原语:send(mailbox, message) 将一个消息发送到指定信箱
接收原语:receive(mailbox, message) :从指定信箱中接收一个消息
> 信箱类型:使用邮箱,公共邮箱,共享邮箱
Linux进程通信方式
管道;信号;消息队列;共享内存;信号量;套接字
线程的概念
时间:
60年代中期提出进程概念 -> 80年代中期提出线程概念 -> 90年代后:多处理机系统引入线程
引入进程的目的:使多个程序并发执行;提高资源利用率及系统吞吐量
进程的2个基本属性:
进程是一个可拥有资源的独立单位; 进程是一个可独立调度和分派的基本单位。
提出线程的目的
> 减少程序在并发执行时所付出的时空开销
> 使OS具有更好的并发性
> 适用于SMP结构的计算机系统
进程是有用资源的基本单位(传统进程称为重型进程)
线程作为调度和分配的基本单位(又称为轻型进程)
线程和进程的比较
1)调度的基本单位
> 在传统的OS中,拥有资源、独立调度和分派的基本单位都是进程;
> 在引入线程的OS中,线程作为调度和分派的基本单位,进程作为资源拥有的基本单位;
> 在同一进程中,线程的切换不会引起进程切换,在由一个进程中的线程切换到另一个进程中的线程时,将会引起进程切换。
2)并发性:在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间,也可并发执行。
3)拥有资源
进程是系统中拥有资源的一个基本单位,它可以拥有资源。
线程本身不拥有系统资源,仅有一点保证独立运行的资源。
允许多个线程共享其隶属进程所拥有的资源。
4)独立性:同一进程中的不同线程之间的独立性要比不同进程之间的独立性低得多。
5)系统开销:
在创建或撤消进程时,OS所付出的开销将显著大于创建或撤消线程时的开销。
线程切换的代价远低于进程切换的代价。
同一进程中的多个线程之间的同步和通信也比进程的简单。
6)支持多处理机系统:多线程进程可以将一个进程中的多个线程分配到多个处理机上,并行运行。
线程的状态和线程控制块
线程状态
> 执行态、就绪态、阻塞态
> 线程状态转换与进程状态转换一样
线程控制块(thread control block TCB)
线程标识符、一组寄存器、线程运行状态、优先级、线程专有存储器、信号屏蔽、堆栈指针
实现方式:
内核支持线程KST
用户级线程ULT
组合方式
具体实现:
内核支持线程的实现(利用系统调用)
用户级线程的实现(借助中间系统)
内核支持线程KST
在内核空间实现
优点:
1)在多处理机系统中,内核可同时调度同一进程的多个线程
2)如一个线程阻塞了,内核可调度其他线程(同一或其他进程)。
3)线程的切换比较快,开销小。
4)内核本身可采用多线程技术,提高执行速度和效率。
缺点:
对用户线程切换,开销较大。
用户级线程ULT
在用户空间实现
优点:
1)线程切换不需要转换到内核空间
2)调度算法可以是进程专用的
3)线程的实现与OS平台无关
缺点:
1)系统调用的阻塞问题
2)多线程应用不能利用多处理进行多重处理的优点
ULT与KST组合方式
1)多对一模型
多个用户级线程映射到一个内核线程。
多个线程不能并行运行在多个处理器上。
线程管理在用户态执行,因此是高效的,但一个线程的阻塞系统调用会导致整个进程的阻塞。
用于不支持内核线程的系统中。
例子:Solaris Green Threads ;GNU Portable Threads
2)一对一模型
每个用户级线程映射到一个内核线程。
比多对一模型有更好的并发性
允许多个线程并行运行在多个处理器上。
创建一个ULT需要创建一个KLT,效率较差。
例子:Windows 95/98/NT/XP/2000 ;Linux;Solaris 9 and later; OS/2
3)多对多模型
多个用户级线程映射为相等或小于数目的内核线程
允许操作系统创建足够多的KLT。
例子:Solaris 9 以前的版本; 带有ThreadFiber开发包的Windows NT/2000 。
三种模型对应的图如下:
总结:本篇从程序的执行入手,先后引入了OS中的两个重要概念:进程和线程。进程是资源分配的单位,线程是CPU调度的单位。