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