操作系统学习笔记(1.计算机系统概述 2.进程与线程)
文章目录
- 第一章 计算机系统概述
- 操作系统的概念、功能
- 操作系统的特征
- 操作系统的发展与分类
- 操作系统的运行机制
- 中断和异常
- 系统调用
- 操作系统体系结构(上)
- 操作系统体系结构(下)
- 操作系统引导
- 虚拟机
- 第二章 进程管理
- 进程的概念,组成,特征
- 进程的状态与转换
- 进程控制
- 进程通信(IPC)
- 线程的概念
- 线程的实现方式和多线程模型
- 线程的状态与转换
- 处理机调度的概念,层次
- 进程调度的时机,切换,过程,调度方式
- 调度器,闲逛进程
- 调度算法的评价指标
- 调度算法(1)
- 调度算法(2)
- 调度算法(3)
- 进程同步和进程互斥
- 进程互斥的软件实现方法
- 进程互斥的硬件实现方法
- 互斥锁
- 信号量机制
- 用信号量机制实现进程互斥,同步,前驱关系
- 生产者消费者问题
- 多生产者-多消费者问题
- 吸烟者问题
- 读者写者问题
- 哲学家进餐问题
- 管程
- 死锁的概念
- 死锁的处理策略-预防死锁
- 死锁额处理策略--避免死锁(银行家算法)
- 死锁的处理策略--检测和解除
第一章 计算机系统概述
操作系统的概念、功能
操作系统的概念
- 操作系统是系统资源(软硬件)的管理者
- 是最接近硬件的一层软件
- 向上层提供方便易用的服务
作为系统资源的管理
向上层提供方便易用的服务
GUI图形化接口
命令接口
- 联机命令接口,也叫交互式命令接口
- 脱机命令接口,也叫批处理命令接口
程序接口
- 通过系统调用来使用程序接口,只能通过程序代码使用
作为最接近硬件的层次
知识点小结
操作系统的特征
并发
- 并发:宏观同时,微观交替
- 并行,多个时间在同一时间同时发生,与并发区分开
共享
- 所谓的同时往往是宏观的,微观上可能还是交替的对资源访问
- 有些资源在微观上也可能是真的被同时共享,比如多个程序同时播放音响设备
并发和共享的关系
- 并发和共享互为存在条件
虚拟
- 空分复用技术,时分复用技术,这两个有个印象就行,第三章重点讲解
异步
知识点小结
操作系统的发展与分类
可能出选择题
手工操作系统
批处理阶段–单道批处理系统
批处理阶段–多道批处理系统
分时操作系统
实时操作系统
其操作系统
- 了解,考试主要靠前面几个操作系统
知识点小结
- 重点理解各类型操作系统解决什么问题,怎么解决的
操作系统的运行机制
区分指令和小黑框的命令行
- 我们说的指令是二进制机器指令,小黑框的命令其实交互式命令接口
内核程序和应用程序
- 内核是操作系统最核心的部分,最接近硬件,操作系统不全都是内核
特权指令和非特权指令
- CPU在设计和生产时就划分了特权指令和非特权指令,CPU自己能判断出要执行的是不是特权指令
内核态和用户态
- CPU如何判断当前执行指令的是内核程序还是应用程序
- 用程序状态自寄存器PSW的一个标记位表示CPU当前的状态
- 内核态又称核心态,管态,用户态又称目态
内核态和用户态的切换
- 内核态到用户态,执行特权指令
- 用户态到内核态,由中断引发,硬件自动完成变态过程
- 但凡需要操作系统介入的地方,都会触发中断信号
知识点小结
- 重要,高频考点,但可能也就出一个选择题
中断和异常
中断的作用
- 没有中断程序就谈不上并发,也谈不上操作系统
中断的类型
内中断
- 陷入指令是一种特殊的指令,但不是特权指令
外中断
- 例如时钟中断
- 系统需要并发运行两个应用程序
- 首先在用户态,运行应用程序1
- 时钟部件发现时间到了,发给CPU一个中断信号
- CPU检测到中断信号,暂停应用程序,转为内核态,执行处理中断的内核程序,发现该让应用程序2运行了
- 内核程序将CPU使用权交给应用程序2,切换为用户态,开始执行应用程序2
- 当应用程序2执行时间达到一定时,重复以上过程
- 例如输入输出设备发来的中断信号
- 应用程序请求打印服务,打印服务完成后向CPU发送中断信号,CPU对这个中断信号进行处理
中断的分类
- 狭义,广义
- 考试一般提到的中断特指外中断,
- 内中断我们一般说成是异常,例外
- 之前我们讲解的其实是广义的中断,泛指所有的中断
中断机制的基本原理
- 不同的中断信号,需要用不同的中断处理程序来处理,通过中断向量表保存中断处理程序的指针
- 中断处理程序一定是内核程序
知识点小结
系统调用
什么是系统调用,作用
- 操作系统给用户直接使用的是命令接口,给应用程序使用的程序接口就是系统调用
- 应用程序通过系统调用获取操作系统的内核服务
系统调用与库函数的区别
- 系统调用是比高级语言更为底层的接口
- 有的库函数涉及系统调用,有的不涉及系统调用
系统调用的重要性
- 应用程序都想使用共享资源,因此用系统调用进行统一管理
- 用户进程想要使用共享资源,只能通过系统调用向操作系统内核发出请求
什么功能需要系统调用
- 凡是共享资源都需要系统调用,保证系统的稳定性和安全性,防止用户非法操作
系统调用的过程
- 应用程序运行在用户态,想要系统调用,首先向CPU寄存器传必要参数,用于后续的系统调用,比如指明需要哪种系统调用,传参可能有多条
- 应用程序执行陷入指令,陷入指令引发内中断
- CPU识别trap导致的内中断,切换为内核态,转入对应的中断处理程序(系统调用入口程序)
- 在系统调用入口程序中,检查参数,判断出需要执行哪个系统调用
- CPU执行对应的系统调用处理程序
- 系统调用程序执行完,CPU转为用户态,接着处理用户的应用程序
系统调用的过程
- 1.陷入指令是用户态执行的,触发内中断,使CPU进入核心态
- 发出系统调用的请求是在用户态下,对系统调用的相应处理是在核心态下进行
知识点小结
操作系统体系结构(上)
操作系统的内核
- 操作系统内部进一步划分,内核和非内核功能
操作系统的内核
- 内核程序必须运行在内核态
- 时钟管理,中断处理,原语是内核中最底层的,与硬件关联紧密,必须再内核态运行
- 进程管理,存储器管理,设备管理,更多是对数据结构的操作,不会直接涉及硬件
- 因此有两种关于内核的设计方法,大内核,微内核,区别在于是否把进程管理,存储器管理,设备管理等功能划入到内核功能内
操作系统的体系结构
- 两种体系结构的区别
- 微内核的体系结构会导致CPU在内核态和用户态转换更加频繁,频繁变态会降低系统性能
- 所以大内核的状态切换少,但是程序复杂;微内核的状态切换更频繁,但是程序简单些
- 答题时要用术语,叫状态切换,不要讲变态
知识点小结
- 考试重点考察两种体系结构的区别,优缺点
操作系统体系结构(下)
今年新增考点:分层结构,模块化,外核
如果出题,也是简单的选择题,了解各体系结构的特性,优缺点
汇总表格
- 标星号的是出题概率较大的,红色是新内容,黄色是老内容
- 表格列举的比较清晰了,可以直接看表,不理解的再看视频详细解释
分层结构
- 上层的调试和验证只能调用更第一层的接口,因此各层次清晰
模块化
- 将内核划分为多个模块
- 模块之间有相互的调用依赖(出了问题到底是谁的问题),类似于Java中maven项目的循环依赖问题
- 相比之下,分层结构有明确的层级调用方向,因此调用调试比较清晰固定
大内核和微内核
外核
- 这种结构很少见
- 这种操作系统由外核和内核两个部分组成
- 外核负责为用户进程分配未经抽象的硬件资源
- 未经抽象的硬件资源
- 普通的操作系统,用户进程申请使用内存空间,系统给分配的是经过虚拟化的空间,看起来是连续的,实际上可能是离散的,给外存分配的空间也是经过抽象的,虚拟的
- 外核可以用户进程分配未经抽象的硬件空间
- 好处,如果某一进程需要频繁的对空间进行随机访问,如果给用户分配的磁盘空间是离散的 ,会导致硬盘频繁的移动磁头,导致访问文件的效率变低;
- 普通操作系统给用户进程分配的空间是由操作系统决定的,外存可以直接分配未经抽象的连续的空间,因此在有的情况下很有用
- 保证资源的使用安全,一个进程访问一片空间,另一个进程想要访问就会被阻止,原本的进程想要访问分配之外的空间也会被阻止
- 普通操作分配虚拟内存,用户进程访问地址空间是虚拟的,需要访问页表,甚至多级页表,最后映射到实际物理地址,会降低访问相率;外核给的直接就是物理地址,无需映射
- 降低系统的一致性,有些进程申请的是虚拟空间,有些地址申请的是物理空间,
操作系统引导
如何让操作系统在电脑中运行起来
磁盘安装操作系统之后
- 除了我们能看见的CDEF分区之外,磁盘的开头部分还有个主引导记录
- 主引导程序和分区表
- 主引导记录,后面讲
- 分区表,一个数据结构,指明了磁盘中每个盘(分区)分别多大空间,每个盘的地址范围
- C盘
- C盘安装了操作系统,C盘就是整个磁盘的活动分区
- C盘包含:引导记录PBR(后面讲),根目录,其他
- 根目录,双击C盘看到的东西
- 其他部分先不管
开机过程
- 计算机主存有RAM和ROM,我们通常收的内存一般都是RAM
- 其实主存中还有ROM芯片,装有BIOS
- BIOS中最重要的就是ROM引导程序,即自举程序
- ROM存储的数据不会因为断点消失,开机时CPU可以到主存的固定位置寻找BIOS程序,运行自举程序,指示CPU将磁盘中的主引导记录MBR读入内存
- CPU执行磁盘引导程序,并且根据分区表,找到C盘位置
- CPU读入C盘第一部分数据,引导记录PBR
- CPU执行引导记录里的程序,找到启动管理程序(存放在根目录下的某个位置)
- CPU执行启动管理程序,完成操作系统初始化
- windows操作系统中Windows/Boot目录下就是操作系统初始化程序
虚拟机
学习要点
- 理解两类虚拟机的原理
- 重点记忆两类虚拟机程序的对比列表,两类虚拟机结构图,是大概率的考点,出选择题
传统计算机
- 一个操作系统运行多个用户程序可能有隐患
- 额外增加计算机又会增加硬件成本
虚拟机
- 虚拟机定义
- 虚拟机管理程序:第一类虚拟机管理程序,第二类虚拟机管理程序
- 第一类虚拟机管理程序
- 只有虚拟机管理程序运行在内核态,有最高运行权限,上层操作系统和应用程序其实运行在用户态
- 上层操作系统以为自己运行在内核态,仍然使用特权指令,当上层操作系统使用特权指令时,会被虚拟机管理程序截获,代替上层操作系统完成指令,
- 对于上层操作系统而言,仿佛自己就处在内核态执行特权指令一样
- 第二类虚拟机管理程序
- 虚拟机管理程序必须运行在宿主操作系统上,比如VirtualBox和VMware
- 在虚拟机管理程序的平台之上,安装客户操作系统,比如Linux
- 客户操作系统需要请求资源,需要虚拟机管理程序分配,虚拟机管理程序请求资源,需要宿主操作系统分配
两类虚拟机管理程序对比
- 第二类,宿主操作系统分配给虚拟机的资源就已经是抽象的,虚拟机管理程序用这个资源,经过再虚拟交给用户
- 因此第二类虚拟机操作系统请求资源的时候,需要经过多层映射,才能对应最终物理地址上
- 第二类,虚拟机管理程序有一部分运行在内核态,以虚拟机驱动程序加载到操作系统内核中
支持虚拟化的CPU通常分更多指令等级
- 之前的CPU我们只是简单的划分特权和非特权指令,现在进一步将特权指令进行划分等级
- 这么做的意义,把特权指令中的敏感指令放在0环,把不敏感的特权指令放在1环,等等
- 这样虚拟机管理程序不用检查每一条特权指令,只需要检查敏感指令即可
第二章 进程管理
进程的概念,组成,特征
进程的概念
进程的组成–PCB
- 进程控制块,PCB是一种数据结构,进程存在的唯一标志
进程的组成–程序段,数据段
- 进程的组成:PCB,程序段,数据段
- PCB是给操作系统用的
- 程序段,数据段是进程自己用的
程序是如何运行的
进程的组成
进程的特征
知识点小结
进程的状态与转换
创建态,就绪态
运行态
阻塞态
终止态
进程状态的转换(丁字裤模型)
进程的组织方式
- 操作系统需要对进程进行组织管理,链式和索引两种方式,其中链式方式是常见方式
知识点小结
- 进程的组织方式了解一下即可
- 进程的状态与状态切换,绿色框是重点
进程控制
本节干货比较多,理解就好,无需记忆
什么是进程控制
- 就是要实现进程状态的转换
如何实现进程控制
为什么要一气呵成
- 因为进程控制的程序需要多个步骤完成,如果不能一气呵成,会导致操作系统的某些关键数据结构信息不统一的情况,赢下是哪个操作系统进行别的管理工作
如何实现原语的原子性
- 用关中断指令和开中断指令(两个特权指令)
进程的创建
- 作业就是放在外存还没有进入内存的程序
进程的终止
- 父子进程
- 子进程是由父进程创建的,树形结构
进程的阻塞和唤醒
进程的切换
- 进程的运行环境,即进程上下文,context
- 保护现场,就是将当前进程运行时一些必要的寄存器信息保存到PCB中
知识点小结
- 本节理解就好
进程通信(IPC)
进程间通信IPC
- 进程间通信,两个进程之间产生数据交互
为什么进程通信需要操作系统支持
- 各个进程拥有的内存空间地址相互独立,一个进程不能直接访问其他进程的地址空间
- 进程通信三种方式:共享存储,消息传递,管道通信
共享存储
- 一个进程可以申请一片共享存储区,这个进程可以被其他进程共享
- 各自进程添加页表项/段表项,将同一片共享内存区映射到自己的地址空间中
- 各个进程对共享空间的访问应该是互斥的
- 基于存储区的共享:操作系统只负责划出一片区域,怎么使用进程自己定,灵活度高,速度快,是高级通信方式
- 基于数据结构的共享:进程只能按以特定的某种数据结构的形式存放数据,自由度低,传送速度慢,是低级通信方式
消息传递 - 两种方式:直接通信方式,间接通信方式
消息传递–直接通信方式
- 比如,进程P要给进程Q发送消息
- Q在操作系统的内核空间中有PCB,里面保存着Q的消息队列,其他进程要发送给Q,应该接收的消息
- P自己的地址空间编辑消息msg,接着,P使用发送原语发送消息,指明Q接收
- 操作系统内核接收消息,把消息放在Q的PCB中的消息队列中
- Q使用接收原语,指明接收来自P的消息,从PCB的消息队列中取出消息
消息传递–间接通信方式
- 又称信箱通信方式
- 进程P通过系统调用,申请一个或多个邮箱,信箱在系统内核中
- P在自己的地址空间编辑消息,使用发送原语,指明发送到哪个信箱
- Q使用接收原语,指明接收信箱A的消息,将消息复制到Q的地址空间
管道通信
- 管道是一种特殊的共享文件,本质是内存中的一个大小固定的内存缓冲区,其实是个循环队列
- 同一时间,管道传送数据只能是单向的,不可以双向,支持的是半双工模式
- 管道和共享存储的区别:共享方式,是给定一片存储区,随便用;管道方式,必须以数据流的方式运行吗,遵循先进先出的方式,而不是想读哪就读哪,想写哪就写哪
- 第五点,管道数据一点被读出就会彻底消失,多个进程读同一个管道时,可能会错乱。两种方案
- 一个管道允许多个写进程,一个读进程(标准答案)
- 一个管道允许多个写进程,多个读进程(也确实存在)
知识点小结
- 三种通信方式都需要操作系统底层来实现
王道书修正
线程的概念
为什么要引入线程
- 进程内部可以继续并发,增加了并发度
- 线程是程序执行流的最小单位
为什么引入线程 - 理解为轻量级进程
- 线程是CPU最小执行单元,程序执行流的最小单位
- 各个线程之间可以并发,提高了系统的并发度
- 进程只作为除了CPU之外的系统资源分配单元
引入线程机制后,有什么变化
- 传统的进程之间并发,需要切换进程的运行环境,系统开销很大
- 同一进程内的线程切换,无需切换运行环境,系统开销小
线程的属性
线程的实现方式和多线程模型
线程的实现方式–用户级线程
- 线程是由线程库实现的,操作系统视角看到的仍然是进程
- 比如,弱智版的线程库,while循环
- 最大的缺点:一个用户级线程被阻塞,整个进程都会被阻塞;CPU调度的基本单位还是进程
线程的实现方式–内核级线程
- 操作系统视角也能看到的线程,现代操作系统大多支持
- 一个线程被阻塞,其他线程继续执行,并发能力强,多个线程可以在多核处理器上运行
- 缺点:线程的切换需要变态,加大了开销
多线程模型
- 为了结合用户级线程和内核级线程的优点
多线程模型–一对一模型
- 就是上面的内核级线程的实现方式,一个用户级线程对应一个内核级线程
多线程模型–多对一
- 多个用户级线程对应一个内核级线程,再对应一个进程,基本上等同于早期的纯粹的用户级线程的实现方式
- 考试中如果出现这种多对一模型,就默认为一个进程分配一个进程,再对应一个线程库
多线程模型–多对多
- 一个进程内有多个内核级线程,多个内核级线程对应多个用户级线程,内核级线程数量不超过用户级线程数量
- 多对多情况下的内核级线程数量比原来的一对一情况下的内核级线程数量更少了,因此降低了CPU的变态开销
- 一个进程中,只有所有的内核级线程都阻塞,才说这个进程阻塞
知识点小结
- 容易考察阻塞相关的题
线程的状态与转换
线程的状态转换与进程的转换几乎一模一样,我们通常只关注就绪,运行,阻塞,这三个状态
线程的组织与控制
- 使用TCP,线程控制块
- 线程的组织就是按照需求,将这些线程的TCB有规律的分门别类的组织起来
处理机调度的概念,层次
调度的基本概念
调度的三个层次–高级调度
- 作业的概念,理解为一个具体的任务;用户向系统提交作业
- 每个作业只调入一次,调出一次
调度的三个层次–低级调度
调度的三个层次–中级调度
进程的挂起状态与七状态模型
- 自主命题可能会考
三层调度的联系和对比
知识点小结
- 注意三个层次的括号内的名称,经常问到
进程调度的时机,切换,过程,调度方式
本节不算考试重点
进程调度的时机
关于临界区的问题
- 2012年一道题的表述是不对的
- 临界资源,临界区(访问临界资源的代码)
- 结论:访问内核程序临界区期间不能调度和切换,访问普通临界区期间可以调度与切换
进程调度方式
进程的切换与过程
- 有时候出题指的是狭义的进程调度,有时候是广义的进程调度,需要自己结合出题灵活把握
- 进程切换是有代价的
知识点小结
- 不是考试重点,理解就好
调度器,闲逛进程
调度程序
- 这里以进程为例
调度程序(线程)
闲逛进程
- 0地址指令不需要访存,甚至不需要访问一些寄存器,减少时间消耗
调度算法的评价指标
要求理解各个指标,并且会计算
CPU利用率
系统吞吐量
周转时间
- 四个部分,第一个部分只能发生一次,后三项在一个作业的整个处理过程中,可能发生多次
- 在周转时间相同的情况下,运行时间更长的作业给用户体验更好,因为CPU服务的时间更多一些
- 为了反应周转时间中实际的运行时间,使用带权周转时间来描述
等待时间
- 对于进程来说的等待时间,对于作业来说的等待时间
- 调度算法主要在影响作业/进程的等待时间
响应时间
知识点小结
- 能理解,会计算
调度算法(1)
先来先服务,最短作业优先,最高响应比优先
先来先服务
短作业优先
- 非抢占式,抢占式
非抢占式
抢占式
- 进程的执行可能是断断续续的
注意细节
关于先来先服务和短作业优先的思考
- 能否兼顾运行时间和等待时间
高响应比优先
- 用响应比来衡量优先级,兼顾了等待时间和要求服务时间
- 适用于非抢占式算法,只有当前运行的作业/进程主动放弃处理机时,才调度,计算响应比
知识点小结
- 一定要动手做课后习题,这里很容易出计算题
调度算法(2)
时间片轮转,优先级调度,多级反馈队列
时间片轮转
- 用于进程调度
- 时间片轮如果时间片太大,就会退化为先来先服务调度算法,太小又会导致进程切换过于频繁
- 时间片应该适中,不能太大也不能太小
优先级调度算法
- 既可以作业,也可以进程
- 有抢占式,也有非抢占式
- 适用于实时操作系统
优先级调度算法补充
- 就绪队列可能有多个,分优先级
- 优先级是否可以改变,静态优先级,动态优先级
思考
- 如何整合前面的算法的优点
多级反馈队列调度算法
- 规则比较复杂,只能看视屏动画理解了
- 考试时,规定这就是抢占式算法
知识点小结
- 这三种算法的对比要点更容易被考察,适用于交互式系统
- UNIX使用的多级反馈队列调度算法
- 一定要动手做课后题
调度算法(3)
多级队列调度算法
进程同步和进程互斥
什么是进程同步
- 为了解决进程异步性带来的问题,满足我们的实际需求,使用进程同步机制来进一步调整进程的顺序
进程互斥
对临界资源的访问逻辑上划分
对临界资源进行互斥访问的时候,遵循的原则
知识点小结
- 进程同步可以称为进程之间的直接制约关系,进程互斥可以理解为进程之间的间接制约关系
进程互斥的软件实现方法
本节考察频率比较高,小题,大题都可能出
互斥的重要性
单标志法
- 思想:检查自己是否可以用,如果可以用,用完之后让给对方
- 解决的问题:同一时刻最多允许一个进程访问临界区
- 存在的问题:违背空闲让进原则。
- 自己让出去之后,对方一直不用,自己也一直得不到
双标志先检查法
- 思想:先看对方是否有意愿(上锁),如果对方没有则自己表达意愿(上锁),自己开始用,用完再解锁
- 解决的问题:
- 存在的问题:违反忙则等待原则
- 检查上锁和自己上锁不是一气呵成的,导致出现并发问题,即,双发现对方不同,都给自己上了锁,都访问了临界区
双标志后检查法
- 思想:先上锁,再看对方有没有上锁,如果对方没有上锁,则开始访问
- 解决的问题:解决了忙则等待,不会同时访问临界区
- 存在的问题:违反空闲让进,有限等待原则,产生饥饿现象
- 还是并发问题,双方都上了锁,又都发现对方上了锁,谁都用不了
Peterson算法
- 思想:表达意愿,作出谦让,如果对方没意愿或者自己没有让给对方,则自己执行
- 解决的问题:解决了并发问题,忙则等待,空闲让进
- 存在的问题:没有遵循让权等待原则,即,如果自己进不了临界区,则一直在while上循环,也在占用CPU资源
- 个人理解,还是两个标志,flag(各自的)表示想用,turn(共用的)表示谁可以用,只有两个条件同时满足才可以,并且判断条件中,flag和turn是一气呵成判断的
- 相比之前三种方案还是最好的
知识点小结
- 软件实现互斥的方案,大多都是这两个核心的思想,谦让和意愿
- 双标志先检查策略,如果检查和上锁可以一气呵成,其实也是满足需求的
进程互斥的硬件实现方法
中断屏蔽方法
- 思想:关中断后,不会再发生进程切换
- 解决的问题:简单,高效
- 存在的问题:关中断只作用在当前处理机上,因此不适用于多处理机;不适用于用户进程,因为中断指令只能运行在内核态,因此只能适用于操作系统内核进程
- 关中断就像是在硬件层面开了挂一样
TestAndSet指令
- 图中用代码表示逻辑,实际上是硬件实现的
- 思想:检查是否上锁(old),自己上个锁(新的lock),如果old已经上锁,则继续循环等待,如果old没有上锁,则执行临界区代码,最后再解锁
- 本质上就是硬件层面实现了检查并上锁一气呵成完成
- 优点:实现简单,适用于多处理机
- 缺点:不满足让权等待,循环等待时会一直执行TSL指令,占用CPU资源
Swap指令
- 又叫Exchange指令,或简称XCHG指令
- 图中表示逻辑,实际也是硬件实现的
- 思想:如果已经上锁(old),则循环等待,并且让让lock和old做交换(其实就是为了让lock也表示上锁的含义);如果发现old解锁了,则跳出循环,访问临界区,执行完,lock解锁
- 逻辑上和TSL指令是一样的,只是硬件层面上实现不一样
- 优缺点和TSL指令一样
互斥锁
互斥锁
- 解决临界区的一个工具,进入临界区时获得锁,退出临界区时释放锁
- 互斥锁通常采用硬件机制实现,因为需要原子操作
- 所有的自旋锁和互斥锁,都有忙等的问题
忙等的特点
- 优点:适用于多处理系统,一个执行任务,另一个等待;如果上锁的时间段,等待的那个甚至不用切换进程,等到解锁,再得到锁
- 缺点:不适合单处理机系统,忙等的过程就是在占用时间片,这个期间真正有锁的任务也执行不了,一定要等到忙等的时间片结束,有锁的进程执行完了,才有机会重新忙等并得到锁
信号量机制
信号量机制
- 信号量是一种变量,反映了当前资源的可用数量;信号量可以是整型,也可以是记录型
- 系统使用原语操作信号量,一气呵成,避免出现并发和异步带来的问题(比如,检查和上锁不能一气呵成的问题)
- 一对原语,wait(S)和signal(S),理解为两个函数,S就是信号量,作为入参
- wait和signal原语简称P,V操作,做题时通常写为P(V),V(S)
信号量机制–整型信号量
- 使用整型变作为信号量
- 操作流程
- 初始化整型信号量资源
- 进程需要使用资源,先执行wait,检查信号量是否够用,如果不够用,则循环等待
- 如果够用,则信号量-1,开始访问临界资源
- 访问完临界资源,执行signal,信号量+1,释放资源
- 思考:整型信号量的wait操作在逻辑上,其实就是先检查后上锁,但是通过原语实现了一气呵成
- 问题:如果资源数不够,还是要循环等待,不满足让权等待问题
- 咸鱼提出的问题:如果资源数不够,难道要一直卡在wait原语里么?wait原语不可被中断,难道这个进程一直不被切换?这里我们姑且认为,没有问题,wait不会一直占用
信号量机制–记录性信号量
- 信号量的类型为记录型,包括一个变量表示剩余资源数,一个变量表示等待队列
- wati原语:先将资源-1,再判断资源数的值,如果<0,表示已经没有可用资源了,则使用block让当前进程进入到阻塞状态,并进入信号量的等待队列
- signal:先资源数量+1,在判断资源数的值,如果<=0,表示还有进程在等待队列,则使用wakeup唤醒等待队列中的一个进程,让其从阻塞态变为就绪态,给他分配资源
举例
- 流程:初始资源为2,P0使用拿到资源(value=1),P1使用拿到资源(value=0),P2使用拿不到(value=-1),P3使用拿不到(value=-2),P0用完给P2用(value=-1),P1用完给P3用(value=0),P2用完(value=1),P3用完(value=2)
代码总结
- 个人理解:
- 资源数反应了是否可用?如果可用,有多少可用;如果不可用,有多少在等待
- 等待队列反应了哪些进程在等,如果有资源可用,可以找到进程并唤醒
- 原语操作保证不会出现并发,异步的问题
- 进程等待时处于阻塞态,不会出现忙等情况,满足了让权等待的原则
知识点小结
- 记录型信号量是操作系统最重要的考点,大题小题都考,
- 整型信号量主要考察存在的问题
- 理解,自己写伪代码流程
- 题中出现PV操作,除非特殊说明,否则默认为记录型信号量,不会出现忙等问题
用信号量机制实现进程互斥,同步,前驱关系
信号量机制实现进程互斥
- 对于记录性信号量,如果题中没有特殊说明,我们可以把记录性信号量的声明简化为,直接给资源数量初始化数值就可以了
- 只要我们使用semaphore这个变量开头,就是表示这是个记录型信号量
- 不同的临界资源,使用不同的互斥信号量
- PV操作必须成对出现
进程同步
- 什么是进程同步?让各个并发进程按照要求有序的推进
信号量机制实现进程同步
- 找出需要同步关系地方,一对一对出现
- 设置同步信号量为0,注意这里和互斥的设置不一样
- P2想先执行,结果被P操作阻塞,直到P1中V操作完成释放资源,P2才能继续进行
- 口诀:前V后P,在前操作之后执行V,在后操作之前执行P
信号量机制实现前驱关系
- 本质上是更复杂的一种多级同步关系
- 给每一对需要实现同步关系的操作都进行“前V后P”
知识点小结
- 几乎每年大题都考察信号量机制问题
生产者消费者问题
问题描述
- 同步问题:缓冲区没有满,生产者才能存入数据;缓冲区有数据,消费者才能取出数据;
- 互斥问题:防止多个进程同时操作同一个存储地址,导致数据覆盖
问题分析
- 找出隐藏的两对同步关系PV,各个进程之间的互斥关系PV
- empty信号先有V操作,才能有生产者P操作;full信号先有V操作,才能有消费者P操作
- 各个进程的临界区设置互斥PV
- 同步关系的信号量分别是缓冲区的已有数据量和空位量;互斥信号量一般设为1,各个进程共用
代码实现
- 实现互斥的操作是在同一个进程内实现的
- 实现两个进程的同步关系是在两个进程中实现的
能否改变相邻PV的顺序
- P操作:必须先执行同步P,再执行互斥P,如果按照图中调换顺序,就会出现死锁,互相等待,一个在同步P等,一个在互斥P等
- V操作:可以颠倒顺序,因为V操作不会导致阻塞,谁先执行都能走完
- 生产产品和使用商品是否可以放到PV之间?逻辑上可以,但是不推荐,因为会导致临界区代码量过大,降低系统效率
知识点小结
- 重点要抓住题中的隐含的两对同步关系,找出是谁在等谁
多生产者-多消费者问题
问题描述
- 所谓多,指多个类别的生产者,多个类别的消费者
问题分析
- 找出同步关系,互斥关系
- 确定PV操作的顺序
如何实现
如果去掉互斥信号量
- 在本例中,如果去掉互斥信号量,也能满足同步和互斥关系,因为缓冲区大小为1
- 如果盘子容量为2,就会出现互斥问题
- 结论,如果缓冲区大小为1,不设置互斥信号量,有可能仍然满足互斥关系,不是绝对,是有可能,需要具体问题具体分析
知识点小结
- 做题时,如果能分析出可以不用设置互斥信号量,可以不设置,如果时间来不及,加上也确保不会出现互斥问题
- 一定要注意互斥P和同步P的前后关系
- 分析多生产者-多消费者问题,不能从单个进程角度分析(左图),而是从前因后果的事件角度分析(右图)
吸烟者问题
问题描述
- 本质上还是供应者和消费者问题
- 与前面小结的区别在于,一个供应者可以按一定顺序或随机,给多个消费者提供不同的信号量
问题分析
- 本例中,缓冲区为1,所以不设置互斥信号量也能实现互斥访问临界区
如何实现
- 这里的i递增,通过对3取余实现对三个消费者轮流提供商品
- 由于初始缓冲区空闲,初始就可以生产,所以生产的同步P放在了后面
知识点小结
- 王道书关于i使用的随机数,实现的是生产者随机生产,本例中采用的轮流方式
读者写者问题
问题描述
- 区分:这里的读与消费者不同,读不会改变数据,消费者会取出数据从而改变数据
- 个人理解:对于一个文件的操作,有三种可能的状态,被一个进程写,被一个或多个进程读,没有任何操作
问题分析
- 关系分析:这个模型中存在几个互斥关系。读-读,读-写。写-写不互斥
- 实现思路:根据流程确定PV组合以及顺序,设置信号量,互斥信号量一般设置为1
如何实现
- rw用于实现对共享文件的互斥访问
- 写的操作当然是前后加锁,屏蔽其他进程
- 读的操作,第一个进程负责读,最后一个进程负责写;因此,如果有进程在读了,新来的读进程就会绕开P(rw),不会被阻塞
- 存在的问题:如果有读者并发进入,都发现count=0,就会导致一个读者通过,另一个读者阻塞在P(rw)位置
- 问题的原因:对count的检查和赋值没有一气呵成,对count的操作不是一气呵成的
对count的访问设置互斥信号量
- 这样,只有第一个进程检查并赋值count之后,第二个并发进程才能开始从P(mutex)解除阻塞
- 存在的问题:只要第一个读进程访问了文件,后续有读进程源源不断的进来,写进程就一直没有机会操作文件,出现饥饿现象
实现写优先
- 再设置一个互斥信号w,加上一层PV
- 这个互斥w,实现了读进程与写进程中count操作的互斥,因此,即使当前有读进程在操作,当来了一个写进程进行了P(w)操作,后续也不会再有新的读进程操作文件,因为新的读进程会在P(w)出阻塞
- 由于PV操作信号量具有队列的功能,因此当读和写进程并发进入的时候,在P(w)处,会按照到来的先后顺序解除阻塞
- 因此,这个算法并不算是真正的写优先,而是实现了读写的相对公平,有的书也称为读写公平法
- 真正的写优先,可以上网上找答案
知识点小结
- 思路:为了实现对count操作的一气呵成,采用互斥信号量,一气呵成并不是一个进程一定能一气呵成执行完,依然会进程切换,但是确保了对count的访问是互斥的,即使其他进程切换过来想访问count,也是被阻塞
- 考试中的大部分大题PV,一般用生产者消费者都可以实现(主要解决同步问题),再复杂可以考虑读者写者模型(主要解决互斥问题)
哲学家进餐问题
问题描述
- 每个临界资源的访问是互斥的,但是每个进程只有同时持有两个临界资源才能继续往下执行
- 解决问题的关键是如何分配临界资源,避免产生死锁现象
- 给筷子编号,给哲学家编号
问题分析
- 对哲学家拿起两根筷子,分别做P操作,吃饭完在把两根筷子分别做V操作
- 存在的问题:如果每个哲学家并发进行,同时拿起左边的筷子,结果都去等待右边的筷子,就会出现死锁
如何避免死锁现象
- 方案一
- 最多只允许四个哲学家吃饭,最后一定会剩余一根筷子,那么这个四个要吃饭的哲学家里就会至少有一个哲学家吃到饭
- 即使其他哲学家阻塞等待另一个筷子,等两双筷子的哲学家吃饭完,就会释放筷子,其他哲学家也能吃到饭,不会死锁
- 方案二
- 奇数号哲学家先拿左边,再拿右边,偶数号正好相反,这样就会有两个哲学家争抢一个筷子
- 避免了所有哲学家都拿着一个筷子,却又等待另一筷子的死锁问题
- 方案一二自己实现
方案三
- 设置为,只有当一个哲学家两边的筷子都能使用时,才拿筷子
- 在进程拿左右筷子的外层再加一个互斥信号量操作
- 具体的不同情况的执行流程,自己推导,或者看视频
- 注意
- 存在情况,即使一个哲学家左右都有筷子,也被阻塞;
- 存在情况,即使一个哲学家只有左手筷子,但是也拿起来了,并且阻塞等待
- 书中说这种方案为,只有当哲学家两边的筷子都能拿时才拿起筷子,并不严谨;更准确的说法是,mutex信号量保证了哲学家拿筷子这件事是互斥的。这样保证了,即使一个哲学家拿到一个筷子并阻塞,也不会再有其他哲学家再筷子了,因为一双筷子的哲学家还没有执行V操作
- 从PV操作mutex包裹在左右筷子P的外面也能理解到这层含义
知识点小结
- 哲学家进餐问题是更加复杂的互斥关系问题,如果一个进程需要同时持有多个临界资源时,考虑这个模型
- 三种解决问题思路
管程
为什么要引入管程
- 管程是一种高级同步机制
- 比之前的信号量机制更方便易用
管程的定义和基本特征
- 一组过程其实就是函数
- 管程的定义很像面向对象语言中的类,类里面有共享数据,有函数
- 共享数据的修改只能由管程的函数实现,同一时刻只能允许一个进程在管程内执行某个过程
伪代码演示
- 有了管程定义好的函数,生产者消费者只需要调用函数即可,无需考虑进程同步和互斥问题,管程内部会实现同步和互斥的需求
- 编译器会实现各个进程互斥的进入管程中的过程
- 有了管程,实现同步和互斥变得更简单,我们只需要关注如何实现程序的功能即可
用管程解决生产者消费者问题
Java中类似于管程的机制
- 关键字synchronized
知识点小结
- 考试常考点,红色标记,管程的两个基本特征,出选择题
- 管程应用了封装思想
死锁的概念
什么是死锁
- 并发环境下,各个进程因为竞争资源而造成的互相等待对方手里的资源,导致各个进程都阻塞,都无法向前推进的现象
- 发生死锁后,若无外力干涉,这些进程都将无法向前推进
死锁,饥饿,死循环的区别
死锁的必要条件
- 只要任意一条不成立,死锁就不会发生
什么时候会发生死锁
- 对不可剥夺资源的不合理分配,可能导致死锁
死锁的处理策略
知识点小结
- 死锁,饥饿,死循环区分是考察热门;循环等待条件也是考察热门
死锁的处理策略-预防死锁
破坏互斥条件
- 比如spoolLing技术打印机,各个进程发出的使用打印机的请求被输出进程接收,输出进程根据实际情况,依次打印输出
- 在各个进程看来,打印机并不是互斥访问的,打印请求可以及时接收
- 缺点:很多时候都无法破坏互斥条件
破坏不剥夺条件
- 抢不到就放弃当前的资源;抢别人的持有资源
- 缺点:实现比较复杂;容易导致前一阶段工作失效;降低系统吞吐量;导致进程饥饿
破坏请求和保持条件
- 进程运行前,一次性申请到所需的全部资源,不能全满足就不运行
- 缺点:资源利用率低,可能导致某些进程饥饿(因为C的运行条件更苛刻了)
破坏循环等待条件
- 缺点:不方便添加新设备,甚至需要重新编号;编号递增顺序可能不一致,导致资源浪费;编程麻烦
知识点小结
- 本节考点可能和死锁产生条件结合在一起考
- 不必死记硬背,重要理解
死锁额处理策略–避免死锁(银行家算法)
安全序列举例
安全序列,不安全序列,死锁的联系
- 安全序列,只要能找出一个安全序列,就是安全状态,
- 系统处于安全状态,一定不会发生死锁;系统进入不安全状态,可能发生死锁;发生死锁时,一定是处在不安全状态(选择题)
- 银行家算法思想:预先判断这次分配会不会导致系统进入不安全状态
银行家算法步骤
- 上面的例子中只有钱这一种资源,对于计算机系统,我们把单维数字变为多维向量
- 用已有资源数量,减去各个进程已分配,得出剩余资源数;再求出,各个进程还需要多少资源
- 用剩余的资源区分别对比各个进程还需要多少资源,
安全性算法
- 如果剩余资源数量有满足某些进程剩余需求的,说明这个进程是安全序列,且这个进程执行完,还要把资源返还
- 图中给出了P1 P3的确定方案,以此类推,得出了线程的执行顺序,这就是一个安全序列
- 这个算法称为安全性算法
手算安全性算法
- 实际考试可以用手算法求解,更快捷
- 当前剩余资源3.3.2可以满足P1和P3,那么P1 P3直接进入安全序列,P1和P3的已分配数量直接加入到剩余资源中
- 同理完善整个序列
找不到安全序列的例子
- P1和P3可以满足,但是当P1和P3加入并归还资源以后,剩余资源无法满足剩余的任何进程的需求,说明系统处于不安全状态
银行家算法一般解决步骤
- 按照图中列出各个资源数据
- 如果此时来一个请求,按照以下四个步骤执行
- 一二步是正常执行,第三步是试探着并非真的分配,
- 第四步,进行安全性算法,也就是看能不能找到一个完整的安全序列
- 如果四步得出安全,则正式分配,
- 如果第四步得出不安全,恢复数据,不答应进程的请求,让进程阻塞
知识点小结
- 本节十分重要,小题大题都可能出
- 银行家算法是用于避免死锁的最著名方法
死锁的处理策略–检测和解除
死锁的检测
死锁的检测
- 根据图的信息,检测进程是否可以执行完,
- 如果某一个进程能得到足够资源,则进程可以执行完,把这个进程连着的边消掉,
- 相邻的结点也回收的响应的资源
- 再看其他进程是否能执行,知道最后所有进程都可以执行完,这个图就是可完全简化的,一定不会死锁
- 如果不能完全消除,说明发生了死锁
- 刚才不断处理进程的过程,其实就是在找一个安全序列
书本上的死锁的检测方法
- 第一点,不阻塞就是申请的资源可以满足需求,不是孤点指与这个进程至少有一个相连;若满足条件,消去这个进程的请求边和分配边,使之成为孤点
- 前一个进程释放了资源,其他进程可能因为资源足够了而被唤醒,继续消除
- 若能消除所有边,则该图是可完全可简化的,这个过程就像消消乐
死锁的解除
- 化简之后还连着边的就是死锁进程,这里解除死锁帧针对的是还连着边的,已经被消除的就不用管了
- 对谁动手
- 优先级低的先下手
- 执行时间长的,回退或撤销代价更大
- 优先让马上能结束的进程优先获得资源
- 有更多资源的优先处理
- 用户对交互式进程比较敏感,批处理式一般在后台,用户不容易感知,优先处理批处理式的
知识点小结
- 考试常考死锁检测,理解资源分配图的结点什么意义
- 理解记住死锁检测算法
- 题中一般会给出资源分配图,小心与数据结构联动
- 死锁的解除一般只在选择题里出现
操作系统学习笔记(1.计算机系统概述 2.进程与线程)相关推荐
- 【操作系统学习笔记】—— 【二】进程、线程、死锁
本文参考: JavaGuide 王道考研-操作系统 CS-Notes 文章目录 一.进程的概念.组成.特征 1. 概念 2. 进程的组成 PCB 程序段 数据段 3. 进程的特征 二.进程的状态 三. ...
- 王道操作系统课代表 - 考研计算机 第二章 进程与线程 究极精华总结笔记
本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 操作系统 知识点的理解的总结.希望对新一届的计算机考研人提供帮助!!! 关于对 进程与线程 章节知识点总结的十分全面,涵括了< ...
- Python学习笔记(四)——IO|进程和线程
0x07 IO 编程 1.读取文件 要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符: >>> f = open('/Users/mich ...
- 操作系统学习笔记-2.1.4进程通信
操作系统学习笔记-2019 王道考研 操作系统-2.1.4进程通信 文章目录 4进程通信 4.1知识总览 4.2前置知识:什么是进程通信? 4.3共享存储 4.4 管道通信 4.5消息传递 4.6小结 ...
- 操作系统学习笔记-2.1.3进程控制
操作系统学习笔记-2019 王道考研 操作系统-2.1.3进程控制 文章目录 3.进程控制 3.1知识概览 3.2 基本概念 3.2.1什么是进程控制? 3.2.2如何实现进程控制? 3.3进程控制相 ...
- 操作系统学习笔记-2.1. 2进程的状态与转换
操作系统学习笔记-2019 王道考研 操作系统-2.1. 2进程的状态与转换 文章目录 2进程的状态与转换 2.1知识概览 2.2进程的状态-三种基本状态 2.3进程的状态-另外两种状态 2.4进程状 ...
- 操作系统学习笔记-2.1.1.进程的定义、组成、组织方式、特征
操作系统学习笔记-2019 王道考研 操作系统-2.1.1.进程的定义.组成.组织方式.特征 文章目录 2.1.1.进程的定义.组成.组织方式.特征 1.1知识概览 1.2进程的定义 1.3进程的组成 ...
- 操作系统学习笔记目录(暂时不全223)
操作系统学习笔记目录章节汇总 (暂时不全,目前只有第一章+第二章-浅谈线程,进程-2020.3.6) 文章目录 操作系统学习笔记目录章节汇总 1.打开钢琴的盖子(序章) 1.1-操作系统的概念(定义) ...
- 操作系统学习笔记-01-操作系统的概念(定义),功能和目标
操作系统学习笔记-2019 王道考研 操作系统-01-操作系统的概念(定义),功能和目标 文章目录 1-操作系统的概念(定义),功能和目标 1.1常见的操作系统 1.2概念(定义) 1.3-操作系统的 ...
最新文章
- Socket,非阻塞,fcntl
- linux中的nm命令
- 西安交通大学17年9月课程考试计算机应用基础,西安交通大学17年9月课程考试《计算机应用基础》作业考核试题 (含主观题)...
- 百度搜索资源平台添加自己的网站
- win7乱码 字符集解决方案
- mysql的映射文件调用函数_MyBatis中调用存储过程和函数
- 模式对话框与非模式对话框的区别2
- WampServer
- ubuntu下如何查看和设置分辨率 (转载)
- internet download manager补丁_NS《古树旋律》推出免费追加乐曲补丁 含五首新曲!...
- AngularJS Documents 官方英文文档
- 机器学习-决策树--基础知识总结
- 安装linux版qq,安装二进制包编译器,安装mysql-5.6.11,删除已安装或安装失败的mysql-5.6.11,简单mysql练习题...
- 微信淘宝客实战经验分享
- 计算机连接网络显示有限访问权限,电脑WiFi连接总是提示有限的访问权限是什么意思...
- 中国广告协会的CAID方案
- 【我的新颖社区社交产品架构构思设想】
- IOT连接阿里云(一):调试MQTT通路
- 说说我在机场碰上的那些大家喜闻乐见的事
- c语言释放链表所用内存,C语言利用链表实现有效内存管理
热门文章
- 红外弱小目标检测之“Asymmetric Contextual Modulation for Infrared Small Target Detection“阅读笔记
- 什么是计算机电源线,电脑电源线接法是什么?(电脑电源线接法的相关内容)...
- 《音乐之声》萨尔斯堡的歌声如此旖旎
- python基本语法—列表
- vsnprintf不能正确打印浮点数
- [元带你学NVMe协议] NVMe 协议基本概念和架构
- openssl将各种格式证书转换
- EXCEL中一列(行)转多行多列或多行多列转一列(行)
- Excel 多列变一列(亲自实践)
- 抖音高贵气质的签名_2018抖音个性签名精选经典又内涵 霸气有魅力的抖音签名大全...