【绪论0】

news2024/9/24 1:23:02

#pic_center

R 1 R_1 R1

R 2 R^2 R2

目录

  • 知识框架
  • No.0 引言
  • No.1 操作系统的概念功能和定义
    • 一、操作系统的概念和定义
      • 1、电脑的演变
    • 二、操作系统的功能和目标
  • No.2 操作系统的特征
    • 一、并发
    • 二、共享
    • 三、虚拟
    • 四、异步
  • No.3 操作系统的发展与分类
    • 一、手工操作阶段
    • 二、批处理阶段
    • 三、分时操作系统
    • 四、实时操作系统
    • 五、网络操作系统+分布式操作系统+个人计算机操作系统
  • No.4 操作系统的运行机制
    • 一、简单了解程序的运行原理
    • 二、两类程序
    • 三、两类指令
    • 四、两种处理器状态
    • 五、内核
    • 六、如何变态
  • No.6 中断和异常
    • 一、中断的作用
    • 二、中断的分类
    • 三、中断机制的基本实现原理
  • No. 6 操作系统的体系结构
    • 一、大内核
    • 二、微内核
  • No.7虚拟机
    • 一、传统计算机
    • 二、虚拟机
    • 三、两类虚拟机对比

知识框架

No.0 引言

首先来看一下大家都熟悉的操作系统都有哪些:

比如说苹果的电脑使用的操作系统是mac os、手机使用的操作系统是IOS;

比如常用的电脑:Windows系统、以及手机Android系统。

对于技术专业的来说:Linux操作系统

在我们学习这门课的时候我们可以通过日常生活中使用操作系统的经验来结合我们所要学习的到的知识点进行思考。

并且把操作系统知识和我们的啊现实生活给连接起来做到学以致用

No.1 操作系统的概念功能和定义

一、操作系统的概念和定义

要回答的就是什么是操作系统这样一个问题?

1、电脑的演变

结合生活经验,操作系统在整个计算机体系中的所处的位置和角色。

即电脑的演变:电脑是怎么样一步一步变成我们现在看到的这个样子的

即一台电脑的产生~~~

step1:厂家组装一台裸机

step2:出售前安装操作系统

step3:用户安装应用程序(eg:QQ)

step4:用户使用QQ聊天;

下面是计算机系统的层次结构

  1. 裸机(纯硬件) 裸机包括:CPU+内存+硬盘+主板等等。

二、操作系统的功能和目标

要回答的就是它需要做什么这样的一个问题。

1,资源的管理者

2/ 向上提供服务

对硬件机器的扩展

No.2 操作系统的特征

image-20230801144557377

一、并发

其中并发和共享是最基本的特征,并且两者互为存在条件。

定义:并发是指两个或者多个事件同一时时间间隔内发生这些事件宏观上看是同时发生的微观上其实是交替发生的
与这个并发概念比较容易混淆的是并行的概念并行是指两个或者多个事件在同一时刻同时发生。

例子如下:

那么在操作系统上并发性的体现是?

操作系统的并发性:操作系统的并发性指的是在计算机当中同时运行着多个程序这些程序宏观上看
他们是同时运行着的但是微观上看其实是交替运行的

二、共享

三、虚拟

四、异步

No.3 操作系统的发展与分类

image-20230801153318850

一、手工操作阶段

主要想解决的问题:?

优点?

缺点?

二、批处理阶段

三、分时操作系统

四、实时操作系统

五、网络操作系统+分布式操作系统+个人计算机操作系统

No.4 操作系统的运行机制

image-20230801154101591

一、简单了解程序的运行原理

二、两类程序

三、两类指令

四、两种处理器状态

五、内核

六、如何变态

No.6 中断和异常

image-20230803204323453

一、中断的作用

二、中断的分类

三、中断机制的基本实现原理

No. 6 操作系统的体系结构

一、大内核

二、微内核

No.7虚拟机

一、传统计算机

我们来介绍虚拟机的概念:

