操作系统笔记
Posted Keep--Silent
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统笔记相关的知识,希望对你有一定的参考价值。
目录
第一章 计算机系统概述
1.1基本概念
1.1.1操作系统的基本概念
- 概念定义
- 负责管理协调硬件、软件等计算机资源工作
- 为上层用户、应用程序提供简单易用的服务
- 是一种系统软件
- 功能和目标
- 资源管理者
- 处理机管理
- 存储器管理
- 文件管理
- 设备管理
- 向用户提供服务
- 命令接口
- 联机命令接口
- 脱机命令接口
- 程序接口:由一组系统调用(广义指令)组成
- GUI用户图形界面
- 对硬件机进行扩展 :扩充机器
- 资源管理者
1.1.2特征
- 并发
- 共享
- 互斥共享
- 同时共享
- 虚拟
- 空分复用技术(虚拟存储技术)
- 时分复用技术(虚拟处理机技术)
- 异步
注意并发和并行的区别。
并发和共享是操作系统两个最基本的特征,两者之间互为存在的条件:①资源共享是以程序的并发为条件的,若系统不允许程序并发执行,则自然不存在资源共享问题;②若系统不能对资源共享实施有效的管理,则必将影响到程序的并发执行,甚至根本无法并发执行。
1.2操作系统发展历程
- 手工操作阶段:缺点:人机速度矛盾
- 批处理阶段
- 单道批处理系统
- 优点:一定程度上缓解了人机速度矛盾
- 缺点:资源利用率还是很低
- 多道批处理系统(操作系统开始出现
- 优点:多道程序并发执行,资源利用率高
- 缺点:不提供人机交互功能
- 单道批处理系统
- 分时操作系统
- 优点:提供人机交互功能
- 缺点:不能优先处理紧急任务
- 实时操作系统
- 硬实时操作系统:必须在严格的规定时间内完成处理
- 软实时操作系统:能接受偶尔违法规定时间
- 优点:可靠性,及时性(能优先处理紧急任务
- 网络操作系统
- 分布式操作系统
- 个人计算机操作系统
1.3操作系统运行环境
操作系统运行机制和体系机构
- 运行机制
- 两种指令
- 特权指令
- 非特权指令
- 两种处理机状态
- 核心态
- 用户态
- 两种程序
- 内核程序
- 应用程序
- 两种指令
- 操作系统内核
- 时钟管理:实现计时功能
- 中断处理:负责中断机制
- 原语:
- 是一种特殊的程序
- 处于操作系统最底层,是最接近硬件的部分
- 原子性:运行一气呵成,不可中断
- 运行时间较短,调用频繁
- 对系统资源进行管理的功能
- 进程管理
- 存储器管理
- 设备管理
- 体系结构
- 大内核
- 优点:高性能
- 缺点:内核代码庞大,结构混乱,难以维护
- 微内核
- 优点:内核功能少,结构清晰,方便维护
- 缺点:需要频繁地在核心态和用户态直接切换,性能低
- 大内核
- 特权指令只能在核心态下执行
- 内核程序只能在核心态下执行
- 用户态到核心态是通过中断实现的,而且中断时唯一途径
- 访管指令是非特权指令,是核心态唯一不执行的指令
1.3.2中断与异常
- 中断机制的产生:为了实现多道程序并发执行而引入的一种技术
- 中断的概念和作用:
- 发生中断,就意味着需要操作系统进入开展工作,CPU 会立即进入核心态
- “中断”是CPU 从用户态进入核心态的唯一途径
- 中断的分类:
- 内中断(异常、例外,陷入)
- 自愿中断–指令中断,如访管指令trap
- 强迫中断
- 硬件故障,如缺页
- 软件中断,如整数除0
- 外中断(狭义上的中断)
- 外设请求,如I/O操作完成后发出的中断信号
- 人工干预,如用户强行终止一个进程
- 内中断(异常、例外,陷入)
- 补充:内中断的另一种分类方式
- 陷阱、陷入(trap):有意为之的异常,如系统调用
- 故障(fault):由错误条件引起的,可能被故障处理程序修复,如缺页
- 中止(abort):不可恢复的致命错误造成的结果,不再返回应用程序
- 外中断的处理过程
- 每条指令执行结束后,CPU 检查是否有外部中断信号
- 如果有外部中断信号,则需要保护被中断进程的CPU 环境
- 根据中断信号类型转入相应的中断处理程序
- 恢复原进程的CPU 环境并退出,返回原程序继续往下执行
1.3.3系统调用
功能分类
- 设备管理:完成设备的请求/释放/启动等功能
- 文件管理:完成文件的读/写/创建/删除等功能
- 进程管理:完成进程的创建/撤销/阻塞/唤醒等功能
- 进程通信:完成进程之间的消息传递/信号传递等功能
- 内存管理:完成内存的分配/回收等功能
1.4操作系统结构
- 分层法
- 定义:将操作系统分为若干层,最底层硬件,最高层为用户接口
- 优点
- 便于系统调试验证,简化系统的设计实现
- 易扩充和易维护
- 缺点
- 合理定义各层比较难,依赖关系固定后不够灵活
- 效率较差
- 模块化
- 定义:将操作系统按功能划分为若干具有一定独立性的模块
- 标准
- 内聚性,模块内部联系紧密度:越高越好
- 耦合度,模块间相互联系程度:越低越好
- 优点
- 提高了操作系统设计的正确性、可理解性和可维护性
- 增强了操作系统的可适应性
- 加速了操作系统的开发过程
- 缺点
- 模块间的接口规定很难满足对接口的实际需求
- 各模块齐头并进,无法找到一个可靠的决定顺序
- 宏内核
- 定义:将系统的主要功能模块都作为一个紧密联系的整体运行在核心态
- 优点:各模块之间共享信息,能有效利用相互之间的有效特性,具有无可比拟的性能优势
- 缺点:随着操作系统需要提供的服务越来越复杂,操作系统的设计规模急剧增长
- 微内核
- 定义:将内核中最基本的功能保留在内核,而将那些不需要在核心态执行的功能移动到用户态
- 基本核心功能
- 与硬件处理紧密相关的部分
- 一些较基本的功能
- 客户和服务器之间的通信
- 基本功能
- 进程(线程)管理
- 低级存储器管理
- 中断和陷入处理
- 特点
- 扩展性和灵活性
- 可靠性和安全性
- 可移植性
- 分布式计算
- 外核
- 策略:对机器进行分区
- 任务:为虚拟机分配资源,并检查使用这些资源的意图
- 优点
- 减少了映射层
- 将多道程序(在外核内)与用户操作系统代码(在用户空间内)加以分离
1.5操作系统引导
引导过程
①激活CPU。激活的CPU读取ROM中的 boot程序,将指令寄存器置为Bios(基本输入/输出系统)的第一条指令,即开始执行BIOS的指令。
②硬件自检。启动BIOS程序后,先进行硬件自检,检查硬件是否出现故障。如有故障,主板会发出不同含义的蜂鸣,启动中止;如无故障,屏幕会显示CPU、内存、硬盘等信息。
③加载带有操作系统的硬盘。硬件自检后,BIOS开始读取Boot Sequence(通过CMOS里保存的启动顺序,或者通过与用户交互的方式),把控制权交给启动顺序排在第一位的存储设备,然后CPU将该存储设备引导扇区的内容加载到内存中。
④加载主引导记录MBR。硬盘以特定的标识符区分引导硬盘和非引导硬盘。如果发现一个存储设备不是可引导盘,就检查下一个存储设备。如无其他启动设备,就会死机。主引导记录MBR的作用是告诉CPU去硬盘的哪个主分区去找操作系统。
⑤扫描硬盘分区表,并加载硬盘活动分区。MBR包含硬盘分区表,硬盘分区表以特定的标识符区分活动分区和非活动分区。主引导记录扫描硬盘分区表,进而识别含有操作系统的硬盘分区(活动分区)。找到硬盘活动分区后,开始加载硬盘活动分区,将控制权交给活动分区。
⑥加载分区引导记录PBR。读取活动分区的第一个扇区,这个扇区称为分区引导记录(PBR),其作用是寻找并激活分区根目录下用于引导操作系统的程序(启动管理器)。
⑦加载启动管理器。分区引导记录搜索活动分区中的启动管理器,加载启动管理器。
⑧加载操作系统。
1.6虚拟机
- 第一类虚拟机管理程序
- 第二类虚拟机管理程序
第二章 进程和线程
2.1进程和线程
2.1.1进程概念
- 定义:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位
- 组成
- PCB
- 进程描述信息
- 进程标识符PID
- 用户标识符UID
- 进程控制和管理信息
- 进程当前状态
- 进程优先级
- …
- 资源分配清单
- 程序段指针
- 数据段指针
- 键盘&鼠标
- …
- 处理机相关信息:各种寄存器值
- 进程描述信息
- 程序段:存放要执行的代码
- 数据段:存放程序运行过程中处理的各种数据
- PCB
- 组织形式
- 链接方式:按照进程将PCB分为多个队列
- 索引方式:按照进程状态建立索引表,各表项指向PCB
- 特征
- 动态性:进程基本的特征
- 并发性:内存中有多个进程实体,各进程可并发执行
- 独立性:进程是系统进行资源分配和调度的独立单位
- 异步性:各进程以不可知的速度向前推进可能导致运行结果的不确定性
- 结构性:结构上看,进程都有程序段、数据段和PCB组成
2.1.2进程状态和转换
- 状态
- 运行状态:CPU :√, 资源:√
- 就绪状态:CPU :×, 资源:√
- 阻塞状态:CPU :×, 资源:×
- 创建状态:操作系统为新进程非陪资源,创建PCB
- 终止状态:操作系统回收进程资源,撤销PCB
- 转换
- 就绪态 → \\rightarrow → 运行态:进程被调度
- 运行态 → \\rightarrow → 就绪态:时间片到,或CPU 被其他高优先级的进程抢占
- 运行态 → \\rightarrow → 阻塞态:等待系统资源分配,或等待某时间的发生(主动行为)
- 阻塞态 → \\rightarrow → 就绪态:资源分配到位,等待事件的发生(被动行为)
- 创建态 → \\rightarrow → 就绪态:系统完成创建进程的相关工作
- 运行态 → \\rightarrow → 终止态:进程运行结束,或运行过程遇到不可恢复的错误
2.1.4进程控制
基本概念 功能:对系统所有进程实施有效管理,具有创建、终止、阻塞、唤醒、切换的功能 实现:用原语实现 基本概念\\left\\\\beginaligned &功能:对系统所有进程实施有效管理,具有创建、终止、阻塞、唤醒、切换的功能\\\\ &实现:用原语实现\\\\ \\endaligned\\right. 基本概念功能:对系统所有进程实施有效管理,具有创建、终止、阻塞、唤醒、切换的功能实现:用原语实现
- 创建
- 原语
- 申请空白PCB
- 为新进程分配所需资源
- 初始化PCB
- 将PCB插入就绪队列
- 事件
- 用户登录:分时系统中,用户成功登录,系统会为其建立一个新的进程
- 作业调度:多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程
- 提供服务:用户向操作系统提出某些请求时,会新建一个进程处理该请求
- 应用请求:由用户进程主动请求创建一个子进程
- 原语
- 终止
- 原语
- 从PCB集合中找到终止进程的PCB
- 若进程正常运行,立即剥夺CPU ,将CPU 分配给其他进程
- 终止其所有子进程
- 将该进程拥有的资源全部归还给父进程或者操作系统
- 删除PCB
- 事件
- 正常结束
- 异常结束
- 外界干预
- 原语
- 阻塞
- 原语
- 找到要阻塞的进程对应的PCB
- 保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂停其运行
- 将PCB插入对应事件的等待队列
- 事件
- 需要等待系统分配某种资源
- 需要等待相互配合的其他进程完成工作
- 原语
- 唤醒
- 原语
- 再事件等待队列中找到PCB
- 将PCB从等待队列移除,设置进程为就绪态
- 将PCB插入就绪队列,等待被调度
- 事件:等待事件的发生
- 原语
- 切换
- 原语
- 将运行环境信息装入PCB
- 将PCB移入相应队列
- 选择另一个进程执行,并更新其PCB
- 根据PCB恢复新进程所需的运行环境
- 事件
- 当前进程时间片到
- 有更高级的进程到达
- 当前进程主动阻塞
- 当前进程终止
- 原语
2.1.5进程通信
- 共享存储
- 设置一个共享空间
- 要互斥地访问共享空间
- 方式
- 低级:基于数据结构
- 高级:基于存储区
- 消息传递
- 传递结构化的消息
- 系统提供“发送/接受 原语”
- 通信方式
- 直接:消息直接挂在接收方的消息队列
- 间接:消息先发送到中间体(信箱)
- 管道通信
- 设置一个共享文件(管道,即缓冲区)
- 一个管道只能实现半双工通信
- 实现双向同时通信需要建立两个管道
- 各进程互斥访问管道
- 写满时不能再写,读空时不能再读
- 没写满不能读,没读空不能写
2.1.6线程和多线程
- 线程概念和作用
- 概念:可理解为“轻量级进程”
- 作用:增加并发度,减少并发带来的开销
- 引入后的变化
- 资源分配
- 处理机调度
- (实现并发的)系统开销
- 属性
- 线程时处理机调度的单位,进程是资源分配的单位
- 同一进程的各线程共享进程拥有的资源
- 同一进程内的线程切换不会导致进程切换
- 多CPU 计算机中,各个线程占用不同大的CPU
- 每个线程都有一个ID,线程控制块(TCB)
- 线程也有就绪、阻塞、运行三种基本状态
- 线程几乎不拥有系统资源
- 由于共享内存地址空间(栈指针不共享),同一进程内的线程通信无须系统干预
- 不同进程的线程切换会引起进程切换
- 切换同进程的线程,开销很小
- 切换进程,开销很大
- 实现方式
- 用户级线程:从用户视角看的线程,有关线程管理的工作都由应用程序完成,无须内核干涉
- 内核级线程:从操作系统视角看的进程(内核级线程才是处理机分配的单位)
- 组合:用户级线程与内核级线程组合
- 多线程模型
- 多对一模型:
- 优点:进程管理开销小,效率高
- 缺点:并发度低:一个线程被阻塞,整个进程阻塞
- 一对一模型:
- 优点:各个线程分配到多核处理机并发执行,并发度高
- 缺点:开销大(需要到核心态
- 多对多模型:集合二者之长
- 多对一模型:
2.2处理机调度
2.2.1 调度概念
- 基本概念:按照某种算法选择一个
- 层次
- 高级调度(作业调度):从后备队列中选择合适的作业将其调入内存,并为其创建进程
- 中级调度(内存调度):从挂起队列中选择合适的进程将其数据调回内存
- 低级调度(进程调度):从就绪队列中选择一个进程为其分配处理机
- 联系与对比
- 高级调度
- 外存 → \\rightarrow → 内存(面向作业)
- 频率最低
- 中级调度
- 外存 → \\rightarrow → 内存(面向进程)
- 频率中等
- 低级调度
- 内存 → \\rightarrow → CPU
- 频率最高
- 高级调度
- 补充
- 为了减轻系统分担,提高资源利用率,暂时不执行的进程会被调到外存从而变为挂起态
- 七状态模型:在五状态模型的基础上,加入了“就绪挂起”和“阻塞挂起”两种状态
2.2.2 调度目标
- C P U 利用率: C P U 有效工作时间 C P U 有效工作时间 + C P U 空闲等待时间 CPU 利用率:\\cfracCPU 有效工作时间CPU 有效工作时间+CPU 空闲等待时间 CPU利用率:CPU有效工作时间+CPU空闲等待时间CPU有效工作时间
- 系统吞吐量:单位时间内CPU 完成作业的数量
- 周转时间
- 周转时间:作业完成时间-作业提交时间
- 平均周转时间: ∑ i = 1 n 作业 i 的周转时间 n \\cfrac\\displaystyle\\sum^n_i=1作业i的周转时间n ni=1∑n作业i的周转时间
- 带权周转时间: 作业周转时间 作业实际运行时间 \\cfrac作业周转时间作业实际运行时间 作业实际运行时间作业周转时间
- 等待时间:进程处于等处理机的时间之和
- 响应时间:从用户提交请求 到系统首次产生相应所用的时间
2.2.3调度的实现
- 调度器
- 排队器
- 分派器
- 上下文切换器
- 时机
- 能调度
- 主动放弃
- 进程正常终止
- 运行过程异常终止
- 主动阻塞(如等待I/O)
- 被动放弃
- 分给进程的时间片用完
- 有更紧急的事情要处理(如I/O中断)
- 有更高优先级的进程进入就绪队列
- 主动放弃
- 不能调度
- 在处理中断的过程中
- 进程在操作系统内核程序临界区中
- 原子操作(原语)
- 能调度
- 切换与过程
- 切换过程
- 对原来运行进程各种数据的保存
- 对新的进程各种数据的恢复
- 重要结论:进程调度、切换是有代价的,不是调度越频繁,并发度越高
- 切换过程
- 方式
- 非剥夺调度方式(非抢占式):只能由当前运行的进程主动放弃CPU
- 剥夺调度方式(抢占式):可由操作系统剥夺当前进程的CPU 使用权
- 闲逛进程:
- 没有就绪进程时,调度闲逛进程(idle)运行
- 闲逛进程不需要CPU 以外的资源,不会被阻塞
,
- 两种线程调度
- 用户级线程调度
- 内核级线程调度
2.2.4调度算法
高响应比优先
响应比 = 已等待时间 + 需要运行时间 需要运行时间 响应比=\\cfrac已等待时间+需要运行时间需要运行时间 响应比=需要运行时间已等待时间+需要运行时间
多级反馈队列调度算法
- 多个队列,拥有多个优先级。第1队列最高,2次之,逐个降低
- 每个队列运行时间不同。优先级越高,时间片越小。
- 每个队列采用FCFS。新进程进入后放入第1队列末尾,在时间片内完成则撤离系统,未完成则转到下一个队列末尾。
对比
FCFS | SJF (SPF) | HHRN | RR | MFQ | |
---|---|---|---|---|---|
先来先服务 | 短作业优先 (短进程优先) | 高响应比优先 | 时间片轮转 | 多级反馈队列 | |
优点 | 公平 实现简单 | 平均等待时间少 效率高 | 兼顾长短作业 | 兼顾长短作业 | 兼顾长短作业 有较好响应时间 可行性强 |
缺点 | 不利于短作业 | 长作业容易饥饿 | 计算响应比的开销大 | 平均等待时间长 上下文切换浪费时间 | |
适用系统 | 无 | 作业调度 批处理系统 | 无 | 分时系统 | 相当实用 |
抢占与否 | 非抢占 | 抢占与非抢占 | 抢占与非抢占 | 抢占 | 不一定 |
默认 | 非抢占 | 非抢占 | 非抢占 | 抢占 | 抢占 |
2.1.1进程同步互斥的基本概念
- 进程同步
- 并发带来了异步性,有时候需要通过进程同步来解决异步问题
- 有的进程之间需要相互配合地完成工作,各进程的工作推进需要遵循一定的先后顺序
- 进程互斥
- 对临界资源的访问,需要互斥的进行
- 组成
- 进入区:检查是否可以进入临界区,可进入则“上锁”
- 临界区:访问临界资源的那段代码
- 退出区:负责“解锁”
- 剩余区:其余部分代码
- 原则
- 空闲让进:临界区空闲时,应运行一个进程访问
- 忙则等待:临界区正在被访问时,其他视图访问的进程需要等待
- 有限等待:要在有限的时间内进入临界区,保证不会饥饿
- 让权等待:进不了临界区的进程,要释放处理机,防止忙等待
2.3.2实现临界区互斥的基本方法
软件实现
允许turn进程进入
flag[]:进程是否进入临界区
Pi | Pj | 区域划分 | 说明 | 缺点 | |
---|---|---|---|---|---|
单标志法 | 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; | 进入区 进入区 临界区 退出区 剩余区 | 进入区上锁后检查 退出区解锁 | 不遵循“空闲让进” 不遵循“有限等待” |
Peterson | flag[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; | 进入区 进入区 进入区 临界区 退出区 剩余区 | 进入区“争取-谦让” 进入区检查对方想进和谦让结果 | 不遵循“让权等待” |
硬件实现方法
- 中断屏蔽方法
- 使用“关/开中断”指令实现
- 优点:简单高效
- 缺点:只使用于单处理机;只适用于操作系统内核进程
- TestAndSet(TS/TSL)
- 过程
- old记录是否上锁
- lock设置为true
- 检查old是否上锁
- 上锁则重复上诉操作
- 优点:实现简单;适用于多出力系统
- 缺点:不满足“让权等待”
- 过程
- Swap指令(XCHG,Exhange):逻辑同TS
2.3.4信号量
- 整型信号量:缺点:不满足“让权等待”原则
- 记录型信号量:优点:
- 实现了系统资源的申请和释放
- 实现了进程互斥和同步
整型信号量
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
- 临界区之前对信号量进行P操作
- 临界区之后对信号量进行V操作
- 实现进程同步
- 分析问题,找出哪里需要实现“一前一后”的同步关系
- 设置同步信号量,初值为0
- 在“前操作”之后执行V操作
- 在“后操作”之前执行P操作
- 实现进程的前驱关系
- 分析问题,把每一对前驱关系看出一个同步问题
- 每一对前驱关系设置同步信号量,初值为0
- 在“前操作”之后执行V操作
- 在“后操作”之前执行P操作
2.3.5管程
- 引入缘由:解决信号量机制编程麻烦、易出错问题
- 组成(类)
- 共享数据结构
- 对数据结构初始化的语句
- 一组用来访问数据结构的过程(函数)
- 基本特征
- 各外部进程/线程只能通过管程提供的特定“入口”才能访问共享数据
- 每次仅允许一个进程在管程内执行某个内部过程
- 补充
- 各进程必须互斥访问管程的特性是由编译器实现的
- 可在管程中设置条件遍历及等待、唤醒操作以解决同步问题
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);
读者-写者问题
- 允许多个读者读
- 只允许一个写者写
- 任一写者写操作完成之前不允许其他读者或写者工作
- 写者写之前已有的读者和写者全部退出
(3,4合一块就是写者写的过程中不允许别的打扰)
读进程优先
semaphore count = 0;//当前读者数量
semaphore mutex = 1;//互斥信号量
semaphore rw = 1;//保证一个写者和其他所有互斥
writer()
while(1)
P(rw);
写
V(rw);
reader()
while(1)
P(mutex)以上是关于操作系统笔记的主要内容,如果未能解决你的问题,请参考以下文章