(一)操作系统概述[os]
1.1 什么是操作系统
操作系统,Operating System,简称OS,是覆盖在计算机硬件系统之上的一套软件系统,是第一层软件。
【百度百科】操作系统是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互操作的界面。
1.2 OS的作用
前面对于OS的认识并不全面,可以从操作系统的功能作用角度来理解什么是操作系统。从以下三个角
度来说明0S的作用。
0S是用户与计算机硬件之间的接口
OS处于用户与硬件系统之间,用户通过OS来使用计算机硬件系统。
或者说,用户在0S帮助下可以方便、快捷、可靠地操作计算机硬件和运行自己的程序。
OS是计算机系统资源的管理者
一个计算机系统包含的软硬件盗源可分为四类:处理器、存储器、I0设备,及文件(数据和程序)。
OS就是对这四类盗源进行有效管理的。
对不同资源的理方式与目标是不同的:
- CPU: 分配控制
- 存储器:分配、管理回收
- IO设备: 分配操纵、回收
- 文件: 文件存取、共享保护
OS实现了对计算机资源的抽象
为了方便用户对系统资源的使用,OS将计算机资源抽象为一组数据结构及操作命令(对象),
然后再设计出对这些抽象资源的管理软件,然后再将这些管理软件逐层覆盖在计算机硬件之上,
于是便形成了一层层的虚机器。这些虚机器是逐层系统软件覆盖在裸机上而成的逻辑计算机
用户对计算机的使用大多集中中IO操作上。
- 第1层抽象:对IO设备的管理。
- 第2层抽象:对文件的管理。
- 第3层抽象:对图形操作的管理。
- …
- 第n层抽象
1.3操作系统的发展历程
- 了解即可
若要想真正理解操作系统,就要深入了解操作系统的发展历程,理解促使操作系统发展的动力。
大家要关注两点:作业调度算法与用户体验。
1.裸机
从1946年第一台计算机延生,到20世纪50年代中期。其为电子管计算机(第一代计算机),
计算机资源非常昂贵目操作异常复杂,所以全部是在计算中心进行的集中计算。
下图为上世纪60年代老上海海燕牌电子管老收音机内部。
下图为冯诺依曼与冯诺依曼电子管计算机
纯人工操作阶段
最初使用的是纯人工操作。其缺点很明显:用户独占全机,CPU等待人工操作
脱机IO阶段
为了解决人机矛盾及CPU与I0设备速度不匹配矛盾,在20世纪50年代末出现了脱机I0技术。
脱机IO技术:将IO设备从主机中分离,主机只对磁带进行读写操作。主机不再直接与慢速的I O设备打
交道,而是与速度相对较快的磁带机发生关系。
2.单道批处理系统
读作: 单道\批处理系统
单道批处理系统出现在20世纪50年代末到60年代中期,其为晶体管计算机(第二代计算机)。
单道批处理系统需要用户事先将一批作业以脱机方式输入到磁带上。该系统中配置了监督程序Monitor(监视器)。在Monitor控制下,使这批作业逐个连续被处理,充分利用了主机资源。
单道:
- 内存中始终只有一道作业
- 批处理:磁带上有多道作业,安装一次磁带,可以处理一批作业
其具体处理过程:
- Monitor将磁带上的第一个作业装入内存,并将运行控制权交给该作业
- 当该作业处理完毕后,再将运行控制权还给Monitor
- Monitor会再将磁带上的第二个作业装入内存,并将运行控制权交给该作业
- 以此类推,走到当前磁带中的所有作业运行完毕。整个过程中是无法与人进行交互的
整个过程人无法参与
单道批处理系统存在的问题是:IO执行过程中,主机是闲置状态,主机利用率低。因为内存中只有一道作业。
3.多道批处理系统
1964年IBM生产了第一台小规模集成电路计算机IBM System/360(第三代计算机),并为该计算机开发了OS/360操作系统,其为第一个多道批处理系统。
多道批处理系统同样要求事先将多道作业存放到外存上并排成一个队列,称为后备队列。
然后由作业调度程序Monitor按照一定的算法,从后备队列中选择出若干作业调入内存,使它们共享CPU与系统中的其它资源。为充分利用作业调用IO期间的间隙,在Monitor的控制下完成这些作业间CPU使用权的切换。
多道批处理系统的优点:处理机利用率高、系统吞吐量大。但缺点是:作业平均周转时间长、无交互能力
需要解决的问题
多道批做处理系统已经可以大量且较高效地运行作业了,其已经具备真正操作系统的推形了。其要形成真
正的操作系统,还需要解决以下问题:
- 处理机竞争问题
- 内存分配和保护问题
- I0设备分配问题
- 文件的组织与管理问题
- 作业管理问题
- 用户与系统接口问题
操作系统定义
为了实现前述功能,应在多道批比处理系统之上增加一组软件,这组软件应包括:能有效组织和管理四
大资源(处理器、存储器、工0设备、文件)的软件,能合理对各类作业进行调度和控制的软件,能方
便用户使用计算机的软件。而这样一组软件便构成了操作系统。
所以,操作系统也可以定义为:操作系统是一组能有效地组织和管理计算机软硬件资源,合理对各类作
业进行调度,及方便用户使用的程序的集合。
扩展
在上世纪60年代,程序已经很复杂了。阿波罗11号航天机在1969年7月20日实现了人类第一次登月任
务。而该航天飞机的计算机系统是由Margaret Hamilton(玛格丽特·汉密尔顿)设计实现,同时也是由
她提出了“软件”的这个慨念的。的照片。
4.分时系统
发展动力
如果说多道批处理系统的发展动力主要是提高CPU的利用率,提升系统的吞吐量,那么分时系统的发展动力就是为了满足人机交互需求。用户对于操作系统的需求主要表现在两方面:
- 人机交互:从用户体验上讲,用户希望在调试、修改一个程序时,能独占全机。可随时修改、调试,无需等待其它程序运行结束。
- 共享主机:从资源利用上讲,在20世纪60年代,昂贵的计算机资源需要通过共享来达到资源充分利用的目的。
以上两种需求出现了矛盾。而分时系统则解决了这个矛盾。
什么是分时系统
分时系统是指,在一台主机上连接多个配有显示器与键盘的终端并由此构成的系统。该系统允许多个用户同时通过自己的终端,以交互方式使用计算机,共享主机中的资源。
无盘工作站
多路卡
在系统中配置一个多路卡,用于及时接收多终端的用户输入,实现分时多路复用。主机会以很快的速度周期性的扫描各个终端,在每个终端处停留很短的时间(如30ms),用于接收从终端发来的数据。
例如具有15个终端,每个终端在 30ms15 = 450ms 后会再将被主机处理。
终端输入通过多路卡进入主机内存,以期将来获得到CPU资源进行运算。
时间片
在多道批处理系统中,对于一个没有IO的长作业,其会长时间独占处理器直至其运行完毕。而这将导致其它作业无法被处理。这是与分时系统的两大特征(人机交互、共享主机)相违背的。为了避免这种情况的发生,分时系统中引入了时间片概念。
一个时间片就是一段很短的时间(如30ms)。系统规定每个作业每次只能运行一个时间片,然后就暂停该作业的执行,并调度下一个作业运行。这样,在较短的时间内就能使所有作业都能执行一个时间片,使每个用户都能及时与自己的作业交互。
实现了“宏观上的并行,微观上的串行”——并发。
5.实时系统
实时系统是指,系统能及时响应外部事件的请求,在规 定时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。
即,系统的正确性,不仅由计算逻辑结果确定,还取决于产生结果的时间。也就是说,实时系统将时间作为一个关键参数。
实时任务分类
站在不同的角度,实时任务有不同的分类方式:
(1)周期性实时任务与非周期性实时任务。非周期性实时任务又可以分为开始截止时间任务与完成截止时间任务。
(2)硬实时任务HRT(必须满足截止时间要求)与软实时任务SRT(偶尔错过截止时间也不会有太大影响)
6.微机操作系统
- 跟现在的电脑的操作系统类似
随着大规模集成电路与计算机体系结构的发展,出现了微机,即PC机,相应的也形成了微机操作系统。
下图为一些集成电路:
微机操作系统也有一个发展过程:
- 单用户单任务系统
- 单用户多任务系统
- 多用户多任务系统
7.网络操作系统
- 现在的电脑就是这种
与微机操作系统类似,只不过其提供的服务类型不同。
8.云操作系统
云操作系统,又称为云计算操作系统、云计算中心操作系统,是以云计算、云存储技术作为支撑的操作系统,
是云计算后台数据中心的整体管理运营系统。
云操作系统是一个构架于服务器、存储、网络等基础硬件资源和单机操作系统、中间件、数据库等基础软件之上的、管理海量的基础硬件、软件资源的云平台综合管理系统。
例如,VMware的vSphere、浪潮的云海、阿里的AliOS,都是云操作系统。
1.4 操作系统的基本特性
不同的操作系统具有不同的特征,但它们还共同具有以下四大特性。
并发Concurrence
正是该特性使得OS能有效提高系统中资源的利用率,增加系统的吞吐量。
并发是指,两个或多个事件在同一时间间隔内发生。
与并行对比:
- 并行:两个或多个事件在同一时刻发生。
- 并发:宏观上的并行,微观上的串行。
并发的实现
只所以可以实现并发,是因为引入了进程这个概念。
所谓进程,是指在系统中能独立运行并作为资源分配的基本单位,有一组指令、数据和堆栈等组成,是一个能独立运行的活动实体。
简单来说,进程就是一个正在执行的程序;或者说,进程就是一个具有独立功能的程序在其数据集上的运行过程
共享SharingOS
系统中的资源共享,也称为资源复用,是指系统中的资源可供内存中多个并发执行的进程共同使用。当系统中资源数量少于多个进程对资源的需求数量时,就会形成对共享资源的争夺。根据进程对资源复用方式的不同,目前主要实现资源共享的方式有两种:
互斥共享
就是同一时刻, 不是你使用, 就是别的人使用
某些资源只能互斥访问,如打印机、磁带机等。
虽然可供多个进程使用,但在一段时间内,只允许一个进程访问该资源。
同时访问
系统中还有一类资源,允许在一段时间内由多个进程同时访问。不过,对于这个“同时”需要注意.
在单处理机环境中,其是宏观上的意义,微观上对这些资源的访问是交替进行,最典型的就是磁盘。
数据库中的数据本身属于“同时访问资源”。而“写 锁”属于互斥共享资源,“读锁”属于同时访问资源
虚拟Virtual
通过某种技术将一个物理实体变为若干个逻辑上的对应物,在OS中这种功能称为虚拟。而实现虚拟 的技术称为虚拟技术。常用的虚拟技术有两种:
时分复用技术
复用“某设备为一用户服务的空闲时间”为其它用户服务,以达到充分复用设备的目的。
使得看起来好像是多个用户在同时使用多台相同设备。这种虚拟技术称为时分复用技术。
虚拟处理机技术、虚拟打印机技术、虚拟存储器技术等,都属于时分复用技术。
需要注意速度问题:若某物理设备采用时分复用技术虚拟出了N个虚拟设备,那么每个虚拟设备的平均速度一定是小于等于物理设备速度的 1/N 的。
空分复用技术
20世纪初,电信业就已经使用频分复用技术来提高信道的复用率。它是指将一个频率范围比较宽的信道划分为多个频率范围较窄的信道(称为频带),其中的任何一个频带都仅供一对用户通话。这种频分复用技术就属于空分复用技术。
- 对讲机
需要注意空间问题:若某物理设备采用空分复用技术虚拟出了N个虚拟设备,则第个虚拟设备占用的实际空间一定是小于等于物理设备部空间的 1/N 的。
Dubbo中的虚拟化
这种“虚拟化”思想,在开发中也经常用到,可以解决很多不方便解决的问题。
例如,Dubbo在采用一致性Hash算法实现负载均衡时会出现一个问题:
提供者Server的增减,仅对某个提供者的负载状态有影响,对其它提供者没有任何帮助。Dubbo使用“虚拟化思想”对该算进行了优化,默认将一台物理提供者虚拟为了360个,解决了原来的问题。
- 圆圈表示主机
异步Asynchronism
什么是异步性
异步性也称为不可预知性,不确定性。
对于内存中的每个进程,有的侧重于计算而IO少,有的则计算少而IO多。
它们何时能够获取到处理器运行、何时由于提出临界资源请求而暂停,每道作业总共需要多少时间才能完成,都是不可预知的,不确定的。可能先进入内存的进程后完成,而后进入内存的作业先完成。这种进程以不可预知的速度向前推进的特性,称为异步性。
只要OS中配置有完善的进程同步机制,且运行环境相同,则作业即使经过多次运行,也可以获得完全相同的结果。即OS的异步性是不会影响到作业的运行结果的。同步就是确定的,可预知的,可再现的。
Zookeeper的协调性
Zookeeper被称为分布式协调服务器,通过对Zookeeper的应用,可以实现分布式系统同步运行,实现各系统功能的协调推进。例如,可以实现集群管理、Master选举、分布式锁、分布式队列等功能,都是ZK协调性机制的体现。
MySQL集群中的Master
Kafka集群中的Broker Controller
广告推荐系统
Redis的协调性
写: 排他
读: 共享
Redis一样也可以实现分布锁,实现分布式协调功能。
1.5微内核OS结构
微内核(MicroKernel)操作系统结构是20世纪80年代后期发展起来的。现在的操作系统基本都是微内核结构的
微内核特征
什么是微内核操作系统结构,现在尚无一致公认的定义,但微内核操作系统具有一些共同的特征。
微内核是这样一种内核:它只完成内核不得不完成的功能,包括时钟中断、进程创建与销毁、进程调度、进程间通信,而其他的诸如文件系统、内存管理、设备驱动等都被作为系统进程放到了用户态空间。说白了,微内核是相对于宏内核而言的,
像Linux就是典型的宏内核,它除了时钟中断、进程创建与销毁、进程调度、进程间通信外,其他的文件系统、内存管理、输入输出、设备驱动管理都需要内核完成。
宏内核是一个包含非常多功能的底层程序,也就是我们现在讲的Monolith。它干的事情非常多,而且不是可插拔的,修改一些小的功能,都会涉及到整个程序的重新编译等,比如一个功能出现了一个小bug,可能导致整个内核都出问题。
Linus开发了Linux内核,并不是开发了某个具体可直接使用的Linux发行版。
- 注意两者的区分
提供基础核心功能
在微内核操作系统中,内核是指精心设计的、能实现现代OS最基本核心功能的小型内核,微内核并非是一个完整的OS,而只是将操作系统中最基本、最核心的功能放入微内核。
这些基本功能大体可以划分为支撑功能与资源管理功能 两大功能。
- 详细功能后面会学习
例如,进程管理、线程管理、低级存储器管理、中断处理等
这些基本核心功能运行的环境,我们通常称为内核态,或内核上下文。
基于C/S模式
将操作系统中最基本最核心的功能放入内核中,将绝大部分功能放在微内核之外的服务进程(也称为服务器)中。
客户进程与服务进程间的通信,及服务进程间的通信,都是通过消息传递机制来实现信息交互的。
即它们间不能直接相互访问,必须通过内核进行消息传递:通过调用内核提供的系统调用实现。
这些服务进程(服务器)运行的环境与客户进程运行的环境相同,都是在内核之外,我们通常称为用户态,或用户上下文。
这样做的好处是 耦合度降低, 方便拓展
机制与策略分离原理
在现代操作系统的结构设计中,经常采用“机制与策略分离原理”来构造OS。
- 机制:实现某一功能的具体执行机构。
- 策略:在机制基础上借助某些参数和算法来实现对该功能的优化。
机制相当于是规则,策略则是在规则下实现目的的方法。
- 机制是底层 , 策略是上层
机制处于系统的低层,而策略处于系统的高层。在微内核OS中,通常将机制放在微内核中,策略放在微内核外围的服务进程中。
例如,进程管理中设置一些进程优先级队列,然后就可以按照优先级从队列中取出进程,为之分配CPU让其运行。这一部分调度功能属于机制问题。而进程优先级算法就属于策略问题。
再如,对于虚拟存储器管理,将用户空间中的逻辑页地址转换为内存空间中的物理块地址,需要页表机制与地址转换机制,应在内核中实现。而页面转换所采用的算法,内存分配与回收等策略,应在内核的外置(服务进程)中实现。
Dubbo中的微内核
微内核设计模式,在开发中也很常见。例如,RPC框架Dubbo。
SPI,Service Provider Interface,服务提供者接口,是一种服务发现机制。
Dubbo作为一个优秀的RPC框架,一个Apache的顶级项目,其最大的亮点之一就是其优秀的无限开放性设计架构——“微内核+插件”的架构设计思想,使得其几乎所有组件均可方便的进行扩展、增强、替换。内核只负责组装插件(扩展点),Dubbo的功能都是由插件实现的。
- 插件: 插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。
支撑功能
该功能是内核提供给OS其它服务进程(服务器)模块的基本功能,是其它服务进程模块功能实现的支撑。主要包含三方面的支撑功能:
中断处理
中断处理是内核最基本的功能,是整个OS工作的基础,没有中断处理就没有OS的并发,OS中的许多重要活动无不依赖于中断。
当然,为了减少CPU中断的时间,提高程序执行的并发性,内核也只是对中断进行“短暂处理”,继而转入相关其它进程去完成后续工作
当一次IO完成之后, 设备控制器会迅速发送一个请求, 那么就会暂停程序的执行 , 保存当前CPU的进程。
时钟管理
时钟管理是内核的一项基本功能,在OS中的许多功能都需要它的支撑。例如,时间片轮转调度中,每当时间片用完,时钟管理就会产生一个中断信号,使调度程序重新进行调度。
原语操作
原语操作,由一组指令构成,用于完成某一特定功能。这组操作中的指令具有的一个特征是,要么全做,要么全不做,即原子性。它们的执行过程是不允许被中断的。原语操作在系统态下执行,常驻内存。
资源管理功能
该功能实现了OS对系统中软、硬件资源的管理。
OS的四大资源:处理器、存储器、IO设备、文件
进程管理
OS内核可以实现对进程的基础化管理,这些基础化管理功能要么使用频率很高,要么属于可以为其它服务进程提供基础化功能。将这些功能放入到内核中,可以大大提高OS的性能。
存储器管理
OS中存储器管理相关进程的运行频率非常得高,将它们放入到内核中,可以大大提升存储器的运行效率,提高读写速度。
设备管理
由于设备管理与计算机硬件紧密相关,所以大部分功能都是常驻内核的。
ZK、Nacos、Apollo中的“中断”
中断处理的思想,反映到同一JVM中的开发中,其实就是监听机制。反映到分布式开发中,其实就是发布/订阅模式。
关于监听机制Listener过于基础,应用过于广泛,这里就不举例了。分布式开发中的发布/订阅模式的应用也较多。
例如,Zookeeper的Watcher机制、Zookeeper作为注册中心时的服务注册与订阅、Zookeeper、Nacos、Apollo作为配置中心时微服务对配置文件的订阅、消费者对Kafka、RocketMQ等消息中间件中相关主题消息的订阅…
运维 直接把 配置文件 写入到MySQL, 然后下面的config client 消息订阅者就能够自动的吧这些消息变更去读取到
- 平滑完成 , 无需重启
通过消息总线 把配置更新的消息(这里是发送的请求-post :bus-refresh)传递到所有的客户端
ZK、Eureka、Netty中的“时钟”
时钟管理的思想,体现在开发中就是定时任务。
例如,Zookeeper的会话管理中的分桶策略中,定时会清除会话桶中的过期会话与会话桶;
Eureka Client在启动时会初始化三个定时任务(定时更新客户端注册表、定时发送心跳、定时更新Client信息给Server);
NettyClient与NettyServer间的心跳机制,是使用的定时任务完成的;
NettyServer中对于读写操作空闲检测的处理,也是启用的定时任务进行的检测。
Seata中的“原语”
在开发中的原语操作,即原子性操作,应用也很多,最典型的就是数据库四大特征ACID之一的原子性。当然,还有分布式事务中的原子性。
比如redis处理 超卖问题 , 使用lua 脚本来实现操作的原子性
- lua脚本执行成功那么就都成功 , 执行失败那么秒杀就失败
例如,当前非常流行的阿里的分布式事务框架Seata,就是在分布式架构中实现了“原语操作”
1.6 处理器执行状态
用户态与系统态
类似linux 的root用户 与普通用户
处理器执行状态 linux操作系统 root 系统态 普通用户
为了防止OS本身及关键数据遭到应用程序有意或无意的破坏,通常将CPU的执行状态分为用户态与系统态。
系统态
系统态也称为内核态、管态。运行在此状态的CPU具有较高的特权,能执行一切指令,可以访问所有寄存器及存储区。
传统的OS都在系统态运行,微内核OS只有微内核运行在系统态。
用户态
用户态也称为目态。运行在此状态的CPU具有较低的特权,仅能执行规定的指令,访问指定的寄存器与存储区。应用程序只能在用户态运行,不能执行OS指令及访问OS区域。微内核OS中的服务进程(服务器)也是运行在用户态。
带来的问题
在微内核OS中,==C/S模式==和==消息传递机制==给系统带来了很多的优点,但也存在着潜在问题,使系统运行效率有所降低。
微内核系统的优点:(联系插拔式的优点)
- 提高了系统的扩展性
- 增强了系统的可靠性
- 提开了系统的可移植性
上面的几个优点其实都是相关的
1.7零拷贝
什么是零拷贝
零拷贝指的是,从一个存区域到另一个存储区域的copy任务无需CPU参与就可完成。零拷贝的底层是通过DM总线技术实现的。
零拷贝与具体的编程语言无关,完全依赖于OS, OS支持就河使用,不支持设置了也不起作用。
DMMA(Direct Memory Access,直接内存问)是一种计算机系统内都的数据传输技术,需要DMA总
线(硬件的体系结构)的硬件支持。其整个数据传输过程是在DM4控制器下完成的。
零拷贝在计算机内数据拷贝及网络传输中都大量使用,用于减少CPU消耗和内存带宽占用,减少用户
空间与内核空间的烤贝过程,减少用户态与内核态间的切换次数,提高系统效率,提升系统性能。例收如
远程服务器处理客户端浏览器的主页打开请求过程,就是一个季拷贝在网络传输中的典型应用。下面全
部以该场景为例进行分析。
传统拷贝方式
站在服务器角度,服务器操作系统经历了以下过程:
该拷贝方式共进行了16次用户空间与内核空间的上下文切换,以及4次数据拷贝,其中两次拷贝存在CPU参与。
零拷贝参与
该拷贝方式共进行了14次用户空间与内核空间的上下文切换,以及3次数据拷贝,但整个拷贝过程均没
有CPU的参与,这就是零拷贝。
Gather Copy零拷贝
该拷贝方式是由DMA完成,当然,需要当前主机的DMA支持Gather Copy方式。
该方式中没有数据考贝到socket buffer。.取而代,之的是只是将kernel buffer中的数据描述信息写到了socket buffer中。
数描述信息包,含了两方面的信息:kemel buffer中数据的地址及偏移量。
该拷贝方式共进行了14次用户空间与内核空间的上下文切换,以及2次数据拷贝,并且整个拷贝过程均没有CPU的参与。
mmap零拷贝
mmap,Memory Map,存储映射。mmap零拷贝是对零拷贝的改进。当然,若当前主机的DMA支持
Gather Copy, mmap同样可以实现Gather Copy DMA的季拷贝。
该方式与普通零拷贝的唯一区别是,应用程序与内核共享了Kernel buffer。由于是共享,所以应用程序也就可以操作该buffer了。当然,应用程序对于Kernel buffer的操作,就会引发用户空间与内核空间的相互切换