首先看一下传统的计算机,传统的计算机在一个物理机器上只能运行一个操作系统,操作系统之上又可以运行各种各样的用户进程,那这看起来似乎是很合理的,但是在有的商业化的环境当中,这会导致硬件资源利用率不充分的一个问题:比如你拥有一个非常强大的一个物理机性能很好,但是由于这台机器上他只能运行一个操作系统,那么你的这台机器如果说你想要租给其他人使用的话,那其他人的这个要运行的东西只能在同一个操作系统之上运行。比如说王者荣耀的这个游戏服务器和吃鸡的那个游戏服务器他必须放在同一个操作系统之上来运行,但两个进程他们在同一个操作系统之上是不是有可能会有一些安全隐患?他们之间可能会相互影响也会相互的争夺操作系统管理的这些资源。

所以在商业环境当中两个应用让他们同时在一个操作系统上运行这可能会造成一些隐患,那一种解决方法是:我们把其中一个应用把它迁移到另一台物理机器上,然后这台物理机器上有一个独立的操作系统。那这样两个应用就不可能相互影响对吧,但是这又会导致物理机器硬件资源的极大浪费,刚才说很多商业级的这种物理机器它的性能是很强的,我的这个硬件性能本来可以同时支持你们两个进程的使用绰绰有余,但是为了安全起见我又不得不浪费把其中一个进程迁移到另一台机器上去运行,所以传统的这种结构一个机器上只能安装一个操作系统会带来很多应用上的限制。

image-20230805155609308

二、虚拟机

因此就有人发明了虚拟机Virtual machine英文缩写叫VM,虚拟机是使用虚拟化的技术把一台物理机器虚拟化为多台虚拟机器,每一个虚拟机器上都可以独立的运行一个操作系统,要把一台物理机器虚拟化为多台虚拟机器,就需要使用到虚拟机管理程序,英文叫Virtual machine monitor缩写VMM,这个缩写也非常常见,那也有人把虚拟级管理程序称为hypervisor,在中文上也会把它翻译为虚拟机监控程序,所以虚拟机管理程序虚拟机监控程序VMM hypervisor这些术语都是一个意思。那接下来使用虚拟机管理程序这个术语。

虚拟机管理程序分为两类:

第一类的虚拟机管理程序会直接运行在硬件之上,虚拟机管理程序会把一个物理机器虚拟化为多台虚拟机器,会把一个总的硬件资源划分为多个部分,分别给各个虚拟机来使用,那每一台虚拟机器上面可以安装各自的操作系统,比如第一台虚拟机上安装Windows,第二台上面安装Linux,而第三台上面又安装Windows,在每一个操作系统之上又可以运行各自的用户进程,我们可以简单说一下如何把一个机器上的硬件资源把它分配给各个虚拟机器:比如一个CPU一个单核的CPU它也可以模拟多台虚拟机器,我们只需要把这个CPU的时间片进行划分,每个虚拟机器分配若干的时间片,那这样的话在上层的这个操作系统看来似乎给自己分配的就是一个独立的CPU,但事实上只是把这个物理CPU的某一些时间片分配给他了而已,那磁盘和内存的分配更不用说了只需要把磁盘空间划分出来分配给个虚拟机器,内存空间划分出来分配给各个虚拟机器那这样的话,每个虚拟机器都可以拥有各自独立的硬件资源,就有点类似于传统的计算机当中操作系统把硬件资源进行了划分,像CPU就是按时间划分为时间片像内存磁盘这些就是划分为了不同的空间分配给各个进程,这样每个进程是不是也可以拥有自己独立的资源。所以第一类虚拟机管理程序就有点类似于我们传统的操作系统一样,他会负责直接管理这些硬件资源并且分配这些硬件资源这只是一层更深的套娃而已。

那值得一提的是只有虚拟机管理程序是运行在内核态的,只有他可以使用特权最高的那些指令,而上层的操作系统和应用程序他们实际上是运行在用户态的。那这会导致一个问题:上层的操作系统他可不知道自己运行在用户态,他以为自己运行在内核态,所以上层的操作系统依然会使用一些特权指令,对吧但是刚才说,只有虚拟及管理程序运行在内核态,所以上层的这个操作系统不能让他使用特权指令,那这种情况怎么办呢?当上层的操作系统想要使用特权指令的时候,他的这个行为动作会被虚拟管理程序给截获,然后这个虚拟级管理程序会负责把上层的操作系统想要执行的这个特权指令进行一些等价的转换,反正就是要给上层模拟出好像这个指令执行成功了那种感觉,所以我们说上层的操作系统它是运行在虚拟内核空间的,它并不是真正的内核空间,实际上是用户空间,只不过他自己以为自己运行在内核空间而已,这是第一类虚拟级管理程序直接运行在硬件之上,直接会管理硬件分配硬件资源接下来。

