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