本博客,根据王道所学。以下为第二章节知识点:
进程的概念、组成、状态与其转换、进程间通信、信号;单/多线程模型、线程管理、调度时机的切换、调度的目标、调度算法、多处理机调度;
同步与互斥、进程互斥的软硬件实现方法、信号亮机制、生产者-单/多消费者、管程、死锁及其衍生问题;
在博客末尾,附有学习日记
知识总览(进程的概念、组成、特点):
进程的组成--PCB
理解:
详细:
在操作系统中,PSW(Program Status Word,程序状态字)是用于存储当前程序执行状态信息的专用寄存器或存储区域,是 CPU 硬件的重要组成部分。它记录了程序运行时的关键状态,以便 CPU 在执行指令时快速获取和更新相关信息,同时支持操作系统对程序执行进行控制和管理。
具体如:状态切花时的state、进位标志,溢出标志....
进程的组成--程序段、数据段
程序是如何运行的:
1、
2、
进程的组成
进程的特征:(5大特征)
知识总览(2.1.3_进程的状态与转换):
进程的状态--创建态、就绪态
进程的状态--运行态
进程的状态--阻塞态
进程的状态--终止态
进程状态的转化
熟称丁字裤。
进程的状态
进程的组织--链接方式
进程的组织--索引方式
(一般主要用链接方式,索引方式不是那么重要)
知识回顾与重要考点
进程的组织
知识总览(进程的状态):
本章节,更多是理解性内容,背下来倒是没多大必要啦,但是读懂,还是很重要。
什么是进程:
如何实现进程控制?
1、
2、
如何实现原语的“原子性”?
这种特权指令,若允许用户程序使用的呢,那么随便执行一个作业(执行一个进程),附一个关中断指令的buf,不到结尾停不下来,那还要操作系统干嘛。
进程控制相关的原语
创建
终止
阻塞和唤醒
程序是如何运行的:
1、
运行图:
2、
PSW是程序状态字,用于存放程序的运行状态和标志位。PSW是计算机系统的核心部件——运算器的一部分,用来存放两类信息:一类是体现当前指令执行结果的各种状态信息,称为状态标志,如有无进位(CF位),有无溢出(OF位),结果正负(SF位),结果是否为零(ZF位),奇偶标志位(PF位)等;另一类是存放控制信息,称为控制状态,如允许中断 (IF位),跟踪标志(TF位),方向标志 (DF)等。操作系统将程序运行时的一组动态信息汇集在一起,称为程序状态字PSW,并放在处理器的一组特殊寄存器里,以方便系统的控制和管理。
进程控制相关的原语:
知识点回顾:
作业和进程的关系就像你 “让电脑帮忙做一件事” 和 “电脑实际派工人干活” 的关系
拓展:
作业:
进程
作业与进程的关系:
知识总览(进程通信):
什么是进程通信:
为什么进程通信需要操作系统的支持:
就像你的手机里,下载了一个陌生软件。
如果随意能读取其他进程的信息,你的私人信息随随便便就能暴露,那不就炸了吗。
进程存储分为3部分(共享存储、消息传递、管道通信)
共享存储:
具体细节:
消息传递
直接通信:
间接通信:
管道通信:
1、
很像:channel / 循环队列(先进先出)
2、
总结:
王道书_纠正:
知识总览(信号)
信号的作用:
拓展:
就是一个包
实现原理
信号的发送与保存
信号的处理(When)
信号的处理(how)
按照缺省(默认) 处理 / 用户自定义
疑难点
各个进程的信号处理有何区别?
每个进程可以自定义不同的信号。不同进程、对同一类型,进行不同自定义处理
信号与异常有什么关系?
信号与异常时配套关系,单独的内核态处理不了一些异常,可通过向用户态发出信号,配合处理。(拓展)
重点回顾:
信号,通常用于通知进程某个特定事件已经发生了
知识点(线程、多线程模型)
知识总览(线程):
其实就是为了更好的利用硬件资源,在同等时间内,并发处理更多事情
什么是线程,为什么要引入线程?
增加并发量。
让进程变成了最小的资源分配单位,在进程内的线程才是最小的处理机调度单位
举一个简单的例子:引入进程之后,你只能在传输文件之后,才能发消息。消息发送完毕之后你才能干其他。
1、
2、
3、
引入线程机制后,有什么变化?
线程的属性
其实线程与进程各个方面及其相似 (TCB内存着大秘密哦)
知识总览(多线程模型):
线程的实现方式
1、
早期是通过线程库实现的。
最简单的并行是通过while()循环实现。
2、
线程的实现方式1:
线程的管理工作谁来做?切换线程时是否需要cpu变态?操作系统是否能意识到线程是个啥?
(一对一)线程的实现方式2:
线程的管理工作由谁来完成?线程的切换是否需要cpu变态?
操作系统是否能意识到内核级线程的存在?这种线程的实现方式有什么优点和缺点?
多线程模型(一对一)
优点:不怕阻塞
缺点:一个进程占据的内核级线程太多
多线程模型(多对一)
这个和没有加内核级线程的模式,没啥区别啊,多此一举。
多线程模型(多对多)
知识回顾与重要考点
知识总览(线程管理)
线程的状态与转换
与进程很像(就绪、运行、阻塞)
进程的组织与控制
知识大纲(处理机调度):
调度的基本概念:
调度的意思是,操作系统对调度开个口,就是对一堆要做的任务排个先后序。
高级调度:
对作业排个序
中级调度:
中级调度是通过挂起(内存调度)(内存与外存的关系)
低级调度:
就是cpu分配给那个进程的调度时间
补充知识:
就绪、运行、阻塞三态,都是存在内存中的。内存不够了,就会掉到硬盘那里。
三层调度的联系、对比:
只是频率的对比
知识回顾与重要考点
知识总览(进程调度的时机切换与过程调度方式)
进程调度的时机
进程调度就是低级调度(什么时机,那个上cpu)
进程调度的时机
这个涉及临界区资源(资源)与临界区(调用资源的静态代码)
进程调度的方式
非剥夺、与剥夺两种
进程的切换与过程
区区一个进程调度,还分为“狭义”与“广义“。
“广义” 就是 选择一个进程 并且 切换一个进程。
且进程的切换是有代价的。花时间与资源调度(规定 一般时间比不会超过总花费时间的1%)
知识回顾与重要考点
知识总览(调度目标-调度算法的评价指标)
CPU利用率
忙碌时间 / 总时间
系统吞吐量
作业总数 / 总共花了多长时间
周转时间
完成作业,花了多长时间
等待时间
等待处理机的时间
响应时间
从首次提交 到 首次响应
总:
知识总览(调度算法)
先来先服务(fcfs)
非抢占式,如queue,对长作业有利,对短作业不利
短作业优先(SJF):
非抢占式:
抢占式:
短作业优先
高相应比算法(HRRN):
由来:
详细:
就是结合了fcfs与sjf两者的优点。
知识重点回顾:
知识总览(调度算法)
时间片轮转(RR)
相当与建立了一个队列,先来的那个直接插在队首。
非常之公平,但是时间片太长的话,会退化成fcfs
优点是,尽可能让每个进程得到响应
优先级调度算法
优先级调度算法,是抢占式的,根据优先数确定顺序
多级反馈队列
思考:
详细:
结合FCFS 与 RR(时间片轮转),加上多级队列,完美结合。
适用于交互系统。(RR可以让进程得到及时响应)
知识总览:
单处理机调度vs多处理机调度
负载均衡、处理机亲和性
方案一:公共就绪队列
方案二、私有就绪队列
知识回顾与重要考点
知识总览(同步与互斥的基本概念):
同步?互斥?
什么是进程同步:
与进程异步相对应的,就是同步。
通过管道,告诉我们,制约关系-->导致同步
什么是进程互斥:
就是多个进程 同时看中一份 不能同时共享的资源。需要互斥使用。
具体(进程互斥):
原则:
1、空闲让进
2、忙则等待
3、有限等待
4、让权等待
知识回顾:
知识总览(互斥-软件实现方法)
如果没有进程互斥?
必然导致资源运用混乱
单标志法:
这个是固定的按照 你一次,我一次的方法运用的。
所以会导致“空闲等待”的问题
双标志法:
当p0执行完1后,时间片到了,又执行了p1的5
会导致空闲让进、有限等待
后检查法:
先检查法:
Peterson算法
除了,让全等待,其他都已完成。
就是你让我,我让你,谁最后让,谁最后让对方做。(孔融让梨)
知识回顾:
知识总览(硬件)
一、中断屏蔽方法(禁用中断)大白话解释:
好比你在图书馆写作业,为了不被打扰,你直接把图书馆的门铃拆了(禁用所有人的进出)。这样一来,没人能打断你,但副作用是紧急情况(如着火)也无法通知你。
优点:
- 简单粗暴:直接不让任何中断发生,保证你的代码(临界区)执行时不会被打扰。
- 绝对有效:在单核 CPU 中,禁用中断后,CPU 不会切换到其他任务,你的代码可以独占资源。
缺点:
- 危险:如果长时间禁用中断,系统可能无法响应紧急事件(如硬件故障、用户按键),导致系统崩溃。
- 不公平:其他任务可能因此饿死(无法获得 CPU 时间)。
- 多核失效:现代 CPU 通常多核并行,禁用一个核的中断对其他核无效,无法阻止其他核访问共享资源。
- 不适用于用户程序:只有操作系统内核能禁用中断,普通程序无权操作。
适用场景:
- 操作系统内核中极短时间的关键操作(如修改系统全局变量)。
- 单核系统中对实时性要求极高的代码。
二、TestAndSet(TSL 指令)大白话解释:
好比你去公共厕所,门上有个 “有人 / 无人” 的牌子。你每次进门前先看牌子:
- 如果是 “无人”,你马上翻成 “有人”,然后进去锁门。
- 如果是 “有人”,你就等着,等里面的人出来把牌子翻回 “无人”。
优点:
- 原子性:检查和设置牌子的动作是一体的(不可分割),不会出现两个人同时看到 “无人” 而冲突的情况。
- 适用性广:适用于多核 CPU,所有核都能通过这个指令竞争资源。
- 实现简单:硬件直接支持(如 x86 架构的 LOCK TSL 指令)。
缺点:
- 忙等待(自旋锁):没抢到资源的线程会一直循环检查牌子,浪费 CPU 时间(好比你盯着厕所门一直等,啥也不干)。
- 优先级反转:如果低优先级的线程持有锁,高优先级线程会一直等待,导致低优先级任务反而先执行。
- 公平性差:可能导致某些线程长期抢不到锁(饥饿)。
适用场景:
- 锁持有时间很短的场景(如缓存行的更新)。
- 多核系统中对性能要求极高的代码。
三、Swap 方法(交换指令)大白话解释:
还是公共厕所的例子,但这次规则变了:你进门时必须和门上的牌子交换状态。
- 如果牌子是 “无人”,你把自己的 “有人” 牌子和它交换,然后进去锁门。
- 如果牌子是 “有人”,你把自己的 “无人” 牌子和它交换,发现对方是 “有人”,就继续等。
优点:
- 原子性:交换操作是原子的,不会出现冲突。
- 与 TSL 类似:同样适用于多核 CPU,实现简单。
缺点:
- 同样的忙等待问题:没抢到锁的线程会一直循环交换,浪费 CPU。
- 可能更差的缓存效率:频繁交换会导致缓存失效,性能不如 TSL。
适用场景:
- 与 TSL 类似,但某些硬件架构可能更适合用 Swap 指令(如早期的 ARM 架构)。
对比总结
方法 | 优点 | 缺点 | 适用场景 |
中断屏蔽 | 简单、单核有效 | 危险、多核无效 | 内核短时间关键操作 |
TestAndSet | 多核支持、原子性 | 忙等待、公平性差 | 短时间锁、多核高性能场景 |
Swap | 多核支持、原子性 | 忙等待、缓存效率低 | 特定硬件架构(如早期 ARM) |
补充说明:
现代操作系统通常结合多种方法(如用 TSL 实现基础锁,再用条件变量解决长等待问题),以平衡性能和公平性。
知识点(互斥锁)
进程互斥:锁
咱们的这个锁呢,只有一把。通过acquire()获取 与 release()释放。
知识总纲(信号量机制)
信号量机制:
大概就是说了一下wait()与signal()。他们也等于P(S)、V(S) -荷兰语变成的呢。
信号量机制(整形信号量)
字如其意,通过一个变量表示。
整形信号量会导致 “让权等待” 无法完成。
信号量机制(记录型信号量)
详解:
记录型信号量,通过一个记录型数据结构表示(包含资源数的变量 与 等待队列)
应用:
知识回顾与重要考点
知识总览(互斥、同步、前驱关系)
经过我的学习,互斥呢就是,通过P()、V()进行锁操作
前驱关系是为了解决同步问题。(上一个进程(前驱) 释放了某一个某种资源,本进程才能开始)
信号量机制实现进程互斥
一个简单的互斥实现
信号量机制实现进程同步
简单的进程同步的,示意图。(不用看图片啦,听我说:就是暂停一个进程,去等待另一个进程释放资源),看图2更合适。
1、
2、
信号量实现前驱关系
知识回顾与重要考点
很有趣。
进程互斥是先P后V。
进程同步是先V后P。
知识大纲(生产者-消费者问题)
问题分析:
就是一个简单的对缓冲区的 生产、读写 操作。
如何实现:
如何实现,对缓冲区互斥的进行生产与消费。
思考:能否改变相邻P、V操作的顺序?
改变P、V操作后,可能会导致死锁。
知识回顾与重要考点
基于semaphore(记录型信号量)实现的full(非空闲缓冲区)、empty(空闲缓冲区),与mutex。
知识大纲(生产者-多消费者问题)
问题描述
只有一个缓存区,肯定不够呐。
如何实现
知识回顾与重要考点
知识大纲(读者-写者问题)
就是对一个和缓存区or文件。读-写进程操作 / 读-读 / 写 - 读 / 写-写
分析-找思路-做题
如何实现:
为了保证写优先
知识回顾与重要考点
知识大纲(哲学家进餐)
有n个人、n根筷子。
防止死锁的方法:
1、最多同时允许有4个人拿起筷子。
2、在1的基础上,奇数拿左边的筷子,偶数拿右边的
知识回顾与重要考点
哲学家最重要的问题,就是不死锁就行,其他都好
知识大纲(管程)
为什么要引入管程
引入管程的目的就是简化设计流程---信号量机制麻烦、易错。如下:
管程的定义和基本特征
1、一个共享数据结构
2、对数操作的一组过程(函数)
3、可初始化
拓展1:用管程解4决生产者消费者问题
通过用类代码形式、帮助理解。
拓展2:Java中类似于管程的机制
知识回顾与重要考点
基本特征:
1、进程/线程 只能通过管程提供的特定入口才能访问
2、每次 仅能允许一个进程在管程内 执行某一个内部过程(类似调用函数)
知识大纲(死锁的概念)
什么是死锁?
1、
2、
死锁、饥饿、死循环的区别
共同点:都是进程 走不下去了
不同点:
死锁:拿不到继续走下去的资源
饥饿:拿不到cpu使用权,被凉了很久
死循环:bug 或者 刻意设计的
死锁产生的必要条件:
四大条件:互斥、不可剥夺、请求和保持、循环等待
什么时候会发生
死锁的处理策略
防范于未然:(1.预防死锁、2.避免死锁)
紧急处理:(死锁检测与解除)
知识回顾与重要考点
知识大纲(预防死锁产生)
破坏互斥条件:
就是将互斥的条件设计成共享资源。但是存在局限性
破坏不可剥夺条件
设置成强行剥夺,但是可能会造成过多的资源消耗。
破坏请求和保持
等收集到所有需要的资源后(标记而不占用),再开始。
破坏循环等待
通过为资源标序号,各个进程按顺序取。
知识回顾与重要考点
知识大纲(避免死锁)
什么是安全序列
引出银行家算法
安全、不安全序列、死锁的联系
银行家算法
1、
2、
3、
具体:
知识回顾与重要考点
1、检测申请得最大数
2、检查此时系统剩余的可用资源是否还能满足这次请求
3、试探着分配,更改各数据结构
4、用安全性算法检查此次分配是否会导致系统进入不安全状态。
知识大纲(死锁的检测和解除)
就俩(检测/解除)
死锁的检测
就是用一种数据结构而已(不断简化、简化、简化。直到死锁or到达最简)
死锁定理
就是对这种行为,起了个名字而已
死锁的解除
1、资源剥夺
2、撤销
3、进程回退
知识回顾于重要考点
(检测
(数据结构:资源分配图,算法:死锁检测算法)+解除(3大种)
借鉴:
1、王道操作系统
学习日记:
6.9(周一) | 休息+有课 |
学习了进程的管理,进程的通信, 整理了进程的组成、转换等知识点 | |
学习了虚拟机,对特权/非特权指令,内核态,用户态,虚拟机有了更清晰的认知。 一道算法题整了一半 | |
6.10(周二) | 学习了线程管理,创建 |
在一个人做项目时,最好前后端都能看懂,才能更好的做下去 | |
学校考试而已 | |
6.11(周三) | |
分享会,玉龙学长分享的很清晰 | |
最近快考试了,课有点多 | |
6.12(周四) | |
前端作品,复习完毕 | |
答辩结束,结果还不错。 书在读、算法刷的有点少 | |
6.13(周五) | 复习了线程的管理、组织、信号、多线程模型 处理机的高级、中级、低级调度。并整理至笔记 |
学习了线程的调度算法(先来先服务、最优调度... | |
书有读、那道算法终于拿下,以后数组排序类的题,还是要将下标标注下来 | |
6.14(周六) | 四级考试结局 |
学习了操作系统,进程调度的6中算法 fcfs、cc、sjf、短作业优先、优先级调度算法、多级调度队列 何为进程同步/互斥 | |
还好 | |
6.15(周日) | 学习了进程互斥的单/双标记法、Peterson算法。 了解硬件方面的中断屏蔽、TLS、Swap。 学习了信号量机制的,锁-(整型 / 记录型型号) |
算法相比上一周,有一点点进步 学习了锁互斥理论、了解同步与前驱的相互依存 生产者与消费者通过缓存区交流数据 | |
很OK | |
6.16(周一) | 多个消费者从缓存区中取资源,为读者-写者问题打基础 复习哲学家进餐问题--专门用于解决死锁问题。 初步了解管道-为了简化编程设计与步骤 |
上午知识点已总结 管程的发明就是为了简化设计 死锁有四种原因造成,有三大类方法去避免(预防/避免/检测和死锁) 其中,预防的是破坏那四种形成条件 避免是通过银行家算法避免 | |
简书互评已完成 | |
6.17(周二) | 杂事,已经处理完毕 死锁的检测 和 解除, 运用了资源分配图与死锁检测算法 解除共有三种方式:强行剥夺、回退、撤销 |
学习内存基础、了解了指令。学习装入(静态装入、动态装入、重定位装入) 与链接(与装入类似)的三种方法。 并在内存管理中学习了内存分配(下方三种)、地址转换、内存保护 并且还了解,地址分配是由第一地址分配、固定地址分配、动态分配)三种分配 其中动态分配可由四个算法实现: 首次适应算法(综合性最好)、最佳适应算法(从小到大、需排序)、最坏适应算法(从大到小、需排序)、邻近适用算法(链表) 其中在学习,分页式储存管理时,学习到了: 页、页框、页框号.... | |
.... |