再来看第二类的虚拟级管理程序,那这一类的虚拟管理程序它不是直接运行在硬件上的,而是运行在一个宿主操作系统上host OS。比如在我的Mac电脑上我安装了Mac OS这个操作系统,那我可以在我的这个电脑上安装第二类的虚拟机管理程序。比如很多同学可能听过Virtual box或者Vain well,这是学生比较常用的两款虚拟机管理程序。那电脑上是安装了Virtual box安装了这个软件之后,就可以去下载另一个操作系统的镜像文件。比如在这个Virtual box上安装了一个Linux的操作系统,并且可以指定要给我上层安装的这个操作系统分配多大的内存,也可以给他指定要给他分配多大的磁盘空间,那接下来我就可以点这个启动,然后在我的Mac电脑上启动一个Linux的操作系统。所以我的电脑本身是Mac OS的操作系统这就是宿主操作系统,在我的操作系统之上我安装了某一个第二类的虚拟机管理程序Virtual box,在这个虚拟管理程序之上我就可以安装一个客户操作系统,比如我安装的就是一个Linux,那如果我愿意的话我也可以安装一个Windows的操作系统那如果我再安装一个Windows的这个客户操作系统的话,我可以在我的电脑上同时启动两个客户操作系统,当然也可以只启动一个,只要我的硬件资源足够那我就可以在我的这个宿主操作系统之上安装并且同时启动多个客户操作系统,那显然在我的操作系统之上除了客户操作系统之外还会同时运行着很多我自己安装的一些进程,比如我的电脑上还在运行PPT相关的进程,同时我也可以启动我的这个客户操作系统让我的客户操作系统也正常的工作,而我的客户操作系统启动了之后就跟正常的操作系统一样,我也可以在上面安装软件也可以让这些软件正常的运行,如果想要给大家演示Windows操作系统的一些情况,那我就会启动一个Windows操作系统的虚拟机器然后在上面安装一些Windows的应用程序给大家做,这样的演示好所以第二类的虚拟机管理程序它并不是直接运行在硬件之上而是运行在宿主操作系统上面,这个虚拟机管理程序想要给各个虚拟机器分配硬件资源,那么他只能请求操作系统给他分配然后再由这个虚拟机管理程序进行再分配硬件资源的管理者,依然是宿主操作系统。

image-20230805155644440

三、两类虚拟机对比

