操作系统笔记

Posted Keep--Silent

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统笔记相关的知识,希望对你有一定的参考价值。

目录

第一章 计算机系统概述

1.1基本概念

1.1.1操作系统的基本概念

  1. 概念定义
    1. 负责管理协调硬件、软件等计算机资源工作
    2. 为上层用户、应用程序提供简单易用的服务
    3. 是一种系统软件
  2. 功能和目标
    1. 资源管理者
      1. 处理机管理
      2. 存储器管理
      3. 文件管理
      4. 设备管理
    2. 向用户提供服务
      1. 命令接口
      2. 联机命令接口
      3. 脱机命令接口
      4. 程序接口:由一组系统调用(广义指令)组成
      5. GUI用户图形界面
    3. 对硬件机进行扩展 :扩充机器

1.1.2特征

  1. 并发
  2. 共享
    1. 互斥共享
    2. 同时共享
  3. 虚拟
    1. 空分复用技术(虚拟存储技术)
    2. 时分复用技术(虚拟处理机技术)
  4. 异步
    注意并发并行的区别。
    并发共享是操作系统两个最基本的特征,两者之间互为存在的条件:①资源共享是以程序的并发为条件的,若系统不允许程序并发执行,则自然不存在资源共享问题;②若系统不能对资源共享实施有效的管理,则必将影响到程序的并发执行,甚至根本无法并发执行。

