操作系统进程与线程核心知识全览

发布于:2025-06-22 ⋅ 阅读:(19) ⋅ 点赞:(0)

本博客,根据王道所学。以下为第二章节知识点:


进程的概念、组成、状态与其转换、进程间通信、信号;

单/多线程模型、线程管理、调度时机的切换、调度的目标、调度算法、多处理机调度;

同步与互斥、进程互斥的软硬件实现方法、信号亮机制、生产者-单/多消费者、管程、死锁及其衍生问题;

 

在博客末尾,附有学习日记

知识总览(进程的概念、组成、特点):

进程的组成--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(周二) 杂事,已经处理完毕
死锁的检测 和 解除,
运用了资源分配图与死锁检测算法
解除共有三种方式:强行剥夺、回退、撤销
学习内存基础、了解了指令。学习装入(静态装入、动态装入、重定位装入)
与链接(与装入类似)的三种方法。
并在内存管理中学习了内存分配(下方三种)、地址转换、内存保护
并且还了解,地址分配是由第一地址分配、固定地址分配、动态分配)三种分配
其中动态分配可由四个算法实现:
首次适应算法(综合性最好)、最佳适应算法(从小到大、需排序)、最坏适应算法(从大到小、需排序)、邻近适用算法(链表)
其中在学习,分页式储存管理时,学习到了:
页、页框、页框号....
....

网站公告

今日签到

点亮在社区的每一天
去签到