概念、功能和目标
概念
什么是操作系统
功能和目标
- 作为系统的管理者
- 向上提供方便简易的服务
- 作为最接近底层硬件的层次
特征
- 并发
- 共享
- 并发与共享的关系—互为存在条件
- 虚拟
- 异步
发展与分类
- 单道批处理系统
- 多道批处理系统
- 优点:多道程序并发执行,共享计算机资源,资源利用率大幅提升
- 缺点:用户响应时间长,没有人机交互的功能
- 分时操作系统
- 缺点:不能优先处理紧急任务
- 实时操作系统
- 其他几种操作系统
运行机制
- 两种程序
- 应用程序–只能使用非特权指令
- 内核程序–可以使用特权指令
- 两种指令
- 特权指令
- 非特权指令
- 两种处理器状态
- 内核态
- 用户态
- 如何变态?
- 内核态–>用户态 -------一条修改psw的特权指令
- 用户态–>内核态 -------由中断引起,硬件自动完成
中断与异常
- 中断
- 作用:让操作系统内核夺回cpu使用权的唯一途径
- 类型:
- 内中断(异常):与当前执行指令有关,中断信号来自cpu内部
- 外中断:与当前执行指令无关,中断信号来自cpu外部
- 基本原理:
系统调用
- 系统调用与库函数的区别
- 什么功能要用到系统调用?
- 过程
体系结构
- 内核
操作系统的引导
虚拟机
进程管理
概念、组成和特征
- 概念:
- 程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合
- 进程:是动态的,是程序的一次执行过程
- 组成(进程实体的组成):
- PCB:进程控制块
- 程序段:包含程序指令
- 数据段:包含运行过程中产生的各种数据
总结:PCB、程序段、数据段组成进程实体(进程映像)
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
注意:PCB是进程存在的唯一标志!
- PCB:进程控制块
- 特性:
- 动态性:进程的最基本特性
- 并发性
- 独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位
- 异步性:各进程以不可预知的速度向前推进,可能导致运行结果的不确定性
- 结构性
状态与转换、组织
- 状态
- 创建态:进程正在被创建,操作系统为进程分配资源、初始化PCB
- 就绪态:已经具备运行条件,但由于没有空闲CPU,而暂时不能运行
- 运行态:占有CPU,并在CPU上运行
- 阻塞态:因等待某一事件而暂时不能运行
- 终止态:进程正在从系统中撤销,操作系统中撤销,操作系统会回收进程拥有的资源、撤销PCB
- 状态的转换:
- 组织
-
链式方式
-
索引方式
-
进程控制
主要功能:对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能
简单理解:反正进程控制就是要实现进程状态转换
- 如何实现?
- 用“原语”实现:原语的执行具有“原子性”,一气呵成,期间不允许被中断
可以使用“关中断指令”和“开中断指令”这两个指令实现原子性
- 用“原语”实现:原语的执行具有“原子性”,一气呵成,期间不允许被中断
- 相关原语
- 进程是如何运行的?
在进程切换时先在PCB中保存这个进程的运行环境(保存一些必要的寄存器信息);当原来的进程再次投入运行时,可以通过PCB恢复它的运行环境
进程通讯
进程间的通讯指的是两个进程之间产生数据交互
- 为什么进程间的通讯需要操作系统支持
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间是相互独立的
为了安全,一个进程不能直接访问另一个进程的地址空间 - 共享存储
- 基于存储区的共享:操作系统在内存中划分一个共享存储区,数据的形式、存放位置都是由通讯进程控制,而不是操作系统。这种共享方式速度很快,是一种高级通信方式
- 基于数据结构的共享:比如共享区域只存放一个数组。这种共享方式速度慢、限制多,是一种低级通信方式
- 消息传递
进程间的数据交换以格式化的消息为单位。进程通过操作系统提供的“发送信息/接受信息”两个原语进行数据交换- 直接通信:点名道姓的消息传递
- 间接通信:以“信箱”作为中间实体进行消息传递
- 管道通信
“管道”是一个特殊的共享文件,其实就是开辟一个固定内存大小的内存缓冲区- 管道只能采用半双工通信,某个时间段内只能实现单向的传输。如果要实现双向传递,需要设置两个管道
- 各个进程要互斥的访问管道(由操作系统是实现)
- 当管道写满时,写进程将被堵塞,直到读进程将管道中的数据取走,即可唤醒写进程
- 当管道读空时,读进程将被堵塞,直到写进程往管道中写入数据,即可唤醒读进程
-
-
线程
线程是一个基本的CPU执行单元,也是程序执行流的最小单元
- 用户级线程(多对一模型)
- 内核级线程(一对一模型)
- 多对多模型
状态与转换
- 组织与控制
调度
基本概念
当有一堆任务要处理,但是由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”研究的问题
调度的三个层次
- 高级调度
- 作业概念:一个具体的任务(用户让操作系统启动一个程序来执行具体任务)
- 介绍:高级调度。按照一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只能调入一次,调出一次。作业调入时创建PCB,调出时撤销PCB
- 低级调度
- 介绍:(进程调度/处理机调度)按照某种策略从就绪队列中选取一个进程,将处理机分配给它
- 是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度
- 进程调度的频率很高,一般几十毫秒一次
- 中级调度
-
挂起概念:内存不够时,可以将某些进程的数据调出外存。等内存空闲或者进程需要运行时再重新调入内存。暂时调到外存等待的进程状态为挂起状态。被挂起的进程的PCB会被组织成挂起队列
-
介绍:(内存调度)按照某种策略决定将哪个处于挂起状态的进程重新调入内存。一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高
-
进程调度
按照一定的算法从就绪队列中选择一个进程为其分配处理机
进程在操作系统内核程序临界区中不能进行调度与切换
- 临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源
内核程序临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列(由各就绪进程的PCB组成) - 切换与过程
调度算法评价指标
-
CPU利用率:指CPU“忙碌”的时间占总时间的比例
利用率=忙碌时间/总时间 -
系统吞吐量:单位时间内,完成作业的数量
-
周转时间:指作业被提交给系统开始,到作业完成为止的这段时间间隔
-
等待时间:指进程处于等待处理机状态时间之和
-
响应时间:从用户提交申请到首次产生响应所用时间
调度算法
先来先服务
短作业优先
高响应比优先
相应比=(等待时间+要求服务时间)/要求服务时间
时间片轮转调度算法
优先级调度算法
- 系统进程优先级高于用户进程
- 前台进程优先级高于后台进程
- 操作系统更遍好I/O型进程
多级反馈队列调度算法
进程同步与互斥
- 进程同步:亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作
- 进程互斥:亦称间接制约关系。进程互斥指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源
- 四个部分:
- 进入区:检查是否可进入临界区,若可进入,需要”上锁“
- 临界区:访问临界资源的那段代码
- 退出区:负责”解锁“
- 剩余区:其余代码部分
- 四个部分:
为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:
- 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
- 忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
- 有权等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿);
- 让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。
软件实现方法
- 单标志法
- 算法思想:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予
- 主要问题:违反”空闲让进“
- 双标志先检查法
- 算法思想:设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿
- 主要问题:违反”忙则等待“
- 双标志后检查法
- 算法思想:先”上锁“后”检查“的方法,来避免上述问题
- 主要问题:违反了”空闲让进“、”有限等待“
- Peterson算法
- 算法思想:结合双标志法、单标志法的思想。如果双方都争着想进入临界区,那可以让进程尝试”孔融让梨“(谦让)。做一个有礼貌的进程
- 主要问题:依然未遵循让权等待的原则
硬件实现方法
- 中断屏蔽方法
- 实现方式:利用”开/关中断指令“
- 优点:简单、高效
- 缺点:不适合用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令只能允许在内核态,这组指令如果能让用户随意使用会很危险)
- TastAndSet指令
- 实现方式:用硬件实现,执行的过程不允许被中断,只能一气呵成。TSL指令把”上锁“和”检查“操作用硬件的方式变成了一气呵成的原子操作。
- 优点:实现简单,无需像软件实现方法那样严格的检查是否会有逻辑漏洞;适用于多处理机环境
- 缺点:不满住”让权等待“原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致”忙等“。
- Swap指令
- 整体与TSL指令没有太大区别
互斥锁
- 缺点:产生忙等待
- 需要连续循环忙等的互斥锁,都可以称为”自旋锁“
-
信号量机制
信号量其实就是一个变量,可以用一个信号量来表示系统中某种资源的数量
一对原语:wait(S)原语和signal(S)原语,括号里的信号量S其实就是函数调用时传入的一个参数
- 整型信号量
- 介绍:用一个整数型的变量作为信号量,用来表示系统中某钟资源的数量
- 缺点:不满足让权等待原则
- 记录型信号量
实现进程的互斥、同步、前驱关系
- 互斥:
- 实现:
- 注意:
- 实现:
- 同步:
- 实现:
- 实现:
- 前驱关系:
- 实现:
- 实现:
生产者-消费者问题
实现互斥的P操作一定要在实现同步的P操作之后
V操作不会导致进程堵塞,因此两个V操作顺序可以交换
多生产者-多消费者问题
- 总结:在生产者-消费者问题中,如果缓冲区大小为1,那么有可能不需要设置互斥信号量就可以实现互斥访问缓冲区的功能。当然,这不是绝对的,要具体问题具体分析。
吸烟者问题
读者-写者问题
科学家进餐问题
管程
管程是一种特殊的软件模块,有这些部分组成
- 局部于管程的共享数据结构说明;
- 对该数据建构进行操作的一组过程;
- 对局部于管程的共享数据设置初始值得语句;
- 管程有一个名字。
管程得基本特征:
- 局部于管程得数据只能被局部于管程得过程所访问;
- 一个进程只有通过调用管程内的过程才能进入管程访问共享数据;
- 每次仅允许一个进程在管程内执行某个内部过程
死锁
死锁、饥饿、死循环的区别
- 死锁产生的条件
- 互斥条件
- 不可剥夺条件:不能由其他进程强行夺走,只能主动释放
- 请求和保持条件:进程已经拥有了至少一个资源,但是又提出了新资源的请求
注意:发生死锁一定有循环等待,但是有循环等待不一定发生死锁
预防死锁
- 破坏互斥条件:互斥访问的资源改为共享使用,比如:SPOOLing技术
- 破坏不可剥夺条件:
- 当一个进程请求新的资源得不到满足时,主动放弃现在持有的所有资源,并再次申请处理机
- 在考虑优先级的情况下,去掠夺其他进程的资源
- 缺点:
- 实现起来比较复杂
- 释放以获得的资源可能造成前一阶段的工作失败
- 反复地申请和释放资源会造成系统开销,降低系统吞吐量
- 破坏请求和保存条件
- 破坏循环等待条件
避免死锁
- 银行家算法