[TOC]
第一章 操作系统引论及概述
1.1.1、概念、功能与目标
定义:
操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配;以提供给用户和其他软件方便的接口和环境;它是计算机系统中最基本的系统软件。
- 操作系统是系统资源的管理者,负责管理协调硬件、软件等计算机资源的工作
- 向上层的应用程序、用户提供方便易用的服务
- 操作系统是最接近硬件的一层软件,是系统软件不是硬件
功能与目标
操作系统是系统资源的管理者
向上层提供方便易用的服务
命令接口
联机命令接口实例(Windows系统) 联机命令接口=交互式命令接口
特点:用户说一句,系统跟着做一句
脱机命令接口实例(Windows系统) 脱机命令接口=批处理命令接口
使用windows系统的搜索功能,搜索C盘中的 *.bat文件,用记事本任意打开一个。
特点:用户说一堆,系统跟着做一堆
程序接口
可以在程序中进行系统调用来使用程序接口。普通用户不能直接使用程序接口,只能通过程序代码间接使用。
如C盘Windows\System32中有很多的*.dll文件。程序员在程序中调用(该调用过程即为系统调用)即可实现创建窗口等功能。
GUI:图形用户界面(Graphical User Interface)
用户可以使用形象的图形界面进行操作,而不再需要记忆复杂的命令、参数。
例子:在Windows 操作系统中,删除一个文件只需要把文件“拖拽”到回收站即可。
操作系统是最接近硬件的一层软件
封装思想:操作系统把一些丑陋的硬件功能封装成简单易用的服务,使用户能更方便地使用计算机,用户无需关心底层硬件的原理,只需要对操作系统发出命令即可
脑图
1.1.2、操作系统的四个特征
并发
并发与并行的区别:
- 并发:两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。
- 并行:指两个或多个事件在同一时刻同时发生。
例子:
操作系统的并发性指计算机系统中“同时”运行着多个程序,这些程序宏观上看是同时运行着的,而微观上看是交替运行的。
操作系统就是伴随着“多道程序技术”而出现的。因此,操作系统和程序并发是一起诞生的。
注意:
- 单核CPU同一时刻只能执行一个程序,各个程序只能并发地执行
- 多核CPU同一时刻可以同时执行多个程序,多个程序可以并行地执行
共享
共享即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。
互斥共享方式:
系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源
同时共享方式:
系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问
所谓的“同时”往往是宏观上的,而在微观上,这些进程可能是交替地对该资源进行访问的(即分时共享)
生活实例:
- 互斥共享方式:使用QQ和微信视频。同一时间段内摄像头只能分配给其中一个进程。
- 同时共享方式:使用QQ发送文件A,同时使用微信发送文件B。宏观上看,两边都在同时读取并发送文件,说明两个进程都在访问硬盘资源,从中读取数据。微观上看,两个进程是交替着访问硬盘的。
并发与共享是操作系统最基本的两个特征,两者互为存在条件
- 并发性指计算机系统中同时存在着多个运行着的程序。
- 共享性是指系统中的资源可供内存中多个并发执行的进程共同使用。
虚拟
虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。
虚拟技术
- 空分复用技术(如虚拟存储器技术):实际只有4GB的内存,在用户看来似乎远远大于4GB
- 时分复用技术(如虚拟处理器):微观上处理机在各个微小的时间段内交替着为各个进程服务
显然,如果失去了并发性,则一个时间段内系统中只需运行一道程序,那么就失去了实现虚拟性的意义了。因此,没有并发性,就谈不上虚拟性
异步
异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。
由于并发运行的程序会争抢着使用系统资源,而系统中的资源有限,因此进程的执行不是一贯到底的,而是走走停停的,以不可预知的速度向前推进。
如果失去了并发性,即系统只能串行地运行各个程序,那么每个程序的执行会一贯到底。只有系统拥有并发性,才有可能导致异步性。
脑图:
1.1.3、操作系统的发展与分类
操作系统的发展:
手工操作阶段
主要缺点:用户独占全机、人机速度矛盾导致资源利用率极低
批处理阶段
单道批处理系统
引入脱机输入/输出技术(用外围机+磁带完成),并由**监督程序(操作系统的雏形)**负责控制作业的输入、输出
主要优点:缓解了一定程度的人机速度矛盾,资源利用率有所提升。
主要缺点:内存中仅能有一道程序运行,只有该程序运行结束之后才能调入下一道程序。CPU有大量的时间是在空闲等待I/O完成。资源利用率依然很低。
多道批处理系统
操作系统正式诞生,用于支持多道程序并发运行
主要优点:多道程序并发执行,共享计算机资源。资源利用率大幅提升,CPU和其他资源更能保持“忙碌”状态,系统吞吐量增大。
主要缺点:用户响应时间长,没有人机交互功能(用户提交自己的作业之后就只能等待计算机处理完成,中间不能控制自己的作业执行。eg:无法调试程序/无法在程序运行过程中输入一些参数)
分时操作系统
计算机以时间片为单位轮流为各个用户/作业服务,各个用户可通过终端与计算机进行交互。
主要优点:用户请求可以被即时响应,解决了人机交互问题。允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人的存在。
主要缺点:不能优先处理一些紧急任务。操作系统对各个用户/作业都是完全公平的,循环地为每个用户/ 作业服务一个时间片,不区分任务的紧急性
实时操作系统
在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。实时操作系统的主要特点是及时性和可靠性。
- 硬实时系统:必须在绝对严格的规定时间内完成处理。如:导弹控制系统、自动驾驶系统
- 软实时系统:能接受偶尔违反时间规定。如:12306火车订票系统
主要优点:能够优先响应一些紧急任务,某些紧急任务不需时间片排队。
操作系统的分类:
网络操作系统
伴随着计算机网络的发展而诞生的,能把网络中各个计算机有机地结合起来,实现数据传送等功能,实现网络中各种资源的共享(如文件共享)和各台计算机之间的通信。(如:Windows NT 就是一种典型的网络操作系统,网站服务器就可以使用)
分布式操作系统
主要特点是分布性和并行性。系统中的各台计算机地位相同,任何工作都可以分布在这些计算机上,由它们并行、协同完成这个任务。
个人计算机操作系统
如 Windows XP、MacOS,方便个人使用
脑图:
1.1.4、操作系统的运行机制与体系结构
运行机制
两种指令
- 特权指令:不允许用户程序使用。如内存清零指令
- 非特权指令:如普通的运算指令
两种处理器状态
- 用户态(目态):此时CPU只能执行非特权指令
- 核心态(管态):特权指令、非特权指令都能执行
两种处理器状态用程序状态字寄存器(PSW)中的某标志位来标识当前处理器处于什么状态,如0表示用户态,1表示核心态。
两种程序
内核程序
操作系统的内核程序是系统的管理者,既可以执行特权指令,也可以执行非特权指令,运行在核心态。
应用程序
为了保证系统的安全运行,普通应用程序只能执行非特权指令,运行在用户态。
操作系统内核
内核是计算机上配置的底层软件,是操作系统最基本、最核心的部分
实现操作系统内核功能的那些程序就是内核程序
- 时钟管理:实现计时管理
- 中断处理:负责实现中断机制
- 原语:
- 是一种特殊的程序
- 处于操作系统最底层,是最接近硬件的部分
- 这种程序的运行具有原子性,其运行只能一气呵成,不可中断
- 运行时间短,调用频繁
- 对系统资源进行管理的功能(有的操作系统不把这部分功能归为“内核功能”。也就是说,不同的操作系统,对内核功能的划分可能并不一样)
- 进程管理
- 存储器管理
- 设备管理
体系结构
大内核
将操作系统的主要功能都作为系统内核运行在核心态
优点:高性能
缺点:内核代码大,结构混乱,难以维护
典型的大内核/宏内核/单内核操作系统:Linux、UNIX
微内核
只把最基本的功能保留在内核
优点:内核功能少,结构清晰,方便维护
缺点:需要频繁地在核心态与用户态之间切换,性能低
典型的微内核操作系统:Windows NT
类比:
脑图:
1.1.5、中断与异常
中断机制的诞生
在早期的计算机没有中断机制,各个程序只能串行执行,系统资源的利用率低。
为了解决上述问题,人们发明了操作系统(作为计算机的管理者),引入中断机制,实现了多道程序并发执行。
本质:发生中断就意味着需要操作系统介入,开展管理工作
中断的概念与作用
- 当中断发生时,CPU立即进入核心态
- 当中断发生后,当前运行的进程暂停运行,并有操作系统内核对中断进行处理
- 对于不同的中断信号,会进行不同的处理
发生中断就意味着需要操作系统介入,开展管理工作。由于操作系统的管理工作(比如进程切换、分配I/O设备等)需要使用特权指令,因此CPU要从用户态转为核心态。中断可以使CPU从用户态切换为核心态,使操作系统获得计算机的控制权。有了中断,才能实现多道程序并发执行。
中断是实现CPU从用户态切换到核心态的唯一途径。通过执行一个特权指令,将程序状态字(PSW)对标志位设置为“核心态”。
中断(广义的中断)的分类
- 内中断(也称“异常、例外、陷入”):与当前执行的指令有关,中断信号来源于CPU内部
- 自愿中断:指令中断(如:系统调用时使用的访管指令(又叫陷入指令、trap指令))
- 强迫中断
- 硬件故障(如:缺页)
- 软件故障(如:整数除0)
- 外中断(也称“中断(狭义的中断)”):与当前执行的指令无关,中断信号来源于CPU外部
- 外设请求(如:I/O操作完成发出的中断信号)
- 人工干预(如:用户强行终止一个进程)
另一种分类方式:
- 内中断(也称“异常、例外、陷入”):与当前执行的指令有关,中断信号来源于CPU内部
- 陷阱、陷入(trap):有意而为之的异常,如系统调用
- 故障(fault):由错误条件引起的,可能被内核程序修复。内核程序修复故障后会把CPU使用权还给应用程序,让它继续执行下去。如:缺页故障。
- 终止(abort):由致命错误引起,内核程序无法修复该错误,因此一般不再将CPU使用权还给引发终止的应用程序,而是直接终止该应用程序。如:整数除0、非法使用特权指令。
- 外中断(也称“中断(狭义的中断)”):与当前执行的指令无关,中断信号来源于CPU外部
- 外设请求(如:I/O操作完成发出的中断信号)
- 人工干预(如:用户强行终止一个进程)
- 内中断(也称“异常、例外、陷入”):与当前执行的指令有关,中断信号来源于CPU内部
外中断的处理过程
- 检查:执行完每个指令之后,CPU都要检查当前是否有外部中断信号
- 保护:如果检测到外部中断信号,则需要保护被中断进程的CPU环境(如程序状态字PSW、程序计数器PC、各种通用寄存器)
- 处理:根据中断信号类型转入相应的中断处理程序
- 恢复:恢复原进程的CPU环境并退出中断,返回原进程继续往下执行
中断机制的基本原理
不同的中断信号,需要用不同的中断处理程序来处理。当CPU检测到中断信号后,会根据中断信号的类型去查询“中断向量表”,以此来找到相应的中断处理程序在内存中的存放位置。
显然,中断处理程序一定是内核程序,需要运行在“内核态”
脑图:
1.1.6、系统调用
什么是系统调用
操作系统作为用户和计算机硬件之间的接口,需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成。
“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以通过系统调用来请求获得操作系统内核的服务。
系统调用与库函数调用的区别
为什么系统调用是必须的
生活场景:去学校打印店打印论文,你按下了WPS 的“打印”选项,打印机开始工作。
你的论文打印到一半时,另一位同学按下了Word 的“打印”按钮,开始打印他自己的论文。思考:如果两个进程可以随意地、并发地共享打印机资源,会发生什么情况?
两个进程并发运行,打印机设备交替地收到WPS 和Word 两个进程发来的打印请求,结果两篇论文的内容混杂在一起了…
解决方法:由操作系统内核对共享资源进行统一的管理,并向上提供 “系统调用”,用户进程想要使用打印机这种共享资源,只能通过系统调用向操作系统内核发出请求。内核会对各个请求进行协调处理。
什么功能要用系统调用实现
应用程序通过系统调用请求操作系统的服务。而系统中的各种共享资源都由操作系统内核统一掌管,因此凡是与共享资源有关的操作(如存储分配、I/O操作、文件管理等),都必须通过系统调用的方式向操作系统内核提出服务请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性,防止用户进行非法操作。
系统调用的过程
- 传递系统调用参数
- 执行陷入指令(用户态)
- 执行相应的内请求核程序处理系统调用(核心态)
- 返回应用程序
脑图:
第一章总结
第二章 进程与线程
2.1.1、进程的概念、组成与特征
1、定义——在计算机发展史上,”进程”是为了解决什么问题而被引入的?
1、进程的发展
在早期的计算机中,只支持单道程序。
在引入多道程序技术之后(操作系统)
进程与程序的区别:
- 程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合。
- 进程(Process):是动态的,是程序的一次执行过程
同一个程序多次执行会对应多个进程。
2、进程的定义
**程序段、数据段、PCB三部分组成了进程实体(进程映像)**。一般情况下,我们把进程实体就简称为进程,例如:所谓创建进程,实质上是创建进程实体中的PCB;而撤销进程,实质上是撤销进程实体中的PCB。
注意:PCB是进程存在的唯一标志!
从不同的角度,进程有不同的定义,比较传统典型的定义有:(强调“动态性”)进程的进
:正在进行
- 进程是程序的一次执行过程。
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
- 进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
引入进程实体的概念后,可把进程定义为:
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
注:严格来说,进程实体和进程并不一样,进程实体是静态的,进程则是动态的。不过,除非题目专门考察二者区别,否则可以认为进程实体就是进程。因此我们也可以说“进程由程序段、数据段、PCB三部分组成”
2、组成——每个进程由哪些部分组成
PCB(Process Control Block):操作系统使用的。进程的管理者(操作系统)所需的数据都在PCB当中
程序段:进程自己使用的。程序本身的运行所需的数据
存放要执行的代码
数据段:进程自己使用的。程序本身的运行所需的数据
存放程序运行过程中处理的各种数据
3、组织方式——系统中的各个进程之间是如何被组织起来的
在一个系统中,通常有数十数百乃至数千个PCB。为了能对他们加以有效的管理,应该用适当的方式把这些PCB组织起来。
注意:进程的组成讨论的是一个进程内部的由哪些部分构成的问题,而进程的组织讨论的是多个进程之间的组织方式的问题。
链接方式
按照进程状态将PCB分为多个队列
操作系统持有指向各个队列的指针
索引方式
根据进程状态的不同,建立几张索引表
操作系统持有指向各个索引表的指针
4、特征——相比于程序,进程有什么特征
- 动态性:进程是程序的一次执行过程,是动态地产生、变化和消亡的
- 并发性:内存中有多个进程实体,各进程可以并发执行
- 独立性:进程是能独立运行、独立获得资源、独立接收调度的基本单位
- 异步性:各进程按各自独立的,不可预知的速度向前推进,操作系统要提供”进程同步机制“来解决异步问题
- 结构性:每个进程都会配置一个PCB。结构上看,进程由程序段、数据段、PCB组成
脑图
2.1.2、进程的状态与转换
1、进程的状态
进程是程序的一次执行,在这个执行过程中,有时进程正在被CPU处理,有时又需要等待CPU服务,可见,进程的状态是会有各种变化。为了方便对各种进程的管理,操作系统需要将进程合理地划分为几种状态。
进程有五种状态,其中有三种基本状态
三种基本状态:
运行态(Running):占有CPU,并在CPU上运行
注意:在单核处理机环境下,每一时刻最多只有一个进程处于运行态。(双核环境下可以同时有两个进程处于运行态)
就绪态(Ready):已经具备运行条件,但由于没有空闲的CPU,而暂时不能运行
进程已经拥有了除处理机之外所有需要的资源,一旦获得处理机,即可立即进入运行态开始运行。即:万事俱备,只欠CPU
阻塞态(Waiting/Blocked,又称:等待态):因等待某一事件而暂时不能运行
如:等待操作系统分配打印机、等待读磁盘操作的结果,CPU是计算机中最昂贵的部件,为了提高CPU的利用率,需要先将其他进程需要的资源分配到位,才能得到CPU的服务。
剩余的两种状态:
创建状态(New,又称:新建态):进程正在被创建,操作系统为进程分配资源、初始化PCB
操作系统需要完成创建进程。操作系统为该进程分配所需的内存空间等系统资源,并为其创建、初始化PCB(如:为进程分配PID)
终止状态(Terminated,又称:结束态):进程正在从系统中撤销,操作系统会回收进程拥有的资源、撤销PCB
进程运行结束(或者由于bug导致进程无法继续执行下去,比如数组越界错误,除数为0等等),需要撤销进程。
操作系统需要完成撤销进程的相关的工作。完成将分配给进程的资源回收,撤销进程PCB等工作。
2、进程状态间的转换
- 就绪态 => 运行态
- 运行态 => 就绪态
- 运行态 => 阻塞态
- 阻塞态 => 就绪态
注意:不能有阻塞态直接转换为运行态,也不能由就绪态直接转换为阻塞态(因为进入阻塞态是进程主动请求的,必然需要进程在运行时才能发出这种请求)
脑图
2.1.3、进程控制
1、基本概念
1、什么是进程控制
进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。
简化理解:反正进程控制就是要实现进程状态转换。
2、如何实现进程控制——原语
原语是一种特殊的程序,它的执行具有原子性。也就是说,这段程序的运行必须一气呵成,不可中断。
如果不能“一气呵成”,就有可能导致操作系统中的某些关键数据结构信息不统一的情况,这会影响操作系统进行别的管理工作。
原语的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断。可以用“关中断指令”和“开中断指令”这两个特权指令实现原子性。
正常情况:CPU每执行完一条指令都会例行检查是否有中断信号需要处理,如果有,则暂停运行当前这段程序,转而执行相应的中断处理程序。
CPU执行了关中断指令之后,就不再例行检查中断信号,直到执行开中断指令之后才会恢复检查。
这样,关中断、开中断之间的这些指令序列就是不可被中断的,这就实现了“原子性”。
2、进程控制相关的原语
学习技巧:进程控制会导致进程状态的转换。无论哪个原语,要做的无非三类事情:
- 更新PCB中的信息(如修改进程状态标准、简化运行环境保存到PCB、从PCB恢复运行环境)
- 所有的进程控制原语一定都会修改进程状态标准
- 剥夺当前运行进程的CPU使用权必然需要保存其运行环境
- 某进程开始运行前必然要恢复其运行环境
- 将PCB插入合适的队列
- 分配/回收资源
进程的创建
进程的终止
进程的阻塞与唤醒
进程的切换
脑图
2.1.4、进程通信
什么是进程通信?
顾名思义,进程通信就是指进程之间的信息交换。
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。为了保证安全,一个进程不能直接访问另一个进程的地址空间。但是进程之间的信息交换又是必须实现的。为了保证进程间的安全通信,操作系统提供了一些方法。如下:
1、共享存储
两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现)。
操作系统只负责提供共享空间和同步互斥工具(如P、V操作)
基于数据结构的共享:
比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式
基于存储区的共享:
在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。
2、消息传递
进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。
格式化的信息包含消息头和消息体。在消息头中包括:发送进程ID、接受进程ID、消息类型、消息长度等格式化的信息(计算机网络中发送的“报文”其实就是一种格式化的消息)
直接通信方式:消息直接挂到接收进程的消息缓冲队列上
间接通信方式:消息要先发送到中间实体(信箱)中,因此也称“信箱通信方式”。Eg:计网中的电子邮件系统。
3、管道通信
“管道”是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区
- 管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
- 各进程要互斥地访问管道。
- 数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
- 如果没写满,就不允许读。如果没读空,就不允许写。
- 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。
脑图
2.1.5、线程的概念、特点与多线程模型
1、什么是线程?为什么要引入线程?
进程是程序的一次执行。同一进程里不同的功能显然需要用不同的几段程序才能实现,并且这几段程序还要并发运行(qq当中的视频、文字聊天、传送文件)。而且,当切换进程时,需要保存/恢复进程运行环境,还需要切换内存地址空间(更新快表、更新缓存)开销很大。
有的进程可能需要“同时”做很多事,而传统的进程只能串行地执行一系列程序。为此,引入了“线程”,来增加并发度。
2、与进程相比,线程有什么特点?
可以把线程理解为“轻量级进程”。
引入线程前,进程既是资源分配的基本单位,也是调度的基本单位。
引入线程后,进程是资源分配的基本单位,线程是调度的基本单位。线程也有运行态、就绪态、阻塞态
在多CPU环境下,各个线程也可以分派到不同的CPU上并行地执行。
线程是一个基本的CPU执行单元,也是程序执行流的最小单位。
引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)。线程则作为处理机的分配单元。
引入线程后,进程是资源分配的基本单位。而线程几乎不拥有资源,只拥有极少量的资源(线程控制块TCB(Thread Control Block)、寄存器信息、堆栈等)
引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件)
进程间并发,开销很大。线程间并发,开销更小。进程间通信必须请求操作系统服务(CPU要切换到核心态),开销大。同进程下的线程间通信,无需操作系统干预,开销更小。引入线程机制后,并发带来的系统开销降低,系统并发性提升。
注意:从属于不同进程的线程间切换,也必须请求操作系统服务!也会导致进程的切换!开销也大
当切换进程时,需要保存/恢复进程运行环境,还需要切换内存地址空间(更新快表、更新缓存)
同一进程内的各个线程间并发,不需要切换进程运行环境和内存地址空间,省时省力。
从属同一进程的各个线程共享进程拥有的资源。
各个进程的内存地址空间相互独立,只能通过请求操作系统内核的帮助来完成进程间通信。
同一进程下的各个线程间共享内存地址空间,可以直接通过读/写内存空间进行通信。
总结:
线程最小执行单位,进程最小分配资源单位。
进程是可拥有资源的基本单位,频繁创建撤销进程会造成很大时空开销;而线程只是独立调度和分派的基本单位,共享进程的系统资源,线程被频繁创建和撤销也不会造成太大的时空开销。那仍然是执行的一个进程,只不过同时执行一个进程里面的多个线程。有些程序语言里还有更更轻量的协程,都是为了降低并发的代价。
3、引入线程机制后,有什么变化?
类比:
切换进程运行环境:有一个不认识的人要用桌子,你需要你的书收走,他把自己的书放到桌上
同一进程内的线程切换=你的舍友要用这张书桌,可以不把桌子上的书收走。
4、线程有哪些重要的属性?
5、线程的实现方式
用户级线程(User-Level Thread, ULT)
用户级线程由应用程序通过线程库实现。
所有的线程管理工作都由应用程序负责(包括线程切换)
用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。
在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。(用户级线程对用户不透明,对操作系统透明)
可以这样理解,“用户级线程”就是“从用户视角看能看到的线程”
内核级线程(Kernel-Level Thread, KLT, 又称“内核支持的线程”)
内核级线程的管理工作由操作系统内核完成。
线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
可以这样理解,“内核级线程”就是“从操作系统内核视角看能看到的线程”
线程的实现方式:
在同时支持用户级线程和内核级线程的系统中,可采用二者组合的方式:将n个用户级线程映射到m个内核级线程上(n >= m)
重点重点重点: 操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位。
例如:下边这个模型中,该进程由两个内核级线程,三个用户级线程,在用户看来,这个进程中有三个线程。但即使该进程在一个4核处理机的计算机上运行,也最多只能被分配到两个核,最多只能有两个用户线程并行执行。
6、多线程模型
在同时支持用户级线程和内核级线程的系统中,由几个用户级线程映射到几个内核级线程的问题引出了“多线程模型”问题。
多对一模型:
多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高。
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。
一对一模型:
一个用户及线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
多对多模型
n 用户及线程映射到m 个内核级线程(n >= m)。每个用户进程对应m 个内核级线程。
克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
脑图
2.2.1、处理机调度的概念、层次
1、基本概念
当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定(如:VIP优先、短作业优先调等等)处理这些任务的顺序,这就是“调度”研究的问题。
在多道程序系统中,进程的数量往往是多于处理机的个数的,这样不可能同时并行地处理各个进程。处理机调度,就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。
2、三个层次
1、高级调度(作业调度)
2、中级调度(内存调度)
3、低级调度(进程调度)
3、三层调度的联系、对比
4、补充知识——进程的”挂起态”与七状态模型
脑图
2.2.2、进程调度的时机、切换与过程、方式
1、时机
1、什么时候需要进程调度
2、什么时候不需要进程调度(但是进程在普通临界区中是可以进行调度、切换的。)
3、临界区与内核程序临界区
如果还没退出临界区(还没解锁)就进行进程调度,但是进程调度相关的程序也需要访问就绪队列,但此时就绪队列被锁住了,因此又无法顺利进行进程调度。
内核程序临界区访问的临界资源如果不尽快释放的话,极有可能影响到操作系统内核的其他管理工作。因此在访问内核程序临界区期间不能进行调度与切换。
在打印机打印完成之前,进程一直处于临界区内,临界资源不会解锁。但打印机又是慢速设备,此时如果一直不允许进程调度的话就会导致CPU一直空闲。
普通临界区访问的临界资源不会直接影响操作系统内核的管理工作。因此在访问普通临界区时可以进行调度与切换。
2、切换与过程
1、”狭义的调度”与”进程切换”的区别
3、方式
1、非剥夺调度方式(非抢占式)
2、剥夺调度方式(抢占式)
脑图
2.2.3、调度算法的评价指标
1、CPU利用率
2、系统吞吐量
3、周转时间
1、周转时间、平均周转时间
2、带权周转时间、平均带权周转时间
即:周转时间都是11s,但是作业1的运行时间是1s,等待时间是10s;而作业2的运行时间是10s,等待时间是1s。
4、等待时间
5、响应时间
脑图
2.2.4、调度算法:先来先服务、最短作业优先、最高响应比优先
Tips:各种调度算法的学习思路
- 算法思想
- 算法规则
- 这种调度算法是用于作业调度还是进程调度?
- 抢占式?非抢占式?
- 优点和缺点
- 是否会导致饥饿:
- 某进程/作业长期得不到服务
1、先来先服务(First Come First Serve:FCFS)
相关例题:
2、短作业优先( Shortest Job First:SJF)
相关例题
1、非抢占式的短作业优先
2、抢占式的短作业优先
细节:
3、对两种算法的思考
4、高响应比优先(Highest Response Ratio Next:HRRN)
相关例题:
5、知识回顾与重要考点
2.2.5、调度算法:时间片轮转、优先级、多级反馈队列
Tips:各种调度算法的学习思路
- 算法思想
- 算法规则
- 这种调度算法是用于作业调度还是进程调度?
- 抢占式?非抢占式?
- 优点和缺点
- 是否会导致饥饿:
- 某进程/作业长期得不到服务
1、时间片轮转调度算法
相关例题:
时间片为2
时间片为5
时间片的选取&时间片轮转调度算法与先来先服务算法的关系:
2、优先级调度算法
相关例题:
非抢占式的优先级调度算法:
抢占式的优先级调度算法:
补充:
3、思考
4、多级反馈队列调度算法
相关例题
5、知识回顾与重要考点
2.3.1、进程同步、进程互斥
1、进程同步
2、进程互斥
对临界资源的互斥访问,可以在逻辑上分为如下四个部分:
为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:
脑图
2.3.2、进程互斥的软件实现方法
学习提示:
- 理解各个算法的思想、原理
- 结合上小节学习的“实现互斥的四个逻辑部分”,重点理解各算法在进入区、退出区都做了什么
- 分析各算法存在的缺陷(结合“实现互斥要遵循的四个原则”进行分析)
1、单标志法
2、双标志先检查
3、双标志后检查
4、Peterson算法
脑图
2.3.3、进程互斥的硬件实现方法
学习提示:
- 理解各方法的原理
- 了解各方法的优缺点
1、中断屏蔽方法
2、TestAndSet(TS指令/TSL指令TestAndSetLock)
3、Swap指令(XCHG指令)
脑图
2.3.4、信号量机制
复习回顾+思考:之前学习的这些进程互斥的解决方案分别存在哪些问题?
- 进程互斥的四种软件实现方式(单标志法、双标志先检查、双标志后检查、Peterson算法 )
- 进程互斥的三种硬件实现方式(中断屏蔽方法、TS/TSL指 令、Swap/XCHG指令)
- 在双标志先检查法中,进入区的“检查”、“ 上锁”操作无法一气呵成,从而导致了两个进程有可能同时进入临界区的问题;
- 所有的解决方案都无法实现“让权等待”
1965年,荷兰学者Dijkstra提出了一种卓有成效的实现进程互斥、同步的方法——信号量机制
1、信号量机制
2、整型信号量
3、纪录型信号量
脑图
2.3.5、用信号量实现进程互斥、同步、前驱关系
Tips:不要一头钻到代码里,要注意理解信号量背后的含义,一个信号量对应一种资源
信号量的值 = 这种资源的剩余数量(信号量的值如果小于0,说明此时有进程在等待这种资源)
P(S)——申请一个资源S,如果资源不够就阻塞等待
V(S)——释放一个资源S,如果有进程在等待该资源,则唤醒一个进程
1、实现进程互斥
2、实现进程同步
3、实现进程的前驱关系
脑图
2.3.6、生产者-消费者问题
1、问题描述
2、问题分析
3、问题解决
4、思考:能否改变相邻P、V操作的顺序?
“使用产品”能不能放在”取出产品之后”(即PV操作之间):
从逻辑上来说没什么问题,取出一个产品之后马上使用。但是最好不要。因为这会导致临界区的代码量变大,消费者进程在访问临界区资源的时候就会耗费更长的时间,如果此时有别的进程也想访问临界区资源的话是会被阻塞的。
把这些非必要的代码放进临界区的话,就显然会导致进程间的并发度降低,所以最好不要把没有必要的代码放到临界区里面。
5、知识回顾与重要考点
2.3.7、生产者-多消费者
1、问题描述
2、问题分析
3、问题解决
方式一:使用互斥信号量mutex
方式二:不使用互斥信号量mutex
为什么只可以使用(同步)信号量plate,省略(异步)信号量mutex解决问题呢?
原因在于:本题中的缓冲区大小为1,在任何时刻,apple、 orange、 plate三个同步信号量中最多只有一个是1。因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利地进入临界区。
如果把缓冲区的大小设置为2,即盘子里面可以放置两个水果
4、知识回顾与重要考点
2.3.8、吸烟者问题
1、问题描述
2、问题分析
3、问题解决
4、知识回顾与重要考点
2.3.9、读者-写者问题
1、问题描述
2、问题分析
3、问题解决
4、知识回顾与重要考点
2.3.10、哲学家进餐问题
1、问题描述
2、问题分析
3、问题解决
第一种情况:0号进程拿起左右两支筷子进行吃饭(顺利进行)
第二种情况:在第一种情况的基础下,0号进程正在吃饭,此时1号进程想要吃饭,但是会被阻塞在拿左边筷子的语句P(chopstick[i])上,此时2号进程想要吃饭,但是由于1号进程执行了P(mutex)但是没执行V(mutex),所以2号进程会被阻塞在语句P(mutex)上,即:2号进程虽然左右两边都有筷子,但是它吃不了饭。
第三种情况:在第一种的情况下,4号进程想吃饭,它会拿起左边的筷子,然后就被阻塞在拿右边筷子的语句P(chopstick[(i+1)%5])上了
4、知识回顾与重要考点
2.3.11、管程
1、为什么要引入管程
2、管程的定义和基本特征
3、拓展1:用管程解决生产者消费者问题
4、拓展2:java中类似于管程的机制
脑图
2.4.1、死锁的概念
1、什么是死锁
2、进程死锁、饥饿、死循环的区别
3、死锁产生的必要条件
4、什么时候会发生死锁
5、死锁的处理策略
脑图
2.4.2、死锁的处理策略——预防死锁
1、死锁的处理
2、破坏互斥条件
3、破坏不剥夺条件
4、破坏请求和保持条件
5、破坏循环等待条件
脑图
2.4.3、死锁的处理策略——避免死锁
1、动态策略:避免死锁
2、什么是安全序列
3、安全序列、不安全状态、死锁的联系
4、银行家算法
不安全的情况:
代码实现:
5、知识回顾与重要考点
2.4.4、死锁的处理——策略检测和解除
1、死锁的检测和解除
2、死锁的检测
没有发生死锁:
发生死锁:
死锁定理:
3、死锁的解除
脑图
第三章 内存管理
3.1.1、内存的基础知识
1、什么是内存?内存的作用——存储单元与内存地址
2、进程运行的基本原理
1、指令的工作原理
2、逻辑地址 VS 物理地址
3、如何实现地址转换
4、从写程序到程序运行的过程:编辑——编译——链接——装入
5、三种装入方式
1、三种装入方式——绝对装入
2、三种装入方式——可重定位装入
3、三种装入方式——动态运行时装入
6、三种链接方式
1、三种链接方式——静态链接
2、三种链接方式——装入时动态链接
3、三种链接方式——运行时动态链接
3、补充知识:几个常用的数量单位
脑图
3.1.2、内存管理的概念
1、内存空间的分配与回收
2、内存空间的扩充
3、地址转换
4、存储保护
1、存储保护——方式1
2、存储保护——方式2
脑图
3.1.3、覆盖与交换
1、内存空间的扩充
1、覆盖技术
2、交换技术
脑图
3.1.4、内存空间的分配与回收——连续分配管理方式
3.1.4.1.1、连续分配管理方式——单一连续分配
3.1.4.1.2、连续分配管理方式——固定分区分配
3.1.4.1.3、连续分配管理方式——动态分区分配
1、动态分区分配问题1——系统要用什么样的数据结构记录内存的使用情况?
2、动态分区分配问题2——当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?
3、动态分区分配问题3——如何进行分区的分配与回收操作?
1、分配——分配到相对大的空间中
2、分配——分配到刚刚好的空间中
3、回收——回收区的后面有一个相邻的空闲分区
4、回收——回收区的前面有一个相邻的空闲分区
5、回收——回收区的前、后面各有一个相邻的空闲分区
6、回收——回收区的前、后都没有相邻的空闲分区
7、内部碎片与外部碎片
脑图
3.1.5、动态分区分配算法
1、首次适应算法(First Fit)
2、最佳适应算法(Best Fit)
3、最坏适应算法(Worst Fit)
4、邻近适应算法(Next Fit)
5、知识回顾与重要考点
3.1.4、内存空间的分配与回收——非连续分配管理方式
3.1.4.2.1、非连续分配管理方式——基本分页存储管理方式
把“固定分区分配”改造为“非连续分配版本”
1、基本分页存储管理的基本概念
2、如何实现地址的转换
进程在内存中连续存放时:
主要思想:模块在内存中的的“起始地址”+ 目标内存单元相对于起始位置的“偏移量”。
进程在内存中不连续存放时(采用分页存储):
结论:如果每个页面大小为2KB,用二进制数表示逻辑地址,则末尾K位即为页内偏移量,其余部分就是页号。
因此,如果让每个页面的大小为2的整数幂,计算机就可以很方便地得出一个逻辑地址对应的页号和页内偏移量。
3、逻辑地址结构
4、页表
脑图
3.1.6、基本地址变换机构
基本地址变换机构:用于实现逻辑地址到物理地址转换的一组硬件机构
脑图
3.1.7、具有快表的地址变换机构
1、局部性原理
2、快表(TLB)
3、引入快表后,地址的变换过程
4、知识回顾与重要考点
3.1.8、两级页表
1、单级页表存在什么问题?如何解决?
2、两级页表的原理、逻辑地址结构
3、如何实现地址变换?
4、如何解决单级页表的问题?
5、两级页表问题需要注意的几个细节
脑图
3.1.4.2.2、非连续分配管理方式——基本分段存储管理方式
1、分段
2、段表
3、地址变换
4、分段、分页管理的对比
脑图
3.1.4.2.3、非连续分配管理方式——段页式管理方式
1、分页、分段的优缺点分析
2、分段+分页=段页式管理
3、段页式管理的逻辑地址结构
4、段表、页表
脑图
3.2.1、虚拟内存的基本概念
1、传统存储管理方式的特征、缺点
2、局部性原理
3、虚拟内存的定义和特征
4、如何实现虚拟内存技术
脑图
3.2.2、请求分页管理方式
1、页表机制
2、缺页中断机构
内存中存在空闲块:
内存中不存在空闲块:
3、地址变换机构
脑图
3.2.3、页面置换算法
1、页面置换算法——最佳置换算法(OPT)
2、页面置换算法——先进先出置换算法(FIFO)
3、页面置换算法——最近最久未使用置换算法(LRU)
4、页面置换算法——时钟置换算法(CLOCK)
5、页面置换算法——改进型的时钟置换算法
6、知识回顾与重要考点
3.2.4、页面分配策略
1、页面分配、置换策略
2、何时调入页面
预调页策略和请求调页策略一般会结合着进行使用。
3、抖动(颠簸)现象
4、工作集
脑图
第四章 文件管理
4.1.1、初识文件管理
1、Windows操作系统的文件管理
2、文件的属性
3、文件内部的数据应该怎样组织起来?
4、文件之间应该怎样组织起来?
5、操作系统应该向上提供哪些功能?
6、从上往下看,文件应如何存放在外存?
7、其他需要由操作系统实现的文件管理功能
脑图
4.1.2、文件的逻辑结构
1、无结构文件
2、有结构文件
3、有结构文件的逻辑结构
4、顺序文件
5、索引文件
6、索引顺序文件
7、索引顺序文件(检索效率分析)
8、多级索引顺序文件
脑图
4.1.3、文件目录
1、文件控制块
2、目录结构——单级目录结构
3、目录结构——两级目录结构
4、目录结构——多级目录结构
5、目录结构——无环图目录结构
6、索引结点(FCB的改进)
脑图
4.1.4、文件的物理结构(文件分配方式)
1、文件块、磁盘块
2、文件分配方式——连续分配
总结:
3、文件分配方式——链接分配
链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显式链接两种。
4、链接分配——隐式链接
5、链接分配——显式链接
6、链接分配(总结)
7、文件分配方式——索引分配
1、索引分配——链接方案
2、索引分配——多层索引
3、索引分配——混合索引
8、索引分配(总结)
9、知识点回顾与重要考点
10、易混难点:支持随机访问
4.1.5、文件存储空间管理
1、存储空间的划分与初始化
2、存储空间管理——空闲表法
分配:
回收:
3、存储空间管理——空闲链表法
1、空闲链表法——空闲盘块链
分配与回收:
2、空闲链表法——空闲盘区链
分配与回收:
4、存储空间管理——位示图法
分配与回收:
5、存储空间管理——成组链接法
分配:
回收:
脑图
4.1.6、文件的基本操作
1、创建文件(create系统调用)
2、删除文件(delete系统调用)
3、打开文件(open系统调用)
4、关闭文件(close系统调用)
5、读文件(read系统调用)
6、写文件(write系统调用)
脑图
4.1.7、文件共享
1、基于索引结点的共享方式(硬链接)
2、基于符号链的共享方式(软链接)
脑图
4.1.8、文件保护
1、口令保护
2、加密保护
3、访问控制
4、Windows的访问控制
\
脑图
4.1.9、文件系统的层次结构
1、文件系统的层次结构
2、知识点回顾与重要考点
4.2.1、磁盘的结构
1、磁盘、磁道、扇区
2、如何在磁盘中读/写数据
3、盘面、柱面
4、磁盘的物理地址
5、磁盘的分类
脑图
4.2.2、磁盘调度算法
1、一次磁盘读/写操作需要的时间
2、先来先服务算法(FCFS)
3、最短寻找时间优先(SSTF)
4、扫描算法(SCAN)
5、LOOK调度算法
6、循环扫描算法(C-SCAN)
7、C-LOOK调度算法
脑图
4.2.3、减少磁盘延迟时间的方法
1、减少延迟时间的方法:交替编号
2、磁盘地址结构的设计
3、减少延迟时间的方法:错位命名
脑图
4.2.4、磁盘的管理
1、磁盘初始化
2、引导块
3、坏块的管理
脑图
第五章 I/O管理
5.1.1、I/O设备的概含和分类
1、什么是I/O设备
2、I/O设备的分类——按使用特性
3、I/O设备的分类——按传输速率分类
4、I/O设备的分类——按信息交换的单位分类
脑图
5.1.2、IO控制器
1、I/O设备的机械部件
2、I/O设备的电子部件(I/O控制器)
3、I/O控制器的组成
4、内存映像I/O VS 寄存器独立编址
脑图
5.1.3、IO控制方式
1、程序直接控制方式
2、中断驱动方式
3、DMA方式
DMA控制器
4、通道控制方式
5、知识点回顾与重要考点
5.1.4、IO软件层次结构
1、用户层软件
2、设备独立性软件
3、思考:为何不同的设备需要不同的设备驱动程序?
4、设备驱动程序
5、中断处理程序
1、知识点回顾与重要考点
2、中断处理程序
5.1.5、I/O核心子系统
1、这些功能要在哪个层次实现?
2、I/O调度
3、设备保护
4、知识总览
5.1.6、假脱机技术
1、什么是假脱机技术
2、假脱机技术——输入井和输出井
3、假脱机技术——输入/输出缓冲区
4、共享打印机原理分析
脑图
5.1.7、设备的分配与回收
1、设备分配时应考虑的因素
2、静态分配与动态分配
3、设备分配管理中的数据结构
4、设备分配的步骤
5、设备分配步骤的改进
脑图
5.1.8、缓冲区管理
1、什么是缓冲区?有什么作用?
2、缓冲区有什么作用?
3、单缓冲
4、双缓冲
5、使用单/双缓冲在通信时的区别
6、循环缓冲区
7、缓冲池
脑图
参考链接: