摘自视频096-尚硅谷-Netty中的NIO通信_哔哩哔哩_bilibili
操作系统概述
是覆盖在计算机硬件系统之上的一套
软件系统
,是第一层软件。
管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。 操作系统也提供一个让用户与系统交互操作的界面。
2 OS的作用
用户在
OS
帮助下可以方便 、快捷、可靠地操作计算机硬件和运行自己的程序。
OS是计算机系统资源的管理者
对不同资源的管理方式与目标是不同的:
CPU
:分配、控制
存储器:分配、管理、回收
IO
设备:分配、操纵、回收
文件:存取、共享、保护
用户对计算机的使用大多集中中
IO
操作上。
第
1
层抽象:对
IO
设备的管理。
第
2
层抽象:对文件的管理。
第
3
层抽象:对图形操作的管理。
……
第
n
层抽象:
3 操作系统历史——处理系统,操作系统
处理系统
单道批处理系统
单道:内存中始终只有一道作业
批处理:磁带上有多道作业,安装一次磁带,可以处理一批作业
多道批处理系统
多道批处理系统同样要求事先将多道作业存放到外存上并排成一个队列,称为
后备队列
。然后由作业调度程序Monitor
按照一定的算法,从后备队列中选择出
若干
作业调入内存。充分利用作业调用
IO
期间的间隙
还需要解决以下问题:
处理机竞争问题
内存分配和保护问题
IO
设备分配问题
文件的组织与管理问题
作业管理问题
用户与系统接口问题
操作系统
分时系统
分时系统是指,在一台主机上连接多个配有显示器与键盘的终端并由此构成的系统。该系统允许多个用户同时通过自己的终端,以交互方式使用计算机,共享主机中的资源。
网络操作系统
微机操作系统(PC)
云操作系统
4 操作系统的基本特性
并发 共享 虚拟 异步
Dubbo
中的虚拟化
Zookeeper和Redis的异步协调性
5 微内核OS结构
Linus
开发了
Linux
内核,并不是开发了某个具体可直接使用的
Linux
发行版。
提供基础核心功能
在微内核操作系统中,内核是指精心设计的。
将操作系统中最基本、最核心的功能放入微内核。这些基本功能大体可以划分为
支撑功能
与
资源管理功能
两大功能。
例如,进程管理、线程管理、低级存储器管理、中断处理等
这些基本核心功能运行的环境,我们通常称为内核态,或内核上下文。
基于C/S模式
将操作系统中最基本最核心的功能放入内核中,将绝大部分功能放在微内核之外的服务进程(也称为服务器)中。
客户进程与服务进程间的通信,及服务进程间的通信,都是通过
消息传递机制
来实现信息交互的。(系统调用)
机制与策略分离原理
机制:实现某一功能的具体执行机构。
策略:在机制基础上借助某些参数和算法来实现对该功能的优化。
机制处于系统的低层,而策略处于系统的高层。在微内核
OS
中,通常将机制放在微内核中,策略放在微内核外围的服务进程中。
例如,进程管理中设置一些进程优先级队列,然后就可以按照优先级从队列中取出进程,为之分配CPU
让其运行。这一部分调度功能属于机制问题。而进程优先级算法就属于策略问题。
再如,对于 虚拟存储器管理,将用户空间中的逻辑页地址转换为内存空间中的物理块地址,需要页表机制与地址转换机制,应在内核中实现。而页面转换所采用的算法,内存分配与回收等策略,应在内核的外置(服务进程)中实现。
例子:
RPC
框架
Dubbo
其最大的亮点之一就是其优秀的无限开放性设计架构——“
微内核
+
插件
”的架构设计思想。内核只负责组装插件(扩展点),
Dubbo
的功能都是由插件实现的。
支撑功能
该功能是内核提供给
OS
其它服务进程(服务器)模块的基本功能
中断处理、时钟管理、原语操作
资源管理功能
该功能实现了OS对系统中软、硬件资源的管理。
OS
的四大资源:处理器、存储器、
IO
设备、文件
进程管理、存储器管理、设备管理
6 处理器执行状态
用户态与系统态:
为了防止OS本身及关键数据遭到应用程序有意或无意的破坏,通常将CPU的执行状态分为用户态与系统态。
带来的问题
在微内核
OS
中,
C/S
模式
和
消息传递机制
给系统带来了很多的优点,但也存在着潜在问题,使系统运行效率有所降低。
系统运行效率下降的主要原因是,在完成一次客户对
OS
提出的服务请求时,
CPU
需要在用户态与内核态进行多次上下文切换。
解决方案
用户态与内核态的上下文切换过多引发的性能下降问题,目前有两种解决方案:
改内核
零拷贝
7 零拷贝
从一个存储区域到另一个存储区域的
copy
任务无需
CPU
参与就可完成。零拷贝的底层是通过
DMA
总线技术
实现的。
进程与线程
1 进程描述
进程控制块,PCB。
描述进程的基本信息与活动过
程,进而控制和管理进程。
此时就产生了一个新的概念
——
进程实体
,又称进程映像。
程序段
、相关
数据段
和
PCB
三部分构成了进程实体。
PCB在进程切换中的作用
系统就是根据PCB来感知进程的存在的。包括进程状态的记录
进程定义
进程是程序的一次执行
进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
进程是进程实体的运行过程,是系统进行资源分配调度的一个独立单位
2 进程状态
状态转换
为什么要引入挂起操作呢?有以下几个典型原因:
终端用户的需要
父进程的需要
负荷调节的需要
关于挂起操作的典型应用有:
交换技术
虚拟存储技术
3 进程控制
进程控制一般是由OS内核中的原语实现的。
在
Windows
系统中父子进程间是不存在层级结构的,所有进程间具有
同等的地位
进程创建
进程终止
引起进程终止的事件典型的有三类:
正常结束:进程的任务正常执行完毕后的进程终止。当进程的任务执行完毕后,进程会发出一条终止指令,此时会产生一个中断,以通知OS
进程马上终止。
异常结束:进程在运行过程中发生了某种异常事件,导致进程无法继续运行。
常见的异常事件有:
访问越界
非法指令
权限异常
运行超时
等待超时
运算异常
IO
异常
外界干预:进程被外界干预终止。外界干预主要指三方面:用户直接终止,
OS
终止,父进程终止。
进程的阻塞与唤醒
进程发生阻塞是由于正在执行的进程突然发生执行条件缺失事件,进而暂停执行等待条件的满足;而阻塞进程被唤醒则是由于发生了某些事件,从而具备了执行条件,到达了执行时机。
典型的引发进程阻塞的事件有以下四类
等待资源 等待IO完成 等待数据到达 等待任务到达
4 进程同步
进程同步机制的主要任务,是对多个具有
相互制约关系
的进程在执行次序上进行协调,使并发执行的进程间能按照一定的规则或时序共享系统资源,实现相互合作,从而使程序的执行具有可再现性。
由于没有对临界资源counter进行互斥访问,即没有合理的同步机制导致了不确定性的后果。
信号集
管程机制
PV
操作大量分散在了进程之中,而且如果使用不当(没有成对出现)就会导致系统死锁。
管程定义
管程是一种
面向对象思想
的体现。其由一组
共享数据结构
及对这些数据的
一组操作
构成
管程结构
管程同步
5 分布式同步
对于一个在多台机器上运行的应用而言,通常需要一个协调者来控制整个系统的运行流程,
例如执行的先后顺序,或执行与不执行等,这种控制机制就称为分布式同步。
例如
Redis
、
Zookeeper
等中间件。
分布式日志收集系统
Zookeeper
在该系统中用于协调与同步日志源集群与日志收集器集群中各个主机的配对关系。
即由于扩容、缩容、宕机、网络等问题,引发日志源集群或日志收集器集群中主机数量变化时,能够同步实现日志收集器集群中的任务再分配。
分布式日志收集系统的工作步骤有以下几步:
1
)收集器的注册
在
zk
上创建各个收集器对应的节点。
2
)任务分配
系统根据收集器与生成器的数量,将所有日志源集群主机分组,分别分配给各个收集器。
3
) 状态收集
这里的状态收集指的是两方面的收集:
日志源主机状态,例如,日志源主机是否存活,其已经产生多少日志等
收集器的运行状态,例如,收集器本身已经收集了多少字节的日志、当前
CPU
、内存的使用情况等
4)任务再分配
Rebalance
当出现收集器挂掉或扩容,就需要动态地进行日志收集任务再分配了,这个过程称为
Rebalance
。当
zk检测到有收集器宕机,或发现有新的收集器加入时,系统就会进行任务再分配。有两种Rebalance
方案:
全局动态分配
局部动态分配
MySQL数据复制总线
MySQL
数据复制总线系统中哪里需要使用
zk
的分布式同步功能呢?以上结构中可以显示看到存在的问题:replicator存在单点问题。为了解决这个问题,就需要为其设置多个热备主机。这时候就需要使用
zk
来做协调工作了
分布式FIFO队列
6 进程通信
根据通信双方通信的实现方式可以分为四大类。
共享存储器通信 (Dubbo)
管道通信 (Netty的全双工管道通信)
消息传递通信 (异构系统——JSON,同构系统——Dubbo的URL)
C/S通信 (
网络通信技术
BIO
、
NIO
、
AIO
的底层是Socket。RPC
底层是
Netty)
一致性通信模型
一致性通信模型,是为了实现数据一致性目的而构建的一种通信模型。
一般情况下,分布式系统为实现节点中数据的一致性,各节点间通常采用两种一致性通信模型:
星形通信模型
与
网状通信模型
。
在高性能的网络通信设计中,有两个比较著名的网络通信模型
Reactor
和
Proactor
模式,其中
Reactor
模式属于同步非阻塞I/O
的网络通信模型,而
Proactor
运属于异步非阻塞
I/O
的网络通信模型。
7 线程
在OS中引入进程的目的是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量
在OS中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。
拥有资源
线程除了拥有一些为保证独立运行所必须的资源外,会与其它线程共享它们所隶属进程所拥有的所有资源。
并发性
对于同一个进程中的线程,可以是不同任务的线程,也可以是相同任务的线程。
SMP支持
在传统
OS
中,无论有多少处理器,一个进程只能运行在一个处理器上。
引入线程后,一个进程可以同时运行在多个处理器上并行执行。提高了运行速度。
系统感知标识
系统对于线程的感知标识是
线程控制块
TCB
。在
TCB
中通常包含:
线程唯一标识符
一组寄存器,用于存放程序计数器和堆栈指针
线程状态,是就绪态、阻塞态等
优先级
线程专有存储区,用于保存线程切换时的现场数据及与当前线程相关的统计数据等
堆栈,用于保存线程的局部变量等
8 线程实现
有些系统完全使用
内核支持线程(KST)
实现,如
Mac
系统;
有些系统完全使用
用户级线程(ULT)
实现,如
Infomix
数据库管理系统;
而大多数操作系统则是通过
两种线程相结合
的方式实现,如
Windows
、
Unix
、
Linux
、
Solaris
等。
KST&ULT结合
该实现方式的
系统调度单位是线程
。用户进程创建的是
ULT
线程,系统进程创建的是
KST
线程。
在无需系统资源时,各自管理各自。
当ULT
线程需要系统资源时,其会连接相应的
KST
线程,由
KST
线程为其服务,来完成系统调用
系统实现
通过
内核控制线程
连接
调度与调度算法
只所以存在调度,是由于资源与资源的真正使用者间无法达成永久一对一关系,即资源的申请者数量要多于资源本身,申请者们共享为数不多的资源。
1 处理机调度
处理机调度并不是字面上简单理解的处理机分配过程,而是一个从计算机中的
任务
变为处理机处理
结果
的复杂过程
处理机调度分类
高级调度(作业调度) 低级调度(进程调度) 中级调度(内存调度)
注意:实时系统和分时系统没有“作业”这个概念
2 作业调度
作业概念
在多道批处理系统中,作业是用户提交给系统的一项相对独立的工作。它不仅包含了程序与数据,还配备有一份作业说明书。
作业说明书,
是用作业控制语言(
Job Control Language
,
JCL
)来表达用户对作业的控制意图的一种特殊程序。作业说明书主要由三部分构成:
作业基本描述
作业控制描述
资源要求描述
作业控制块JCB
作业控制块,
Job Control Block
,
JCB,是系统感知作业存在的标志。
JCB
中包含了系统对作业进行管理和调度所需的全部信息
作业状态
后备状态 运行状态 完成状态
作业调度任务
选择多少
作业调度发生的频率一般为几分钟一次。每次进行作业调度时从后备队列选择多少个作业调入内存,取决于系统的多道程序度DM(Degree of Multiprogramming)
并不是
DM
越大越好。
选择谁
取决于调度算法
作业调度算法
先来先服务算法 短作业优先算法 预设优先级算法
高响应比优先算法(是一种动态优先级算法。作业的优先级会随着等待时间的变长而变大)
Dubbo中的动态权重(五种的负载均衡算法)
3 进程调度
无论是批处理系统,还是分时系统与实时系统,都配置了进程调度。
进程调度程序
进程调度任务
进程调度任务是由
进程调度程序
完成,进程调度的任务主要有三项:
保存处理机现场状态
选取合适的进程
将处理机分配给选取出的进程
进程调度程序构成
进程调度方式
非抢占式
一旦将处理机分配给某进程后就一直让其运行下去,直到其主动出让处理机,决不允许因为任何其它原因剥夺其处理机使用权。
抢占式
该调度方式的优点很多:
对于批处理系统,可以防止一个长任务长时间占用处理机,确保处理机能为所有进程提供更加公平的服务
对于分时系统,只有抢占式才能使人-
机交互成为可能
对于实时系统,只有抢占式才能满足实时任务的需求
进程调度算法
时间片轮转调度算法
该算法中时间片的大小对系统性能的影响很大。生产环境中,时间片大小的确定需要通过做性能评估来确定。一般其大小是略大于该业务场景中一次典型的交互所需要的时间。
优先级调度算法
这个分配,可以是非抢占式的,也可以是抢占式的。这个优先级,可以是静态的,也可以是动态的
多级反馈队列调度算法(动态优先级、动态时间片算法)
系统中设置了多个就绪队列,并为每个队列赋予不同的优先级,为每个队列中的进程赋予不同的时间片长度。
队列优先级从第一个队列开始逐步降低,但时间片逐步增大,第i+1
队列的时间片是第
i
队列的
2倍。只有当第i
队列为空时,才会开始调度第
i+1
队列中的进程。
当一个新的就绪进程进入内存后,首先会将其插入到第
1
队列尾部,按
FCFS
等待调度。当轮到该进程执行时,若其能够在该时间片内执行完毕,就该进程即可撤出系统。若没有执行完成,则会将该进程插入到第2队列尾部。依此类推,直到其被插入到最后一个队列。
该调度算法是目前公认的性能较高的进程调度算法。
保证调度算法(
动态优先级
)
该算法是一种基于
公平原则
的调度算法,即对所有进程运行时间上可以保证其公平性。其
是基于各个进程已经获得的
处理机时间比
进行调度的。该算法的使用前提是,系统中的进程为同类进程,没有优先级。
多队列调度算法
该调度算法系统中的就绪队列可以包含多个,不同队列采用不同的调度算法。
不同算法的就绪队列需要绑定在不同的处理机上,在同一个处理机上应用的调度算法是不能变的。
公平分享调度算法
针对
用户公平性
而言的。
4 实时调度
在实时性要求较高的场景,需要使用实时调度,以确保实时任务的截止时间。
实现条件
提供必要信息
具备强大处理能力
具有快速切换能力
实时调度算法分类
非抢占式轮转调度算法
非抢占式优先级调度算法
基于时钟中断的抢占式优先级调度算法(适用于大多数实时系统。)
立即抢占的优先级调度算法
优先级倒置
产生优先级倒置现象的原因主要就是进程在临界区中被抢占了处理机,使其占用了资源而又无法被执行。为了解决这个问题,就应该使进程在临界区中运行时,不能被抢占处理机。
实时调度算法
最低松弛度优先算法
什么是松弛度呢?举例说明:一个任务在
500ms
后必须完成,而该任务处理需要
300ms
,那么该任务目前的松弛度即为200ms
(500ms-300ms)。
该算法中的就绪队列是按照任务的松弛度由低到高排序的
最早截止时间优先算法
死锁与活锁
1 死锁
引发死锁的原因
同时具备
了以下四个必要条件。
若要使进程在运行过程中不产生死锁,只需要打破这四个必要条件中
任意一个
即可。不过,一旦发生了死锁,系统是
无法自行解开
的,只能通过
外力干预
解除。
死锁操作
协议预防:
该操作属于事前操作。通过制定一些协议、规定等对资源的申请、分配进行规范,使
死锁条件无法达成。
安全状态检测:
该操作属于事中操作。通过对资源预分配的计算,来检测本次分配是否会使系统
进入到不安全状态。如果不安全,则本次分配不进行,因为可能会引发死锁。只有计算结果是安
全的才真正分配。
死锁检测:
该操作属于事中操作。通过
资源分配图
方式检测系统在某一时刻是否处于死锁状态。
死锁解除:
该操作属于事后操作。对于已经检测出发生死锁的系统中,通过打破死锁的必要条件
来使系统恢复到正常状态。
2 预防死锁协议
资源原子分配协议——原子分配,即要么全部分配,要么一个也不分配。
不可抢占资源禁持协议——协议规定,进程对于不可抢占资源的申请不得提前。
不可抢占资源出让协议
资源按序申请协议
3 安全状态检测
处于不安全状态的系统并不一定都会发生死锁,但安全状态的系统一定不会发生死锁。所以,安全状态检测是一种避免死锁的方案。
文件与文件管理
1 文件系统
2 文件
文件是一个具有一组相关描述属性的数据集合。
文件的逻辑结构:是用户可以直接看到的文件组织形式,是用户可以直接处理的结构与数据。逻
辑结构有顺序结构、索引结构、索引顺序结构。
文件的物理结构:是逻辑文件存储在外存的组织形式,是用户看不到的。物理结构有顺序结构、
链式结构与索引结构。
逻辑结构粗分
逻辑结构细分
顺序结构文件 索引结构文件 索引顺序结构文件
3 文件目录
文件控制块
文件系统中为每个文件设置了一个专门用于描述与控制文件的数据结构,文件控制块
FCB
(
File Control Block)。文件管理程序就是通过
FCB
对文件施以各种操作的。
目录管理
单级目录是最简单的目录。整个文件系统只有一张目录表,每个文件占一个目录项,每个目录项中包含文件名、扩展名、文件长度、物理地址等文件元数据。
两级目录管理解决了单级目录管理中的问题。其为每一个用户单独创建一个用户文件目录
UFD
4 文件共享
现代
OS中,必须提供文件共享功能,即系统要允许多个用户或进程共享同一个文件。只需保留该共享文件的一份副本即可。
文件共享的实现方式很多,在现代
OS
中最常用的是以下两种:
基于有向无循环图实现文件共享
基于符号链接实现文件共享