1.2操作系统发展历程

  1. 手工操作阶段:缺点:人机速度矛盾
  2. 批处理阶段
    1. 单道批处理系统
      1. 优点:一定程度上缓解了人机速度矛盾
      2. 缺点:资源利用率还是很低
    2. 多道批处理系统(操作系统开始出现
      1. 优点:多道程序并发执行,资源利用率高
      2. 缺点:不提供人机交互功能
  3. 分时操作系统
    1. 优点:提供人机交互功能
    2. 缺点:不能优先处理紧急任务
  4. 实时操作系统
    1. 硬实时操作系统:必须在严格的规定时间内完成处理
    2. 软实时操作系统:能接受偶尔违法规定时间
    3. 优点:可靠性,及时性(能优先处理紧急任务
  5. 网络操作系统
  6. 分布式操作系统
  7. 个人计算机操作系统

1.3操作系统运行环境

操作系统运行机制和体系机构

  1. 运行机制
    1. 两种指令
      1. 特权指令
      2. 非特权指令
    2. 两种处理机状态
      1. 核心态
      2. 用户态
    3. 两种程序
      1. 内核程序
      2. 应用程序
  2. 操作系统内核
    1. 时钟管理:实现计时功能
    2. 中断处理:负责中断机制
    3. 原语:
      1. 是一种特殊的程序
      2. 处于操作系统最底层,是最接近硬件的部分
      3. 原子性:运行一气呵成,不可中断
      4. 运行时间较短,调用频繁
    4. 对系统资源进行管理的功能
      1. 进程管理
      2. 存储器管理
      3. 设备管理
  3. 体系结构
    1. 大内核
      1. 优点:高性能
      2. 缺点:内核代码庞大,结构混乱,难以维护
    2. 微内核
      1. 优点:内核功能少,结构清晰,方便维护
      2. 缺点:需要频繁地在核心态和用户态直接切换,性能低
  • 特权指令只能在核心态下执行
  • 内核程序只能在核心态下执行
  • 用户态到核心态是通过中断实现的,而且中断时唯一途径
  • 访管指令是非特权指令,是核心态唯一不执行的指令

1.3.2中断与异常

  1. 中断机制的产生:为了实现多道程序并发执行而引入的一种技术
  2. 中断的概念和作用:
    1. 发生中断,就意味着需要操作系统进入开展工作,CPU 会立即进入核心态
    2. “中断”是CPU 从用户态进入核心态的唯一途径
  3. 中断的分类:
    1. 内中断(异常、例外,陷入)
      1. 自愿中断–指令中断,如访管指令trap
      2. 强迫中断
        1. 硬件故障,如缺页
        2. 软件中断,如整数除0
    2. 外中断(狭义上的中断)
      1. 外设请求,如I/O操作完成后发出的中断信号
      2. 人工干预,如用户强行终止一个进程
  4. 补充:内中断的另一种分类方式
    1. 陷阱、陷入(trap):有意为之的异常,如系统调用
    2. 故障(fault):由错误条件引起的,可能被故障处理程序修复,如缺页
    3. 中止(abort):不可恢复的致命错误造成的结果,不再返回应用程序
  5. 外中断的处理过程
    1. 每条指令执行结束后,CPU 检查是否有外部中断信号
    2. 如果有外部中断信号,则需要保护被中断进程的CPU 环境
    3. 根据中断信号类型转入相应的中断处理程序
    4. 恢复原进程的CPU 环境并退出,返回原程序继续往下执行

1.3.3系统调用

功能分类

  1. 设备管理:完成设备的请求/释放/启动等功能
  2. 文件管理:完成文件的读/写/创建/删除等功能
  3. 进程管理:完成进程的创建/撤销/阻塞/唤醒等功能
  4. 进程通信:完成进程之间的消息传递/信号传递等功能
  5. 内存管理:完成内存的分配/回收等功能

1.4操作系统结构

  1. 分层法
    1. 定义:将操作系统分为若干层,最底层硬件,最高层为用户接口
    2. 优点
      1. 便于系统调试验证,简化系统的设计实现
      2. 易扩充和易维护
    3. 缺点
      1. 合理定义各层比较难,依赖关系固定后不够灵活
      2. 效率较差
  2. 模块化
    1. 定义:将操作系统按功能划分为若干具有一定独立性的模块
    2. 标准
      1. 内聚性,模块内部联系紧密度:越高越好
      2. 耦合度,模块间相互联系程度:越低越好
    3. 优点
      1. 提高了操作系统设计的正确性、可理解性和可维护性
      2. 增强了操作系统的可适应性
      3. 加速了操作系统的开发过程
    4. 缺点
      1. 模块间的接口规定很难满足对接口的实际需求
      2. 各模块齐头并进,无法找到一个可靠的决定顺序
  3. 宏内核
    1. 定义:将系统的主要功能模块都作为一个紧密联系的整体运行在核心态
    2. 优点:各模块之间共享信息,能有效利用相互之间的有效特性,具有无可比拟的性能优势
    3. 缺点:随着操作系统需要提供的服务越来越复杂,操作系统的设计规模急剧增长
  4. 微内核
    1. 定义:将内核中最基本的功能保留在内核,而将那些不需要在核心态执行的功能移动到用户态
    2. 基本核心功能
      1. 与硬件处理紧密相关的部分
      2. 一些较基本的功能
      3. 客户和服务器之间的通信
    3. 基本功能
      1. 进程(线程)管理
      2. 低级存储器管理
      3. 中断和陷入处理
    4. 特点
      1. 扩展性和灵活性
      2. 可靠性和安全性
      3. 可移植性
      4. 分布式计算
  5. 外核
    1. 策略:对机器进行分区
    2. 任务:为虚拟机分配资源,并检查使用这些资源的意图
    3. 优点
      1. 减少了映射层
      2. 将多道程序(在外核内)与用户操作系统代码(在用户空间内)加以分离

1.5操作系统引导

引导过程
①激活CPU。激活的CPU读取ROM中的 boot程序,将指令寄存器置为Bios(基本输入/输出系统)的第一条指令,即开始执行BIOS的指令。
②硬件自检。启动BIOS程序后,先进行硬件自检,检查硬件是否出现故障。如有故障,主板会发出不同含义的蜂鸣,启动中止;如无故障,屏幕会显示CPU、内存、硬盘等信息。
③加载带有操作系统的硬盘。硬件自检后,BIOS开始读取Boot Sequence(通过CMOS里保存的启动顺序,或者通过与用户交互的方式),把控制权交给启动顺序排在第一位的存储设备,然后CPU将该存储设备引导扇区的内容加载到内存中。
④加载主引导记录MBR。硬盘以特定的标识符区分引导硬盘和非引导硬盘。如果发现一个存储设备不是可引导盘,就检查下一个存储设备。如无其他启动设备,就会死机。主引导记录MBR的作用是告诉CPU去硬盘的哪个主分区去找操作系统。
⑤扫描硬盘分区表,并加载硬盘活动分区。MBR包含硬盘分区表,硬盘分区表以特定的标识符区分活动分区和非活动分区。主引导记录扫描硬盘分区表,进而识别含有操作系统的硬盘分区(活动分区)。找到硬盘活动分区后,开始加载硬盘活动分区,将控制权交给活动分区。
⑥加载分区引导记录PBR。读取活动分区的第一个扇区,这个扇区称为分区引导记录(PBR),其作用是寻找并激活分区根目录下用于引导操作系统的程序(启动管理器)。
⑦加载启动管理器。分区引导记录搜索活动分区中的启动管理器,加载启动管理器。
⑧加载操作系统

1.6虚拟机

  1. 第一类虚拟机管理程序
  2. 第二类虚拟机管理程序

第二章 进程和线程

2.1进程和线程

2.1.1进程概念

  1. 定义:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
  2. 组成
    1. PCB
      1. 进程描述信息
        1. 进程标识符PID
        2. 用户标识符UID
      2. 进程控制和管理信息
        1. 进程当前状态
        2. 进程优先级
      3. 资源分配清单
        1. 程序段指针
        2. 数据段指针
        3. 键盘&鼠标
      4. 处理机相关信息:各种寄存器值
    2. 程序段:存放要执行的代码
    3. 数据段:存放程序运行过程中处理的各种数据
  3. 组织形式
    1. 链接方式:按照进程将PCB分为多个队列
    2. 索引方式:按照进程状态建立索引表,各表项指向PCB
  4. 特征
    1. 动态性:进程基本的特征
    2. 并发性:内存中有多个进程实体,各进程可并发执行
    3. 独立性:进程是系统进行资源分配和调度的独立单位
    4. 异步性:各进程以不可知的速度向前推进可能导致运行结果的不确定性
    5. 结构性:结构上看,进程都有程序段、数据段和PCB组成

2.1.2进程状态和转换

  1. 状态
    1. 运行状态:CPU :√, 资源:√
    2. 就绪状态:CPU :×, 资源:√
    3. 阻塞状态:CPU :×, 资源:×
    4. 创建状态:操作系统为新进程非陪资源,创建PCB
    5. 终止状态:操作系统回收进程资源,撤销PCB
  2. 转换
    1. 就绪态 → \\rightarrow 运行态:进程被调度
    2. 运行态 → \\rightarrow 就绪态:时间片到,或CPU 被其他高优先级的进程抢占
    3. 运行态 → \\rightarrow 阻塞态:等待系统资源分配,或等待某时间的发生(主动行为)
    4. 阻塞态 → \\rightarrow 就绪态:资源分配到位,等待事件的发生(被动行为)
    5. 创建态 → \\rightarrow 就绪态:系统完成创建进程的相关工作
    6. 运行态 → \\rightarrow 终止态:进程运行结束,或运行过程遇到不可恢复的错误

2.1.4进程控制

基本概念 功能:对系统所有进程实施有效管理,具有创建、终止、阻塞、唤醒、切换的功能 实现:用原语实现 基本概念\\left\\\\beginaligned &功能:对系统所有进程实施有效管理,具有创建、终止、阻塞、唤醒、切换的功能\\\\ &实现:用原语实现\\\\ \\endaligned\\right. 基本概念功能:对系统所有进程实施有效管理,具有创建、终止、阻塞、唤醒、切换的功能实现:用原语实现

  1. 创建
    1. 原语
      1. 申请空白PCB
      2. 为新进程分配所需资源
      3. 初始化PCB
      4. 将PCB插入就绪队列
    2. 事件
      1. 用户登录:分时系统中,用户成功登录,系统会为其建立一个新的进程
      2. 作业调度:多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程
      3. 提供服务:用户向操作系统提出某些请求时,会新建一个进程处理该请求
      4. 应用请求:由用户进程主动请求创建一个子进程
  2. 终止
    1. 原语
      1. 从PCB集合中找到终止进程的PCB
      2. 若进程正常运行,立即剥夺CPU ,将CPU 分配给其他进程
      3. 终止其所有子进程
      4. 将该进程拥有的资源全部归还给父进程或者操作系统
      5. 删除PCB
    2. 事件
      1. 正常结束
      2. 异常结束
      3. 外界干预
  3. 阻塞
    1. 原语
      1. 找到要阻塞的进程对应的PCB
      2. 保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂停其运行
      3. 将PCB插入对应事件的等待队列
    2. 事件
      1. 需要等待系统分配某种资源
      2. 需要等待相互配合的其他进程完成工作
  4. 唤醒
    1. 原语
      1. 再事件等待队列中找到PCB
      2. 将PCB从等待队列移除,设置进程为就绪态
      3. 将PCB插入就绪队列,等待被调度
    2. 事件:等待事件的发生
  5. 切换
    1. 原语
      1. 将运行环境信息装入PCB
      2. 将PCB移入相应队列
      3. 选择另一个进程执行,并更新其PCB
      4. 根据PCB恢复新进程所需的运行环境
    2. 事件
      1. 当前进程时间片到
      2. 有更高级的进程到达
      3. 当前进程主动阻塞
      4. 当前进程终止

2.1.5进程通信

  1. 共享存储
    1. 设置一个共享空间
    2. 要互斥地访问共享空间
    3. 方式
      1. 低级:基于数据结构
      2. 高级:基于存储区
  2. 消息传递
    1. 传递结构化的消息
    2. 系统提供“发送/接受 原语”
    3. 通信方式
      1. 直接:消息直接挂在接收方的消息队列
      2. 间接:消息先发送到中间体(信箱)
  3. 管道通信
    1. 设置一个共享文件(管道,即缓冲区)
    2. 一个管道只能实现半双工通信
    3. 实现双向同时通信需要建立两个管道
    4. 各进程互斥访问管道
    5. 写满时不能再写,读空时不能再读
    6. 没写满不能读,没读空不能写

2.1.6线程和多线程

  1. 线程概念和作用
    1. 概念:可理解为“轻量级进程”
    2. 作用:增加并发度,减少并发带来的开销
  2. 引入后的变化
    1. 资源分配
    2. 处理机调度
    3. (实现并发的)系统开销
  3. 属性
    1. 线程时处理机调度的单位,进程是资源分配的单位
    2. 同一进程的各线程共享进程拥有的资源
    3. 同一进程内的线程切换不会导致进程切换
    4. 多CPU 计算机中,各个线程占用不同大的CPU
    5. 每个线程都有一个ID,线程控制块(TCB)
    6. 线程也有就绪、阻塞、运行三种基本状态
    7. 线程几乎不拥有系统资源
    8. 由于共享内存地址空间(栈指针不共享),同一进程内的线程通信无须系统干预
    9. 不同进程的线程切换会引起进程切换
    10. 切换同进程的线程,开销很小
    11. 切换进程,开销很大
  4. 实现方式
    1. 用户级线程:从用户视角看的线程,有关线程管理的工作都由应用程序完成,无须内核干涉
    2. 内核级线程:从操作系统视角看的进程(内核级线程才是处理机分配的单位)
    3. 组合:用户级线程与内核级线程组合
  5. 多线程模型
    1. 多对一模型:
      1. 优点:进程管理开销小,效率高
      2. 缺点:并发度低:一个线程被阻塞,整个进程阻塞
    2. 一对一模型:
      1. 优点:各个线程分配到多核处理机并发执行,并发度高
      2. 缺点:开销大(需要到核心态
    3. 多对多模型:集合二者之长

2.2处理机调度

2.2.1 调度概念

  1. 基本概念:按照某种算法选择一个
  2. 层次
    1. 高级调度(作业调度):从后备队列中选择合适的作业将其调入内存,并为其创建进程
    2. 中级调度(内存调度):从挂起队列中选择合适的进程将其数据调回内存
    3. 低级调度(进程调度):从就绪队列中选择一个进程为其分配处理机
  3. 联系与对比
    1. 高级调度
      1. 外存 → \\rightarrow 内存(面向作业)
      2. 频率最低
    2. 中级调度
      1. 外存 → \\rightarrow 内存(面向进程)
      2. 频率中等
    3. 低级调度
      1. 内存 → \\rightarrow CPU
      2. 频率最高
  4. 补充
    1. 为了减轻系统分担,提高资源利用率,暂时不执行的进程会被调到外存从而变为挂起态
    2. 七状态模型:在五状态模型的基础上,加入了“就绪挂起”和“阻塞挂起”两种状态

2.2.2 调度目标

  1. C P U 利用率: C P U 有效工作时间 C P U 有效工作时间 + C P U 空闲等待时间 CPU 利用率:\\cfracCPU 有效工作时间CPU 有效工作时间+CPU 空闲等待时间 CPU利用率:CPU有效工作时间+CPU空闲等待时间CPU有效工作时间
  2. 系统吞吐量:单位时间内CPU 完成作业的数量
  3. 周转时间
    1. 周转时间:作业完成时间-作业提交时间
    2. 平均周转时间: ∑ i = 1 n 作业 i 的周转时间 n \\cfrac\\displaystyle\\sum^n_i=1作业i的周转时间n ni=1n作业i的周转时间
    3. 带权周转时间: 作业周转时间 作业实际运行时间 \\cfrac作业周转时间作业实际运行时间 作业实际运行时间作业周转时间
  4. 等待时间:进程处于等处理机的时间之和
  5. 响应时间:从用户提交请求 到系统首次产生相应所用的时间

2.2.3调度的实现

  1. 调度器
    1. 排队器
    2. 分派器
    3. 上下文切换器
  2. 时机
    1. 能调度
      1. 主动放弃
        1. 进程正常终止
        2. 运行过程异常终止
        3. 主动阻塞(如等待I/O)
      2. 被动放弃
        1. 分给进程的时间片用完
        2. 有更紧急的事情要处理(如I/O中断)
        3. 有更高优先级的进程进入就绪队列
    2. 不能调度
      1. 在处理中断的过程中
      2. 进程在操作系统内核程序临界区中
      3. 原子操作(原语)
  3. 切换与过程
    1. 切换过程
      1. 对原来运行进程各种数据的保存
      2. 对新的进程各种数据的恢复
    2. 重要结论:进程调度、切换是有代价的,不是调度越频繁,并发度越高
  4. 方式
    1. 非剥夺调度方式(非抢占式):只能由当前运行的进程主动放弃CPU
    2. 剥夺调度方式(抢占式):可由操作系统剥夺当前进程的CPU 使用权
  5. 闲逛进程:
    1. 没有就绪进程时,调度闲逛进程(idle)运行
    2. 闲逛进程不需要CPU 以外的资源,不会被阻塞
  6. 两种线程调度
    1. 用户级线程调度
    2. 内核级线程调度

2.2.4调度算法

高响应比优先

响应比 = 已等待时间 + 需要运行时间 需要运行时间 响应比=\\cfrac已等待时间+需要运行时间需要运行时间 响应比=需要运行时间已等待时间+需要运行时间

多级反馈队列调度算法

  • 多个队列,拥有多个优先级。第1队列最高,2次之,逐个降低
  • 每个队列运行时间不同。优先级越高,时间片越小。
  • 每个队列采用FCFS。新进程进入后放入第1队列末尾,在时间片内完成则撤离系统,未完成则转到下一个队列末尾。

对比

FCFSSJF
(SPF)
HHRNRRMFQ
先来先服务短作业优先
(短进程优先)
高响应比优先时间片轮转多级反馈队列
优点公平
实现简单
平均等待时间少
效率高
兼顾长短作业兼顾长短作业兼顾长短作业
有较好响应时间
可行性强
缺点不利于短作业长作业容易饥饿计算响应比的开销大平均等待时间长
上下文切换浪费时间
适用系统作业调度
批处理系统
分时系统相当实用
抢占与否非抢占抢占与非抢占抢占与非抢占抢占不一定
默认非抢占非抢占非抢占抢占抢占
## 2.3 同步与互斥

2.1.1进程同步互斥的基本概念

  1. 进程同步
    1. 并发带来了异步性,有时候需要通过进程同步来解决异步问题
    2. 有的进程之间需要相互配合地完成工作,各进程的工作推进需要遵循一定的先后顺序
  2. 进程互斥
    1. 对临界资源的访问,需要互斥的进行
    2. 组成
      1. 进入区:检查是否可以进入临界区,可进入则“上锁”
      2. 临界区:访问临界资源的那段代码
      3. 退出区:负责“解锁”
      4. 剩余区:其余部分代码
    3. 原则
      1. 空闲让进:临界区空闲时,应运行一个进程访问
      2. 忙则等待:临界区正在被访问时,其他视图访问的进程需要等待
      3. 有限等待:要在有限的时间内进入临界区,保证不会饥饿
      4. 让权等待:进不了临界区的进程,要释放处理机,防止忙等待

2.3.2实现临界区互斥的基本方法

软件实现

允许turn进程进入
flag[]:进程是否进入临界区

PiPj区域划分说明缺点
单标志法while(turn != 0);
critical section;
turn = 1;
remainder section;
while (turn != 1);
critical section;
turn = 0;
remainder section;
进入区
临界区
退出区
剩余区
i=0, j=1

进入区只检查,不上锁
退出区上锁自己,解锁对方
不遵循“空闲让进”
双标志先检查法while (flag[j]);
flag[i]=true;
critical section;
flag[i]=false;
remainder section;
while (flag[i]);
flag[j]=true;
critical section;
flag[j]=false;
remainder section;
进入区
进入区
临界区
退出区
剩余区
进入区检查后上锁
退出区解锁
不遵循“忙则等待”
双标志后检查法while (flag[j]);
flag[i]=true;
critical section;
flag[i]=false;
remainder section;
while (flag[i]);
flag[j]=true;
critical section;
flag[j]=false;
remainder section;
进入区
进入区
临界区
退出区
剩余区
进入区上锁后检查
退出区解锁
不遵循“空闲让进”
不遵循“有限等待”
Petersonflag[i]=true;
turn=j;
while (flag[j]&&turn==j);
critical section;
flag[i]=false;
remainder section;
flag[j]=true;
turn=i;
while (flag[i]&&turn==i);
critical section;
flag[j]=false;
remainder section;
进入区
进入区
进入区
临界区
退出区
剩余区
进入区“争取-谦让”
进入区检查对方想进和谦让结果
不遵循“让权等待”

硬件实现方法

  1. 中断屏蔽方法
    1. 使用“关/开中断”指令实现
    2. 优点:简单高效
    3. 缺点:只使用于单处理机;只适用于操作系统内核进程
  2. TestAndSet(TS/TSL)
    1. 过程
      1. old记录是否上锁
      2. lock设置为true
      3. 检查old是否上锁
      4. 上锁则重复上诉操作
    2. 优点:实现简单;适用于多出力系统
    3. 缺点:不满足“让权等待”
  3. Swap指令(XCHG,Exhange):逻辑同TS

2.3.4信号量

  1. 整型信号量:缺点:不满足“让权等待”原则
  2. 记录型信号量:优点:
    1. 实现了系统资源的申请和释放
    2. 实现了进程互斥和同步

整型信号量

int S;
wait(S)
    while (S <= 0);
    S--;

signal(S)
    S++;

记录型信号量

typedef struct
    int value;
    struct process *L;
semaphone;
//Process P
void wait(semaphone S)
    if(--S.value<0)
        P add to S.L;
        block(S.L);
    

void signal(semaphone S)
    if(++S.value<=0)
        remove P from S.L;
        wakeup(P);
    

整型信号量违背了让权等待原则。
记录型信号量可以阻塞和唤醒进程。

信号量机制

  1. 实现进程互斥
    1. 分析问题确定临界区
    2. 设置互斥信号量,初值为1
    3. 临界区之前对信号量进行P操作
    4. 临界区之后对信号量进行V操作
  2. 实现进程同步
    1. 分析问题,找出哪里需要实现“一前一后”的同步关系
    2. 设置同步信号量,初值为0
    3. 在“前操作”之后执行V操作
    4. 在“后操作”之前执行P操作
  3. 实现进程的前驱关系
    1. 分析问题,把每一对前驱关系看出一个同步问题
    2. 每一对前驱关系设置同步信号量,初值为0
    3. 在“前操作”之后执行V操作
    4. 在“后操作”之前执行P操作

2.3.5管程

  1. 引入缘由:解决信号量机制编程麻烦、易出错问题
  2. 组成(类)
    1. 共享数据结构
    2. 对数据结构初始化的语句
    3. 一组用来访问数据结构的过程(函数)
  3. 基本特征
    1. 各外部进程/线程只能通过管程提供的特定“入口”才能访问共享数据
    2. 每次仅允许一个进程在管程内执行某个内部过程
  4. 补充
    1. 各进程必须互斥访问管程的特性是由编译器实现的
    2. 可在管程中设置条件遍历及等待、唤醒操作以解决同步问题

2.3.6经典同步问题

实现互斥的P操作一定要在实现同步的P操作之后,即先P(S)再P(mutex),否则会导致死锁。

生产者-消费者问题

生产者消费者共享一块缓冲区,缓冲区不满生产者可以将消息放入缓冲区,否则必须等待;缓冲区不空消费者可以将消息从缓冲区取走,否则必须等待。缓冲区是临界资源,只允许生产者或消费者对其进行操作。
生产者和消费者对缓冲区是互斥关系,生产者和消费者又是同步关系,有生产物才可消费。

semaphore mutex = 1//互斥信号量
semaphore full = 0//缓冲区物品数量
semaphore empty = n; //缓冲区空闲区数量
producer()
	while(1)
		生产
		P(empty);//先检查缓冲区满没满
		P(mutex);//顺序不能反,如果先互斥,再检查缓冲区满了发生堵塞,导致死锁
		放入缓冲区
		V(mutex);
		V(full);
	

consumer()
	while(1)
		P(full);//先检查缓冲区里有没有东西
		P(mutex);
		取走
		V(mutex);
		V(empty);
	

多生产者-消费者问题

多个生产者是互斥关系,配对的生产者和消费者是同步关系。

semaphore plate = 1;//盘子的互斥量
semaphore orange = 0;//盘中橘子个数
semaphore apple = 0;//盘中苹果个数
dad()
	while(1)
		P(plate);
		放苹果
		V(apple);
	

mom()
	while(1)
		P(plate);
		放橘子
		V(orange);
	

son()
	while(1)
		P(orange);
		拿走橘子
		V(plate);
	

dau()
	while(1)
		P(apple);
		拿走苹果
		V(plate);
	

读者-写者问题

  1. 允许多个读者读
  2. 只允许一个写者写
  3. 任一写者写操作完成之前不允许其他读者或写者工作
  4. 写者写之前已有的读者和写者全部退出
    (3,4合一块就是写者写的过程中不允许别的打扰)
    读进程优先
semaphore count = 0;//当前读者数量
semaphore mutex = 1;//互斥信号量
semaphore rw = 1;//保证一个写者和其他所有互斥
writer()
	while(1)
		P(rw);V(rw);
	

reader()
	while(1)
		P(mutex)以上是关于操作系统笔记的主要内容,如果未能解决你的问题,请参考以下文章

王道操作系统笔记——— 内存管理的基本原理和要求

王道计算机组成原理笔记15 主存与CPU的链接

王道计算机组成原理笔记14 主存简单模型和寻址概念

JVM学习笔记 05 - JMM简述

内存管理 操作系统笔记整理系列

内存管理 操作系统笔记整理系列