那这是两类虚拟机管理程序第一类虚拟机管理程序和第二类虚拟机管理程序思想各不相同那由于他们的实现方式不同因此就造成了一些特性上的差异这给大家做一个总结首先对物理资源的控制权第一类的虚拟机管理程序它是直接运行在硬件之上的可以直接控制和分配这些物理硬件资源。而第二类的这个虚拟机管理程序它是运行在宿主操作系统之上的依赖于宿主操作系统为其分配物理资源他要使用硬件资源只能向宿主操作系统申请并且被分配好。因此两类虚拟机管理程序在给上层的这个客户操作系统分配资源的时候也会出现一些差异:比如第一类虚拟机管理程序在安装客户操作系统的时候他会直接在原本的硬盘上给他划分一些存储空间直接分配给他。比如说我把0号块到1024号块全部分配给第一台虚拟机VM1然后从1025号快一直到2048号快全部给他分配到第二台虚拟机VM2,我可以直接把一些未经抽象的物理资源分配给上层的虚拟机器那这就有点类似于我们之前说的外核的那种分配方式,那相比之下第二类的虚拟机器向宿主操作系统申请物理资源的时候宿主操作系统给他分配的这个资源是经过抽象的。比如第二类虚拟机管理程序想要给第一台虚拟机分配10个GB的磁盘存储空间那么这个虚拟机管理程序会向操作系统申请创建一个大小为10GB的大文件,那这个大文件具体存放在磁盘当中的哪些位置是由宿主操作系统来决定的,那虚拟机管理程序在获得了这10GB的大文件之后他又会把这10GB的空间给分配给第一台虚拟机器,让第一台虚拟机器以为自己好像拥有了10GB的磁盘存储空间一样,但事实上这只是一个虚拟磁盘这10GB的空间,在磁盘当中未必是连续的背后对应的是宿主操作系统文件系统当中的一个大文件而已,这是对于外存的分配那对于内存的分配是不是也一样?第二类的虚拟机管理程序向操作系统请求给他分配一片内存空间,那宿主操作系统给他分配了4 GB的内存空间但这4 GB事实上是虚拟内存对吧各个页面也许是离散存储的好那这个虚拟机管理程序获得了这4 GB的虚拟内存之后,又可以把这4 GB的虚拟内存拆分分给不同的这个虚拟机器比如第一台虚拟机器分两GB第二台虚拟机器又分两GB他就是这么干的。所以就是多增加了一层套娃他本身得到的也是一个虚拟的硬件资源然后他又把这个虚拟的硬件资源再虚拟再分配给各个虚拟机器那显然这会导致第一类虚拟机管理程序性能更好,因为我们每进行一次硬件的虚拟化就意味着上层的这些用户操作系统在使用这些硬件资源的时候他的这个地址需要先映射为这个虚拟机管理程序获得的这个虚拟地址空间,然后宿主操作系统又需要把这个4GB的虚拟地址空间再给映射到实际的物理地址空间,所以经过了多层的虚拟就意味着在使用这些资源的时候又需要经过多层的映射才可以对应到最终的一个物理地址上,那这就会导致第二类的虚拟及管理程序它的性能更差总是需要通过这个宿主操作系统作为中介,

image-20230805155721784

另一个方面在一台机器它的硬件资源确定固定不变的情况下,第一类的虚拟机管理程序往往可以支持更多台的虚拟机因为第一类的这个虚拟机管理程序他拥有所有的硬件资源对吧,而第二类的虚拟机管理程序他自己的资源需要跟宿主操作系统申请那宿主操作系统他本身也需要一些硬件资源,同时他上面的这些进程也需要使用一些硬件资源可以在硬件资源相同的情况下显然第一类的这个虚拟机管理程序可以支持更多台的虚拟机,这是可以支持的虚拟机数量

接下来虚拟机的可迁移性:第一类的虚拟机管理程序要迁移虚拟机比如要把这台虚拟机器迁移到另一个虚拟机管理程序之上那这个迁移的动作是比较麻烦的而第二类的虚拟机管理程序要迁移一台虚拟机就非常方便,比如我自己的这个虚拟机管理程序上我要迁移这个Linux操作系统我要把我的这个操作系统给你用,那么我只需要把这个操作系统导出导出为ISO就是镜像文件,然后你直接把我这个镜像文件考过去,在你自己的Virtual box上面一加载一安装你就可以使用到跟我这边完全一样的操作系统了,包括我在我的这个客户操作系统上安装的一些程序或者数据什么的都可以一起打包给你,然后你可以很方便的迁移到你自己的Virtual box上所以这是由于它的可迁移性好,所以第二类的这个虚拟机管理程序它的商业化应用目前来看是更广泛一些的,使用起来会很灵活

image-20230805155739401

最后运行模式方面:第一类的虚拟级管理程序它运行在最高的特权级别可以使用最高特权的指令那以前当我们介绍指令的时候只是把指令分为了非特权指令和特权指令这样的两个特权级别,但是在近几年的CPU当中指令的特权级可能会被进行更多层次的划分比如化为0级一级二级三级越往上特权级越低,越往下特权级别就越高所以这地方我们说第一类的虚拟级管理程序运行在0环指的就是它运行在最高的这个特权级别它可以使用最高特权的一些指令,把指令划分为更多的特权级别是有好处的,比如像刚才我们说如果指令只分为非特权指令和特权指令那么任何一条特权指令的这个使用都需要虚拟及管理程序把它截获并且判断这条特权指令的使用是否合法,如果合法的话还需要由它来模拟出特权指令执行的一个效果,但是如果我们对指令的这个特权级进行更精细化的一个分类。让第一类的虚拟程序运行在最高特权级,我们把这个最高的特权级别称为0环然后让这个客户操作系统的内核运行在一环次高特权级,接下来让用户进程运行在二环就最低的特权级那进行了这样的划分就可以保证当上层的客户操作系统他使用二环一环的这些指令的时候,我这个虚拟级管理程序不用管直接让你执行就行了,除非你需要使用到少数的一些0环的指令,我才帮你检查这些0环的指令应不应该让你执行会不会导致不安全等等,这就相当于我们把原本的特权指令进一步的进行了细分,把特权指令当中的一些敏感指令放在0环,然后把一些不敏感的指令放在一环,这样的话虚拟机管理程序不用检查每一条特权指令的执行,只需要检查某一些敏感指令的执行就可以了,所以在第一类的虚拟机管理程序当中只有虚拟机管理程序是运行在最高特权机的,上层的操作系统运行在次高优先级,再来看第二类的虚拟机管理程序,第二类虚拟机管理程序一部分运行在用户态,一部分运行在内核态,在内核态的这个部分是以虚拟机驱动程序的方式加载到操作系统内核当中的,那当上层的这个应用程序发出系统调用比如说要write系统调用的时候,上层的这个操作系统它可以直接去读写词盘吗?显然不可以,所以用户进程的系统调用会被虚拟机管理程序截获然后由虚拟机管理程序进行一些处理,代替他向底层的这个宿主操作系统发出right系统调用来请求底层宿主操作系统的服务,所以无论怎么看第二类的虚拟级管理程序它的性能肯定都会更差一些,这个宿主操作系统它总是要作为一个工具人作为一个中介来被使用,

image-20230805155757567

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/839442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows11 家庭中文版关于本地组策略编辑器gpedit.msc找不到即打不开的解决办法(征诚小张售后实测有效)

Windows11 家庭中文版关于本地组策略编辑器gpedit.msc找不到即打不开的解决办法 根本原因:是因为Windows11家庭中文版的 版本系统没内置安装本地策略组编辑器 好了废话不多说 直接说解决办法 第一步 首先电脑上新建一个空文本文件 输入以下内容: echo o…

Android Studio安装AI编程助手Github Copilot

csdn原创谢绝转载 简介 文档链接 https://docs.github.com/en/copilot/getting-started-with-github-copilot 它是个很牛B的编程辅助工具,装它,快装它. 支持以下IDE: IntelliJ IDEA (Ultimate, Community, Educational)Android StudioAppC…

Qt应用开发(基础篇)——时间类 QDateTime、QDate、QTime

一、前言 时间类QDateTime、QDate、QTime、QTimeZone保存了Qt的时间、日期、时区信息,常用的时间类部件都会用到这些数据结构,常用概念有年、月、日、时、分、秒、毫秒和时区,时间和时区就关系到时间戳和UTC的概念。 UTC时间,又称…

FPGA初步学习之串口发送模块【单字节和字符串的发送】

串口相关简介 UART 在发送或接收过程中的一帧数据由4部分组成,起始位、数据位、奇偶校验位和停止位,如图所示。其中,起始位标志着一帧数据的开始,停止位标志着一帧数据的结束,数据位是一帧数据中的有效数据。 通常用…

【贪心算法】leetcode刷题

贪心算法无固定套路。 核心思想:先找局部最优,再扩展到全局最优。 455.分发饼干 两种思路: 1、从大到小。局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。先遍历的胃口&a…

Win11大小写切换图标关闭方法

大家使用Win11操作系统的时候经常会切换大小写键盘,有些游戏本在游戏过程中需要切换大小写,这个时候电脑的屏幕就会出现大小写切换的图标而影响游戏体验; 那么想要关闭Win11电脑上大小写切换图标,又不知道具体怎么操作&#xff0c…

VS Code search tab

Vs Code search 栏的应用 我发现,在vs code种,上面的搜索框的功能非常多。在最初使用vscode时候,以为这只是一个普通的搜索框。后来,发现它可以用于全局搜索文件,比如使用ctrlshiftp。 后来,我发现&#xf…

lifecycleScope Unresolved reference

描述 导入了lifecycle.lifecycleScope,但是在activity中使用lifecycleScope报错出现Unresolved reference找不到引用。 导包 import androidx.lifecycle.lifecycleScope使用 lifecycleScope.launch(Dispatchers.IO) {...}错误 方案 代码中的activity继承Activ…

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--功能实现【四】

文章目录 SSM--功能实现实现功能06-修改家居信息需求分析/图解思路分析代码实现注意事项和细节 实现功能07-删除家居信息需求分析/图解思路分析代码实现 实现功能08-分页显示列表需求分析/图解思路分析代码实现完成测试分页显示效果 SSM–功能实现 实现功能06-修改家居信息 需…

39.利用matlab寻找素数(matlab程序)

1.简述 MATLAB嵌套循环允许使用一个循环在另一循环内,下面用一个嵌套循环来把所有从1到100的素数显示出来。 2.代码 %% 学习目标:寻找素数 clear sum5; %求0~100素数之和 ss0; %用来标定是否是素数,0表示不是 p…

MongoDB SQL

Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\Users\Administrator>cd C:\MongoDB\Server\3.4\binC:\MongoDB\Server\3.4\bin> C:\MongoDB\Server\3.4\bin> C:\MongoDB\Server\3.4\bin>net start MongoDB 请求的…

Mac电脑怎么使用“磁盘工具”修复磁盘

我们可以使用“磁盘工具”的“急救”功能来查找和修复磁盘错误。 “磁盘工具”可以查找和修复与 Mac 磁盘的格式及目录结构有关的错误。使用 Mac 时,错误可能会导致意外行为,而重大错误甚至可能会导致 Mac 彻底无法启动。 继续之前,请确保您…

【C# 基础精讲】C# 开发环境搭建(Visual Studio等)

安装C#开发环境是开始学习和使用C#编程的第一步。目前,最常用的C#开发环境是Microsoft Visual Studio,它是一套强大的集成开发环境(IDE),提供了丰富的工具和功能,使开发C#应用程序变得更加便捷。以下是安装…

OSLog与NSLog对比

NSLog: NSLog的文档,第一句话就说:Logs an error message to the Apple System Log facility.,所以首先,NSLog就不是设计作为普通的debug log的,而是error log;其次,NSLog也并非是printf的简单…

Redis 6.5 服务端开启多线程源码

redis支持开启多线程,只有从socket到读取缓冲区和从输出缓冲区到socket这两段过程是多线程,而命令的执行还是单线程,并且是由主线程执行 借鉴:【Redis】事件驱动框架源码分析(多线程) 一、main启动时初始化…

nacos本地搭建+springCloud服务注册中心-nacos(简易实现)

一.nacos概述 nacos官网 二.Windows使用搭建nacos 较为完整使用参考 1.安装nacos 去nacos github下载nacos最新稳定版本,我用的是nacos-server-2.2.3.zip,下载后解压,得到 2.创建数据库 启动mysql,创建数据库nacos&#xff…

Day 72 固定激活函数的BP神经网络 (1. 网络结构理解)

代码: package dl;/*** Back-propagation neural networks. The code comes from*/public class SimpleAnn extends GeneralAnn{/*** The value of each node that changes during the forward process. The first* dimension stands for the layer, and the secon…

[迁移学习]领域泛化

一、概念 相较于领域适应,领域泛化(Domain generalization)最显著的区别在于训练过程中不能访问测试集。 领域泛化的损失函数一般可以描述为以下形式: 该式分为三项:第一项表示各训练集权重的线性组合,其中π为使该项最小的系数&a…

微信云托管(本地调试)⑥:nginx、vue刷新404问题

一、nginx默认路径 1.1、默认配置文件路径:/etc/nginx/nginx.conf 1.2、默认资源路径:/usr/share/nginx/html/index.html 二、修改nginx.conf配置 (注意配置中的:include /etc/nginx/conf.d/*.conf; 里面包了一个server配置文件…

Typescript+React入门

初识Typescript 出现背景 Typescript(以下简称TS)实际上就是JavaScriptType,用数据类型的方式来约束了JS的变量定义 在JS的基础上增加了类型支持 在JS中大多数错误都是因为数据类型造成的,所以TS为了规避这个问题加入了类型限制…