408-部分知识点笔记(自用)

一、操作系统部分

1.内中断(异常)和外中断(中断)

1.1 异常(内中断)

异常就是指CPU内部发生的中断,与当前正在执行的程序有关。类似的内中断有:缺页中断、算法溢出、除以0错误、存储保护错等等

1.2 外中断(不可屏蔽和可屏蔽)

中断就是CPU外部发生的中断,电源、I/O设备都算是CPU外部,与当前正在执行的程序无关。类似的外中断有:电源没电、I/O设备读写、DMA请求等等

不可屏蔽中断

是指即使CPU处于关中断状态也必须及时响应的外中断

可屏蔽中断

CPU处于关中断时可以响应也可以不响应。

img

这道题比较特殊,答案是C。A不对,因为中断的优先级是通过中断屏蔽字决定的,不是由先后次序决定的;B也不对,中断隐指令保存的是断点PC,通用寄存器是OS保护的;C乍一看其实是不对的,因为有不可屏蔽中断嘛,但是这种题要着重看题干信息,题干明确说了I/O中断,I/O中断显然是可屏蔽中断,所以这个C选项是正确的;D不对,执行中断服务程序之前,CPU首先要保存断点和中断服务寻址。

1.3 中断和陷入
  • 中断:是指 CPU 对 I/O 设备发来的中断信号的一种响应。CPU 暂停正在执行的程序,保留 CPU 环境后,自动地转去执行该 I/O 设备的中断处理程序。执行完后,再回到断点,继续执行原来的程序。
  • 陷入(trap):由 CPU 内部事件所引起的中断,例如进程在运算中发生了上溢或下溢又如程序出错,如非法指令、地址越界,以及电源故障等。

2.消息传递、管道、管程、死锁

2.1 消息传递(应用最广泛,微内核、分布式系统、计算机网络都使用)

在消息传递模式中,进程之间必须通过 发送消息和接受消息 两个 原语 实现。进程间的数据交换以格式化的消息为单位

  • 直接通信(指名道姓,明确表示要发给谁

发送进程直接把消息发给接受进程,将消息挂载到接收进程的 消息缓冲队列位于OS内核中),然后接受进程从自己的消息缓冲队列取消息。

  • 间接通信(匿名消息,直接把消息放进邮箱,谁需要谁自己拿

发送进程不直接发给接受进程,而是发给中间实体——信箱。接受进程自觉从信箱取消息。

2.2 管道(Linux)

Linux编程使用过这个机制。管道本质上其实是一种特殊的文件。 管道具有以下几种特点,记住了就能应对选择题:

  • 管道必须非空时才能读取,非满时才能写入,否则管道就处于阻塞状态。因为管道的读是不一样的,管道每次读完数据之后,数据就自动删除了!当然,读操作可能比写操作更快,因为所有数据被读出时,管道为空;
  • 管道的大小是OS规定的,不能人为修改。一般就是一个页面的大小,因为管道就是文件
  • Linux里管道是支持同时多写多读的,但是408里只说了管道可以同时多写一读
  • 管道只能被创建进程访问。不过由于管道是一种特殊文件,所以父进程创建的管道子进程也是可以继承的,而且父子进程还可以使用同一个管道进行通信。
2.3 管程

管程就相当于一个类,其中的共享数据结构、条件变量都是private的,只能被管程自己直接使用;进程只能通过调用管程的public方法才能访问共享数据结构。实际上,管程是通过编译器实现进程互斥的。

monitor GuanCheng{
    //共享数据结构S...
    // 定义一个局部变量x
    private condition x;
    init(){
       //初始化变量和共享数据结构s
       x=...
    }
    // 取走一个资源
    take_away(){
       // 管程里的wait和信号量完全不一样,这个wait()只会阻塞,剩余资源数只能由共享数据结构表示
       if(S<=0) x.wait();
    }
    // 归还一个资源
    give_back(){
        if(有进程在等待) x.signal();
    }
}
管程和信号量有什么区别?

这里必须要清楚,管程只是类似信号量,但是归根结底其实是两个东西。

  • 首先,信号量的功能更强,P/V操作不仅可以阻塞,还可以自动减少和增加资源数;但是管程的wait()和signal()特别弱智,只能够阻塞和唤醒,资源的数量只能由共享数据结构手动记录
  • 信号量可以自定义初始值,初始值可大可小。但是管程每次只允许一个进程进入,就相当于管程是一个初始值固定为1的mutex信号量,非常受限
2.4 死锁预防、死锁避免、死锁检测和解除

死锁产生的原因:倒不是因为资源数量不够,真正的原因是 竞争不可剥夺资源以及进程推进顺序非法。虽然说资源非常充足的情况下不会死锁,但其实发生死锁的时候,只要顺序得到,资源数量其实是够用的。

死锁预防

做法是破除死锁的四个必要条件之一,包括:

  • 破坏互斥条件(这个基本实现不了)
  • 破坏不剥夺条件(强行剥夺某个占据资源的进程,属于强盗行为)
  • 破坏请求并保持条件(进程运行之前一次性吞掉所需要的资源,运行完之后再释放给其他进程再用,不过容易造成饥饿,资源利用率低)
  • 破坏循环等待(强行限制进程访问顺序,给资源编号
死锁避免

死锁避免有一个非常大的误区:死锁避免本身能做的非常有限,类似CSMA/CD。每当有进程发起资源申请时,就使用银行家算法检测系统是否处于不安全状态。如果处于不安全状态,就直接拒绝该请求;反之则满足该请求。

死锁避免本身不能限制进程访问的顺序!!!!!!!!,它能做的最大的也就是拒绝进程的资源申请!!!!

死锁检测和解除

这种方法算是纯纯的CSMA/CD了,完全开摆,进程申请资源不受任何限制,使用资源分配图检测是否发生死锁。

如果发生了死锁,那么有以下三种解除方法:

  • 强行挂起某些死锁进程,并强行剥夺其占据的资源;
  • 不挂起,一点机会都不给,强制撤销死锁进程并剥夺资源(代价最大,进程还得重新再启动运行
  • 类似@Transactional,回退进程到某状态,不过这个要求系统保存进程的历史信息,设置还原点

3.抖动、工作集、内存映射

3.1 抖动

抖动是指主存页面置换过程中,刚刚换出的页面马上又要换入主存,刚刚换入的又要换出主存,导致CPU利用率急剧下降直逼为0

3.2 工作集

工作集是指某段时间内,进程要访问的页面集合。

3.3 内存映射(新概念)

内存映射的主要应用是让磁盘文件的全部或者部分内容与进程虚拟地址空间建立映射关系,这样以来,进程可以直接访问映射文件,不用再进行I/O操作

进程可以通过共享内存实现通信,这里要注意的是,共享内存是通过映射相同文件到进程的虚拟地址空间实现的,这个所谓的相同的文件就叫做内存映射文件。多个进程允许并发地内存映射同一文件,以便允许数据共享。

注意:无论是进程、程序、还是链表,在虚拟地址(逻辑地址)上必定是连续的,在物理地址上不一定连续(因为如果使用的是页式管理,仅一个页面肯呢个装不下)

4.I/O设备

I/O设备中有两个非常容易混淆的概念:

  1. I/O接口(也就是设备控制器):可以接收和译码CPU发来的I/O指令,比如磁盘控制器可以接收read、write、search指令;可以识别地址;可以进行设备和控制器之间的数据传输;还可以及时报告设备的状态,如果设备出错及时告知CPU;
  2. I/O端口(其实就是设备控制器中的寄存器):包括数据寄存器、控制寄存器(I/O命令)、状态寄存器(设备状态)

I/O设备和CPU之间的数据传输实际上就是 寄存器与寄存器之间的数据传输

4.1 I/O软件层次

img

① 用户层I/O软件

直接面向用户,内部直接提供了I/O操作有关的库函数,在这些库函数中,还是得依赖系统调用才能获取I/O服务。

② 设备独立性软件(易错点,系统调用处理层,其实就是一个中介层)

介于用户程序和设备处理器之间,算是系统调用层,和操作系统内核一个等级。 比如OS中常用的read和write指令。

最大的贡献:实现了设备独立性,能够把逻辑设备名转换为物理设备名

设备独立性软件的功能没有想象中那么强,它更多起到一个分配设备(类似结婚礼金的登记员)的作用。

什么是设备独立性?

其实就是使应用程序独立于物理设备,引入了逻辑设备和物理设备的概念。这里必须提一句,设备独立性和缓冲区没有任何关系,设备独立性可以理解为一台物理设备可以有多个昵称(逻辑设备名),本身物理设备的名字不好念,但是大家在使用不同的昵称时,该设备都能回应。

比如下面这段代码,本身只使用了webCamTexture.devices这个逻辑设备变量,但是不管在哪台手机上都能正常运行

private IEnumerator Start()
    {
      if (WebCamTexture.devices.Length == 0)
      {
        throw new System.Exception("Web Camera devices are not found");
      }
      var webCamDevice = WebCamTexture.devices[0];
      _webCamTexture = new WebCamTexture(webCamDevice.name, _width, _height, _fps);
      _webCamTexture.Play();

      yield return new WaitUntil(() => _webCamTexture.width > 16);

      _screen.rectTransform.sizeDelta = new Vector2(_width, _height);
      _screen.texture = _webCamTexture;
    }
③ 设备驱动程序(易错点,硬件层,I/O指令解析层)

这层是硬件层,设备驱动非常常见,驱动程序是厂家在设备出厂的时候就写好的。不同的设备对应不同的驱动程序。

注意:设备驱动程序并不是直接装在硬件上的,而是在本机的磁盘或者固态硬盘上的。所谓"驱动",其实就是通过驱动程序响应中断请求,再让终端处理程序处理I/O操作。

比如我的电脑上的扬声器和屏幕,这两个都是单独的硬件,但是我可以在官网商店下载扬声器和屏幕的驱动程序,对声音和屏幕亮度进行调节。

设备驱动程序的主要任务是启动指定设备,完成上层指定的 I/O工作。但在启动之前应先完成必要的准备工作,如检测设备状态是否为“忙”等。在完成所有的准备工作后,才向设备控制器发送一条启动命令。

因此,在多道程序系统中,驱动程序一旦发出 I/O 命令,启动了一个 I/O 操作后,驱动程序便把控制返回给 I/O 系统,把自己阻塞起来,直到中断到来时再被唤醒。具体的 I/O 操作是在设备控制器的控制下进行的,因此,在设备忙于传送数据时,处理机又可以去干其它的事情,实现了处理机与 I/O 设备的并行操作。

设备独立性软件的功能
  1. 接收由与设备无关的软件发来的命令和参数,并将命中的抽象要求转换为与设备相关的低层操作序列。
  2. 检查用户 I/O 请求的合法性,了解 I/O 设备的工作状态,传递与 I/O 备操作有关的参数,设置设备的工作方式。
  3. 发出 I/O 命令,如果设备空闲,便立即启动 I/O 设备,完成指定的 I/O 操作;如果设备忙碌,则将请求者的请求块挂在设备队列上等待。
  4. 及时响应由设备控制器发来的中断请求,并根据其中断类型,调用相应的中断处理程序进行处理。

需要注意的是,设备驱动程序与I/O控制方式是直接相关的

④ 中断处理程序

用于保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完毕后恢复中断现场。

中断处理程序才是真正干活的部分,只有在中断处理程序中才能搬运寄存器中的数据。所谓设备驱动程序,“驱"的就是中断处理程序这个"动”。

也就是说,设备处理程序最多就起到一个检验设备状态、判断命令和参数合法性的作用,本质上也只是启动中介作用。

img

总结

这里我们通过一个实际工作场景理解一下四层软件的关系。假设我们要读取某个设备的内容,

  • 我们首先在应用层要调用封装好的库函数,库函数内部又会调用系统调用接口
  • 库函数的那些系统调用会在设备独立性软件层得到处理,然后发出read或者write等指令;
  • 刚才说了,设备独立性软件层提供的是公共操作,因此,不管你连得是打印机还是磁盘还是固态硬盘,所收到设备独立性软件发过来的东西全都是同样的read或者write指令。那么这样的话,不管是打印机、磁盘、固态硬盘,都会执行同样的功能??显然不是,因为打印机、磁盘、SSD都有自己的驱动程序,同样的read或write在经过不同的驱动程序之后会产生不同的硬件指令,因此,不同的设备也就会执行不同的功能
  • 命令解析完成之后,I/O设备控制器不会立马自动执行命令。CPU会先中断当前进程,进入中断处理程序,转而开始执行read、write指令;
  • CPU开始执行之后,设备控制器才能真正的接受命令并控制硬件完成工作
4.2 I/O控制方式
① 轮询的可编程 I/O 方式

​ 处理机向控制器发出一条 I/O 指令,需要不断地循环测试 I/O 控制器的状态。==整个过程中不会切换进程,所以进程不会进入阻塞状态,一直处于运行转态。==不过也正是因为进程一直在运行,CPU大部分时间也干不了别的活,就是在循环测试,所以CPU资源极大浪费了。

**缺陷:**CPU 的绝大部分时间都处于等待 I/O 设备完成数据 I/O 的循环测试中,造成对 CPU 的极大浪费。// 此方式下CPU中无中断机构

② 中断的可编程 I/O 方式

​ CPU 向 I/O 设备的设备控制器发出一条 I/O 命令,立即返回继续执行原来的任务。设备控制器根据命令的要求去控制指定 I/O 设备。例如输入时,一旦 I/O 数据准备完成,控制器便通过控制线向 CPU 发送中断信号,通知 CPU 获取数据。//CPU和I/O设备并行执行

该方式下,CPU 和 I/O 设备都处于忙碌状态,提高了整个系统的资源利用率及吞吐量。

③ DMA 控制器

​ 中断驱动 I/O 是以字节为单位进行 I/O 的。每当完成一个字节的 I/O 时,控制器便要向 CPU 请求一次中断。也就是说,为了从磁盘中读出 1KB 的数据块,需要中断 CPU 1K 次。

DMA原理:

区别于程序查询方式和中断驱动方式每次只能传输一个字节,DMA一次可以传输一整块的字节。 因为DMA会取得总线控制权,它会先将I/O接口的数据从I/O接口搬到主存的块中,在DMAC发出的信号下可以依次传输整个块的数据。

由此可见,DMA非常巧妙的使用到了主存,全程只是开始和结束的时候使用到CPU(开始的时候要向CPU请求总线控制权,结束的时候DMAC要发送中断请求结束传输)

过程:
  1. 首先,外设 ( 注意不是DMAC自己发出的 ) 会向DMAC发出DMA请求,通知DMAC向CPU请求总线控制权
  2. DMAC获得总线控制权后,优先级要比CPU更高,因为要确保I/O接口的数据被及时取走,然后开始传输数据
  3. 传输结束之后,DMAC主动向CPU发起中断请求,通知CPU中断已经结束
易错点:
  • 中断响应过程需要先保护现场,而DMA请求和中断不需要保护现场;
  • 发出DMA请求的是外设,不是DMAC!!
  • 数据传输的时候确实是完全由DMA控制,CPU不用管
  • CPU响应中断的时期是执行周期结束之后!! CPU响应DMA请求的条件是存取周期(机器周期)!! 原因是每个存取周期都相当于保存和写入一个单元的最短时间间隔,而我们学习指令那一章的时候写过 读主存和写主存的 微操作, 读主存和写主存的那个机器周期其实就是存取周期
  • DMA的数据传输是纯靠硬件电路实现的,其他几种方式包括通道都需要程序进行控制
  • 数据传输的基本单位是数据块
  • 所传送的数据是从设备直接送入内存的,或者相反。
  • 仅在传送一个或多个数据块的开始和结束时,才需 CPU 干预,整块数据的传送是在DMA控制器的控制下完成的。
  • DMA开始时的请求是外部设备主动发送的,DMA结束的时候才是DMA控制器发送的结束请求。
DMA只能用于数据传输!不能用于键盘和鼠标的输入!因为键盘和鼠标需要检测是否报错,但是DMA不具备报错功能
DMA请求优先级 > 不可屏蔽中断 > 可屏蔽中断 (防止高速设备数据丢失)
image-20231111001205071

通道相当于一个low版CPU,DMA一次只能处理一个设备,但是通道可以同时处理多个设备。通道本身是硬件,但是需要软件(主存中的通道程序)控制。只有DMA方式是纯靠硬件电路实现的。

image-20231111001405142

DMA请求的优先级甚至是要比不可屏蔽中断还要高的。而且DMA请求发生在机器周期结束后,只要CPU不占用总线,DMA就能发起请求;中断发生在执行周期之后。如果不开中断,那么不可屏蔽中断还是可以响应的,否则高优先级中断就无法响应。

这里再着重说明一下。DMA中断就是I/O中断的一种,I/O中断使用的是I/O设备,本身与CPU正在执行的程序是无关的,除非是I/O设备有CPU需要用的数据或指令,要先转移到主存中。而可屏蔽中断和不可屏蔽中断其实就是专门针对异常(内中断)而言的,因为这与正在执行的程序有关。

比如,CPU在执行程序A的时候发生了算法溢出,正在进行中断处理的时候DMA发来请求,说要传一下数据。那么CPU就优先响应DMA请求,你DMA有数据就快点地传,别老烦我运行程序A,反正你DMA再怎么能耐也只能动外设,我CPU才是运行程序的大哥。

④ I/O 通道

​ 在 DMA 方式下,CPU 每发出一条 I/O 指令,仅能去读写一个连续的数据块。当需要一次去读写多个数据块时,则必须由 CPU 分别发出多条 I/O 指令及进行多次中断处理才能完成。

I/O 通道方式是 DMA 方式的发展,它可进一步减少 CPU 的干预,即把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预。同时,又可实现 CPU、通道和 I/O 设备三者的并行操作,从而更有效地提高整个系统的资源利用率。(读写单位由一个数据块转为一组数据块

控制方式的发展,总结起来就是:无中断 -> 有中断(字节) -> 数据块 -> 多个数据块

4.3 缓冲区和SPOOLing技术
① 缓冲区的时间计算问题

最大的作用:缓解I/O设备和CPU速度不匹配的问题,提高CPU和I/O设备的并行性

至高原则:必须等缓冲区为空时才能向缓冲区写信息,必须等缓冲区满的时候才能从缓冲区取数据。

单缓冲
image-20231129005550269

假设输入缓冲区的时间为T,从缓冲区取数据的时间为M,CPU处理数据的时间为C

那么处理每块数据的用时为 max(C , T) + M

双缓冲

双缓冲的自由度仍然比较低,而且要求比较恶心:两个缓冲区必须在其中一个刚好写满或者读空的时候才能写数据。也就是说,两个缓冲区不能同时写入或者同时读出!!!两个缓冲区唯独在一个在写、一个在读的时候才能并行

处理每块数据的用时为 **max(C +M,T) **

循环缓冲

其实就是一个环形链表,缓冲区设置 in 和 out 指针。

缓冲池

设置空缓冲队列、输入队列和输出队列,再设置收容输入、收容输出、提取输入、提取输出的缓冲区。

② SPOOLing技术

最大的贡献:提供了虚拟设备,也就是实现了设备I/O操作的批处理

主要适用对象是多个打印机或者其他I/O设备,这些机器的特点是每次只能有一个设备能被访问,其实也就是独占设备

SPOOLing技术其实就是在磁盘上开辟缓冲区,然后在内存中开辟输入井和输出井,打印机等设备把内容先输入到磁盘缓冲区中,然后缓冲区的内容在通过内存被CPU访问;同样的,CPU也可以把预打印内容先放入输出井 -> 磁盘缓冲区 -> 打印机

当系统中引入了多道程序技术后,利用其中一道程序,模拟脱机输入时的外围控制机功能,把低速 I/O 设备上的数据传送到高速磁盘上。再用另一道程序模拟脱机输出时外围控制机的功能,把数据从磁盘传送到低速输出设备上。这样,便可在主机的直接控制下,实现以前的脱机输入、输出功能。(同时启动多个进程对 I/O 设备进行操作)。此时的外围操作与 CPU 对数据的处理同时进行,我们把这种技术称为假脱机技术SPOOLing。(Simultaneaus PeriphernalOperating OnLine)

2.2 假脱机系统的工作原理

假脱机技术是对脱机输入/输出系统的模拟,它建立在通道技术和多道程序技术的基础上

img

2.3 - 假脱机系统的组成

​ 输入井和输出井。这是在磁盘上开辟出来的两个存储区域。输入井模拟脱机输入时的磁盘,用于收容 I/O 设备输入的数据。输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据。输入/输出井中的数据一般以文件的形式组织管理,我们把这些文件称为井文件。一个文件仅存放一个进程的输入或输出数据,所有进程的数据输入或输出文件链接成为一个输入或输出队列

输入缓冲区和输出缓冲区。这是在内存中开辟的两个缓冲区,用于缓和 CPU 和磁盘之间速度不匹配的矛盾。输入缓冲区用于暂存由输入设备传送的数据,之后再传送到输入井。输出缓冲区用于暂存从输出井传送的数据,之后再传送到输出设备。

输入进程和输出进程。输入进程用于模拟脱机输入时的外围控制机,将用户要求的数据从输入设备传送到输入缓冲区,再存放到输入井。当 CPU 需要输入设备时,直接从输入井读入内存。输出进程用于模拟脱机输出时的外围控制机,把用户要求输入的数据从内存传送并存放到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区输出至输出设备上。

井管理程序。用于控制作业与磁盘井之间信息的交换。当作业执行过程中向设备发出启动输入或输出操作请求时,由操作系统调用井管理程序,由其控制从输入井读取信息或将信息输出至输出井。

2.4 - 使用守护进程(daemon)

思想:事实上,凡是需要将独占设备改造为可供多个进程共享的设备时,都要为该设备配置一个守护进程和一个假脱机文件队列(目录)。//如打印机守护进程、服务器守护进程、网络守护进程等。

同样,守护进程是允许使用该独设备的唯一进程,所有其它进程都不能直接使用该设备,只能将对该设备的使用要求写入一份文件中,放在假脱机目录中。由守护进程按照目录中的文件依次来完成诸进程对该设备的请求,这样就把一台独占设备改造为可为多个进程共享的设备。//守护进程的工作原理

这种思想就像是执行一个定时程序,又像是两个进程之间通过一个中间邮箱来进行通信

5.文件系统

5.1 磁盘格式化
① 低级格式化(物理分区)

低级格式化是万事之本,假设你买了一个新的固态硬盘或者磁盘,把它放入电脑托盘中之后操作系统肯定是不能立即投入使用的。首先总得看看你买的这个硬盘有没有异常,然后将其划分为扇区,对每个扇区再创建数据结构方便管理。

  • 划分扇区、检测坏扇区、为每个扇区使用特殊数据结构,包括检验码
  • 低级格式化的目的是将磁盘表面划分为基本元素:磁道。它们是写在盘片两侧的同心区域;扇区:轨道被分成几个称为扇区的部分;柱面:位于不同盘片的同一磁道上的所有数据。
② 划分活动分区

将磁盘划分为一个或多个柱面组成的分区,即C、D盘。 因为操作系统是必须要放在系统分区的,如果不进行分区可能会乱套(当然IOS系统除外)

③ 逻辑格式化:

规划好分区之后,我们程序员并不了解每一个扇区,对于我们来说,好理解的、能够直接理解的就是逻辑结构,比如连续文件、索引文件啥的。而且逻辑结构本身有多种,所以操作系统必须创建一个文件系统对文件的物理结构和逻辑结构进行统一管理。

  • 将初始的文件系统数据结构存储到磁盘上,这些数据结构包括空闲和已分配的空间以及一个初始为空的目录;建立文件系统根目录对保存空闲磁盘块信息的数据结构进行初始化
  • 逻辑格式化目的:尽管硬盘驱动器非常小,但它们仍然包含数百万位,因此需要进行组织,以便定位信息。逻辑格式化在硬盘上创建一个文件系统,允许操作系统使用硬盘空间来存储和访问文件。
5.2 虚拟⽂件系统VFS

目的: 为用户程序提供了文件系统操作的统一接口,屏蔽了不同文件系统差异和操作细节
特性: 能提高系统性能,不是一种实际的文件系统,只存在于内存中,不存在与任何外存空间中,在系统启动时建立,在系统关闭时消亡

VFS的数据结构:

  • 超级块对象(一个超级块对应一个文件系统)
  • 索引节点对象
  • 目录项对象
  • 文件对象

VFS向下屏蔽了各种文件系统的差异,向上提供了同一的文件调用函数(open、read、write)

6.父子进程、内核线程、系统线程

父进程和子进程能够共享文件和管道(管道本身也就是一种特殊的文件),但是访问互斥资源的之后也还是得进行互斥操作

系统线程是操作系统内核中的线程,系统线程可以同时被多个不同进程使用,被多个不同进程使用的系统线程始终都是同一个

6.1 驻留集与工作集

此前关于驻留集、页表、工作集的理解存在严重误区,这里纠正一下。

工作集只是一个逻辑概念,指的是当前进程正在使用的物理快数;

每个进程都有一张自己的页表,记录着自己的所使用的数据的

驻留集是指分配给进程的物理块的最大数量,是真正影响LRU算法、OPT算法、FIFO算法的。进程的页表表项可以很多,但其实分配给进程的物理块最大数量是有限的,在收到不同的页号请求时,进程不断地切换自己使用的物理块,灵活切换物理块实际上是通过有效位实现的。

请注意,进程分配到的物理块在进程使用过程中始终不会改变,变化的只是物理块的内容,物理块号始终不变!!

例1

我们假设进程1的驻留集为2,且进程1的页表如下表所示:

虚页号页框号(实页号)有效位LRU算法位
001H221H1001B
002H923H0
003H535H1010B

那么,这张表蕴含着很多信息,当前状态下,进程的驻留集为2,说明分配给进程1的最大物理块数为2;001H号和002H号虚页的有效位为1,说明驻留集中此时的物理块号(实页号)正好为{221H、535H}两块;

这就意味着,进程在执行过程中使用的物理号永远都是{221H,535H},只更换这两个物理块的内容,不会修改块号!那个923H物理块对当前进程来说,实际上是没有作用的

我们假设某时刻CPU突然收到虚页号为002H的页面访问请求,此时查询页表,发现002H的有效位为0,那么发生缺页中断;此时OS要使用中级调度将虚页002H的内容调入内存,这一步要特别注意!!

进程驻留集为2,此时进程分配到的221H、535H两块都被占用,因此必须从这两个物理块中腾出来一个块来放,根据LRU算法位,我们选择数值更大的535H块进行内容替换。 至于那个935H,可能是其他进程所使用的物理块,与当前进程实际上是无关的;然后535H块的内容换成虚页002之后,003H的页框号不确定(一般认为是空的),有效位置为0

虚页号页框号(实页号)有效位LRU算法位
001H221H1001B
002H535H(535H块的内容换成虚页002H 1000B
003H——0
6.2 几种缺失的比较
(1)TLB快表缺失

TLB是用SRAM构成,直接集成在CPU上面,属于相联存储器,查找速度非常快。TLB的作用是根据虚页号快速找到实页号。

但是,TLB缺失必须要分情况处理,这个地方误区比较大,特别记录一下

还有,无论TLB是否命中,都必须再访问一次主存,因为TLB得到的页框号!!

① TLB命中,页表也命中

全程访问一次TLB。CPU访问一次TLB之后,得到实页号计算出主存地址。然后根据主存地址访问一次主存,得到数据。

总共花费的时间:访问TLB的时间+访问主存时间(为了获取数据)

② TLB缺失,但是页表命中

全程仅访问一次TLB。CPU先访问一次TLB,不命中;因此需要访问一次主存中的页表,获得实页号计算出主存地址;使用主存地址再次访问主存,得到主存地址对应的数据。

所以总共花费的时间是: TLB访问时间+主存访问时间(查页表,访问1次主存)+主存访问时间(查数据,访问1次主存)

③ TLB缺失,页表也缺失

全程共访问两次TLB。CPU先访问一次TLB,TLB缺失;因此访问主存中的页表,然后页表也缺失;因此使用中级调度,把数据从外存搬到内存。数据搬到主存后,如果主存已使用块数已满,则替换出一块;如果主存的还有空闲块,则占用之。数据换到主存之后,会修改进程的页表和TLB

刚才的TLB缺失属于硬件缺失,只是高速缓存不命中,不属于异常!!!而页表缺失属于异常,会引发缺页中断,两个不是一个级别的。由于缺页异常属于中断,因此会重新执行缺页中断的那条指令,这也就是为什么页表缺失之后会再次访问TLB。

由于要重新执行缺页中断的那条指令,所以指令从头开始,按照访问 TLB->页表->… 的流程重新执行一次。所以需要再次访问TLB,刚才说了,数据从外存换到主存之后,页表和TLB已经修改好,所以再次访问TLB的时候,一定是TLB命中+页表命中的情况。

所以总共花费的时间是:TLB访问时间(TLB缺失)+主存访问时间(查主存中的页表)+ 缺页中断处理时间+ TLB访问时间(TLB命中,得到实页号)+主存访问时间(通过主存地址查找到数据)

(2)Cache缺失

Cache也是SRAM构成,也是集成在CPU上面,作用是根据主存地址标记字段,与自己Cache行的标记项作比较

如果相等,那么直接使用当前行的块内地址,读取当前块内的某个字或字节

缺失处理:

如果在Cache中没有找到该主存地址对应的标记字段,那么就发生了Cache缺失。CPU会继续在主存中查找存储单元,Cache在CPU找到该块之后,将该块调入Cache中,写入其对应的标记字段,并将有效位置为1,如果有用到控制位(如LRU算法位)或脏位,同时也会修改控制位和脏位

(3)页面缺失

主存是由DRAM和ROM构成的,如果发生页面缺失也即发生缺页中断,说明页面不在主存而是在磁盘上,此时需要从磁盘中读块到内存中

缺页中断的响应是在指令执行的过程中,也即执行周期中,缺页中断是异常!!异常也就是内中断!

如何区分异常和中断?

和当前正在执行的程序有关的就是异常,和当前正在执行的程序无关的就是中断!

异常(内中断)是指CPU内部发生的中断,其实也就是在执行过程中产生的,和当前正在运行的程序有关,比如缺页中断、算术溢出等等。而中断(外中断)是CPU外部发生的中断,与当前正在执行的程序无关,比如电源漏电、I/O中断等等。

中断或异常处理完成之后是否可以回到被中断的指令继续执行要分类讨论。有的异常系统是可以补救的(缺页异常、Trap指令),由于是可以补救的,所以补救好之后可以回到被中断的那条指令继续执行;也有的异常根本就没办法补救(比如地址越界就说明指令所取数据的地址根本就不对,根本就执行不成功;比如页面失效/除数为0的时候,指令也根本就无法执行;又或者电源突然漏电,这时候电脑都跑不起来了,肯定执行不了指令),所以这种情况计算机认为"无解",只能终止程序执行

image-20231111005951743

异常(内中断)是CPU内部发生的中断,与当前正在执行的程序有关;中断(外中断)是CPU外部发生的中断,与当前正在执行的程序无关。

缺页、整数除以0、存储保护错都是和当前正在运行的程序有关的,所以属于异常;而DMA传送属于I/O方式的一种,操作对象是外设,本身与CPU无关,因为I/O设备就是和CPU并行工作的,所以属于中断。

(4)虚拟存储器缺失

虚拟存储器本质上就是一张表,从磁盘搬数据到主存的时候就需要用到虚拟存储器。

虚拟存储器的作用就是扩大了主存的寻址空间,原本主存可能只有8G,只能通过物理地址访问。现在有了虚拟存储器,可以利用64bit的逻辑地址访问,由虚拟存储器完成虚页号到实页号的转换。

6.3 进程控制块、文件控制块

进程控制块的内容:PID、进程转态、进程队列指针、程序和数据地址、进程优先级、CPU现场保护区、进程打开文件列表的指针。

不过PCB中没有进程地址空间的大小,因为进程地址空间可能会动态变化,除非使用固定分区分配,否则不能预先确定进程占用的地址空间

二、数据结构部分

1.B树、B+树、红黑树

1.1 B树(插入、删除都要掌握)和B+树
m阶B树m阶B+树(比B树多一个key)
根节点可以只有1个key,其余结点至少有[ [m/2]-1 , m-1 ]个key根节点可以只有1个key,其余结点至少有[ [m/2] , m ]个key
不允许有重复的关键字允许有重复的关键字
分支节点的值和子节点必不一样,而且必定有序分支节点存储的是子节点中的最大值,所以key会重复
仅支持随机查找支持随机查找和顺序查找
查找到分支节点的时候可能就停止查询了必须查找到根节点才能停止查询
可以用于文件索引可以用于数据库的索引
  • B树的插入(从中间断开)
  • B树的插入(找兄弟借,兄弟够借兄弟的,兄弟不够借父亲的)
题目1
image-20231119003825157

image-20231119010129929

题目2
image-20231119010201184

前几步都很简单,但是最后一步需要注意,删除结点时永远是先向兄弟借结点,兄弟不够借的时候才从父节点拿一个过来和子节点合并

image-20231119012920654

1.2 红黑树

红黑树的概念比较难,只要掌握好基本概念和插入就好。

必记概念
  • 红黑树本质上是优化后的平衡二叉树,左右子树的高度相差不超过2倍
  • 绝对不能存在两个相邻的红节点!!红节点的父亲和子节点必定为黑色!
  • 根节点和叶节点必定是黑色的
  • 任意结点到任意叶节点的简单路径上,黑色结点的数目都是一样的
  • 红黑树中,最短的路径一定全是黑色结点,最长的路径一定是红黑相见的。而且最长路径<=2*最短路径;
  • 红黑树删除一个结点之后,至多旋转3次

image-20231119004507717

三、计算机网络部分

1.数据链路层

1.1 802.11无限局域网(三地址问题)

VLAN是将物理的局域网通过VLAN标识在逻辑上划分为多个广播域的通信技术。不同VLAN使用路由器进行通信和划分,一个VLAN可以包含多个交换机

一个VLAN其实既算是一个广播域,又算是一个冲突域。不过一般来说,还是认定VLAN是广播域。

这里需要注意,帧的地址格式和IP分组还有TCP报文、UDP报文不相同,帧是"目的地址"+“源地址”,后者均为"源地址"+“目的地址”

image-20231124003109492

这里需要特别注意802.11的三地址:

  • 两个帧其实是有规律的,前两个地址都是按照目的地址、源地址的顺序,第三个地址分别为最终目的地址和最开始源地址
1.2 冲突协议

首先必须申明一下几点:

  1. A、B双方的冲突并不是信号相遇的时候就检测到,必须是信号相遇之后返回到A、B处才能检测到
  2. 所有的冲突协议只适用于半双工,全双工不需要冲突检测,因为根本就不存在冲突

所以,冲突并不是物理学上的相遇问题,而是 "相遇-返回 问题’'

ALOHA协议(冷门)

这个是最古老的冲突处理协议,并且必须注意一点:除了CSMA/CA以外,所有冲突检测协议都是针对局域网而言的,因为以太网是总线型局域网

ALOHA协议就是不检测冲突,如果冲突发生了,那么等待一段随机时间之后再发送

时隙ALOHA协议(冷门)

只是在ALOHA协议基础之上进行了时隙划分,将时间划分为一个个等长时隙段,规定每段只能发送一个帧。

这种做法类似流水线,把大的时间段划分为小的时隙,但是本质上仍然不检测冲突,在所有基本协议中,发生冲突的反应基本都是等待随机时间之后重发

三种CSMA协议

只要是 “坚持”,那么就算信道处于忙状态,也会持续监听

如果是“非坚持”,那么视信道忙为冲突,等待随机时间

1-坚持非坚持p-坚持
空闲立刻发送立刻发送以概率p发送,1-p推迟
持续监听视信道忙为冲突,放弃监听,等待随机时间之后重新监听持续监听
CSMA/CD(这位更是重量级)
特点:载波监听、碰撞检测、 不使用确认机制

CSMA/CD可以检测冲突,无法避免,仍然保持随机等待重发的习惯。

其实CSMA/CD并没有我们想象中的那么复杂,他的处理其实就是如下过程: 在开始发送数据之后就进行碰撞检测,如果遇到冲突本质上还是等待随机时间之后重传,只不过是使用了二进制指数退避算法来计算这个随机时间罢了

至于最短帧长,也很好理解。因为信号碰撞之后必须回到原处才能被检测到,所以最长的碰撞时间就是2T传播时延,因此 最短帧长=2T传播时延 带宽

当然,最重要的一点就是,CSMA/CD不使用确认机制,不能保证可靠传输和差错检测,它本身的功能只是处理冲突,没别的功能

二进制指数退避算法

这个算法并不像拥塞窗口那样,随机等待时间也并不是指数型增长的,指数型增长的只是随机时间的选择区间。每多一次重传,就将区间指数型增长,随机等待时间也只是随机从区间里取一个数而已

  • 当重传次数大于10时,区间就不再增长了。也就是说,区间最大也就到 [0,1024] 了, 随机等待时间也就是从这个区间随机取个数,主打一个随机
  • 如果重传次数==16次,那么就 丢弃该帧,并且报错16还真是个特别的数字,RIP也是16不可达
CSMA/CA(无线局域网的神)

无线网和以太网非常不一样,它的误码率非常之高,而且由于各个WIFI网之间有类似集合的相交关系,冲突检测很难实现且成本太高。

所以,在无线局域网中,必须使用 停止-等待确认 机制,保证无线网内的帧可以可靠传输。要不然传一个帧错一个帧,还传个屁啊!

image-20231103013339744

CSMA/CA的步骤:
  • 如果要发送数据,且信道空闲,那么需要等待DIFS之后在发送;(为什么要等DIFS? 因为考虑到可能有高优先级的帧要发送
  • 如果说信道忙,也即信道上有数据正在发送,那么要发送数据的多个源站各自会在随机等待时间之后发送。由于随机等待时间不一样,谁的等待时间先到期,谁就运气好,可以马上发送,其他人只能冻结等待时间,继续等时机
  • 不过一个无线局域内要发数据的设备可能会非常非常多,要是一直这么等也不是个事儿啊,所以CSMA/CA提出了预约信道的做法。使用RTS和CTS控制帧预约信道,这个很像三段握手,不过不一样。源站A利用RTS向目的站B发送请求,告诉B想走个后门,让A先发,然后B站广播CTS帧给无线网的所有其他站,告诉其他站 A发数据的这段时间别发了
1.3 选择重传协议
img

本题选择B, 注意: ==选择重传协议中,发送窗口不一定必须<=2n-1,发送窗口是一般都是>=接收窗口的==(如果接收窗口更小则多余空间也没有意义),2n-1只是通常规定下为达到性能最优解的一个限制

因此,我们只关注一个原则 ,发送窗口 + 接收窗口 <= 2^n

所以此题接收窗口为5,那么发送窗口最大为11,现在已经收到1,3,5号确认帧,第6号确认帧虽然还没收到,但是也没收到超时帧,所以默认第6号的确认帧还在发送过来的路上(注意我们只以超时帧作为重传标志,没收到确认帧就默认还在发送过来的路上)

所以发送方最多能发送的数据帧数量为: 超时重传的3个帧+还没发送的7,8,9,10号帧= 7个帧,选择B

1.4 信道利用率

本质:在 t数据+t确认+t传播整段时间内最多能够传递多少个帧

捎带确认:意思就是确认帧和数据帧长度一致

2.应用层

2.1 DHCP 动态分配IP地址协议

起因:局域网中如果主机频繁更换,那么手动地为主机分配IP地址就会很繁琐,可以考虑使用DHCP服务器动态的为主机分配一个临时的IP地址

过程图示:

image-20231028013425639

注意:
  • 在租用IP地址的时候,DHCP服务器和客户全程使用广播帧,DHCP服务器全程使用 自己的IP地址 交流,客户的源地址全称为0.0.0.0
  • 因为使用的是广播帧,所以客户会同时向多个DHCP服务器发送请求,客户可以从多个DHCP服务器中选择一个请求IP地址,当然,DHCP服务器和客户双方都会使用 ARP协议 检验租用的IP地址是否已经被其他主机占用
  • IP地址续约的时候客户就不使用 0.0.0.0了,而是正式改用租用的IP地址
易错点:

image-20231028014321700

DHCP的作用范围只是局域网,不是整个网络!!因为不能跨路由器操作!!

DHCP全程使用广播帧,但是路由器默认会丢弃广播帧,因为路由器的作用就是隔离广播域。 如果想让路由器转发DHCP广播帧,那么必须在路由器中配置DHCP路由器的IP地址,使路由器成为DHCP的中继代理!!

3.网络层

3.1 IPV6
IPv6的特点
  • 更大的地址空间,长度变成128bit
  • 灵活的首部格式
  • 首部固定为40B,IPv4首部有一个可选字段,用来提供错误检测与安全机制
  • 必须8字节对齐
  • 取消了总长度字段,改用有效载荷长度
  • 取消了校验和
IPv6功能
  1. 目的地址可以是单播、多播、任播。任播是IPv6增加的一种类型。任播的终点是一组计算机,但数据报只交付其中的一个,通常是按照路由算法得出的距离最近的一个。

  2. IPv4向IPv6过渡只能采用逐步演进的办法,同时还必须使新安装的IPv6系统能够向后兼容。IPV6系统必须能够接收和转发IPv4分组,并且能够为IPV4分组选择路由

    • 双协议栈(可能会损失IPV6分组的标识)

      双协议栈技术是指在一台设备上同时装有IPv4和IPv6协议栈,那么这台设备既能和IPv4网络通信,又能和IPV6网络通信。

      如果这台设备是一个路由器,那么在路由器的不同接口上分别配置了PV4地址和IPV6地址,并很可能分别连接了IPv4网络和IPv6网络:如果这台设备是一台计算机,那么它将同时拥有IPV4地址和IPV6地址,并具备同时处理这两个协议地址的功能。

    • 隧道技术

      隧道技术是将整个IPv6数据报封装到IPv4数据报的数据部分,使得IPv6数据报可以在IPv4网络的隧道中传输。

3.2 IP组播

为了能够支持像视频点播和视频会议这样的多媒体应用,网络必须实施某种有效的组播机制。

使用多个单播传送来仿真组播总是可能的,但这会引起主机上大量的处理开销和网络上太多的交通量。

人们所需要的组播机制是让源计算机一次发送的单个分组可以抵达用一个组地址标识的若干目标主机,并被它们正确接收。

  • 组播只能运用于UDP,因为他要送往多个接收者
  • 让源主机把单个分组发送给一个组播地址,该组播地址标识一组地址。网络(如因特网)把这个分组的副本投递给该组中的每台主机。主机可以选择加入或离开一个组,因此一台主机可以同时属于多个组。
  • 需要使用IGMP协议
  • 组播地址是D类地址,1110开头,因此D类地址范围是224.0.0.0~239.255.255.255。每个D类IP地址标志着一个组播组
  • 组播地址只能用于目的地址,而不能用于源地址
  • 组播数据报不产生ICMP差错报文,因此,若在PNG命令后面键入组播地址,将永远不会收到响应
  • 并非所有的D类地址都可作为组播地址

image-20231117173412323

D类IP地址与以太网地址(24位取0,低23为映射)

LANA拥有的以太网组播地址的范围是从01-00-5E-00-00-00到01-00-5E-7F-FF-FF。不难看出,在每个地址中,只有23位可用作组播。这只能和D类IP地址中的23位有一一对应关系。D类IP地址可供分配的有28位,可见在这28位中,前5位不能用来构成以太网的硬件地址

image-20231117174037370

1、例如,IP组播地址224.128.64.32(即E0-80-40-20)和另一个IP组播地址224.0.64.32(即E0-00-40-20)转换成以太网的硬件组播地址都是01-00-5E-00-40-20

2、由于组播IP地址与以太网硬件地址的映射关系不是唯一的,因此收到组播数据报的主机,还要在IP层利用软件进行过滤,把不是本主机要接收的数据报丢弃。

IGMP与组播算法

image-20231117174434942

IGMP让连接到本地局域网上的组播路由器知道水局成网上是否右主机参m或退出了某个组播组。IGMP应视为网际协议IP的一个组成部分

IGMP其工作的两个阶段
第一阶段
  1. 当某台主机加入新的组播组时,该主机应向组播组的组播地址发送一个IGMP报文,声明自己要成为该组的成员。
  2. 本地的组播路由器收到IGMP报文后,将组成员关系转发给因特网上的其他组播路由器。
第二阶段

因为组成员关系是动态的,本地组播路由器要周期性地探询本地局域网上的主机,
以便知道这些主机是否仍继续是组的成员。

只要对某个组有一台主机响应,那么组播路由器就认为这个组是活跃的。但一个组在经过几次的探询后仍然没有一台主机响应时,则不再将该组的成员关系转发给其他的组播路由器。

组播路由选择实际上就是要找出以源主机为根结点的组播转发树,其中每个分组在每条链路上只传送一次(即在组播转发树上的路由器不会收到重复的组播数据报)。不同的多播组对应于不同的多播转发树,同一个多播组,对不同的源点也会有不同的多播转发树

在许多由路由器互联的支持硬件多点传送的网络上实现因特网组播时,主要有三种路由算法:第一种是基于链路状态的路由选择;第二种是基于距离-向量的路由选择;第三种可以建立在任何路由器协议之上,因此称为协议无关的组播(PIM)。

3.3 移动IP

移动IP技术是指移动结点以固定的网络IP地址实现跨越不同网段的漫游功能,并保证基于网络IP的网络权限在漫游过程中不发生任何改变。

使用移动IP,一个移动结点可以在不改变其IP地址的情况下改变其驻留位置。

1. 移动结点、本地代理、外部代理

移动结点: 具有永久IP地址的移动结点。

  • 本地代理: 在一个网络环境中,一个移动结点的永久“居所”被称为归属网络,在归属网络中代表移动结点执行移动管理功能的实体称为归属代理(本地代理),它根据移动用户的转交地址,采用隧道技术转交移动结点的数据包。
  • 外部代理。在外部网络中帮助移动结点完成移动管理功能的实体称为外部代理。
2. 移动IP与动态IP是两个完全不同的概念

动态IP指的是局域网中的计算机可以通过网络中的DHCP服务器动态地获得一个IP地址,而不需要用户在计算机的网络设置中指定IP地址

动态IP和DHCP经常会应用在我们的实际工作环境中。

3、移动IP通信过程

image-20231117175808312

image-20231117175816569

  1. 移动结点漫游到一个外地网络时,仍然使用固定的IP地址进行通信
  2. 为了能够收到通信对端发给它的IP分组,移动结点需要向本地代理注册当前的位置地址,这个位置地址就
    是转交地址(它可以是外部代理的地址或动态配置的一个地址)。
  3. 本地代理接收来自转交地址的注册后,会构建一条通向转交地址的隧道,将截获的发给移动结点的IP分组通过隧道送到转交地址处。
  4. 在转交地址处解除隧道封装,恢复原始的IP分组,最后送到移动结点,外网就能够收到这些发送给它的P分组。
  5. 移动结点回到本地网时,移动结点向本地代理注销转交地址,这时移动结点又将使用传统的TCP/IP方式进行通信
3.4 SDN

image-20231117155446711

可以将网络层抽象地划分为数据层面(也称转发层面)和控制层面IP分组转发是数据层面实现的功能,而路由选择是控制层面实现的功能。

SDN控制层面对数据层面上的路由器进行集中式控制,方便软件来控制网络。

SDN的特点

在传统互联网中,每个路由器既有转发表又有路由选择软件,也就是说,既有数据层面又有控制层面。但是在SDN结构中,路由器都变得简单了,它的路由选择软件都不需要了,因此路由器之间不再相互交换路由信息

在网络的控制层面有一个逻辑上的远程控制器(可以由多个服务器组成)。远程控制器掌握各主机和整个网络的状态,为每个分组计算出最佳路由,通过Openflow协议(也可以通过其他途径)将转发表(在SDN中称为流表)下发给路由器。路由器的工作很单纯,即收到分组、查找转发表、转发分组。

  • SDN提供的编程接口称为北向接口,北向接口提供了一系列丰富的API
  • SDN控制器和转发设备建立双向会话的接口称为南向接口,通过不同的南向接口协议(如Openf1low),SDN控制器就可兼容不同的硬件设备
  • SDN控制器集群内部控制器之间的通信接口称为东西向接口,用于增强整个控制层面的可靠性和可拓展性。
SDN的优点

①全局集中式控制和分布式高速转发,既利于控制层面的全局优化,又利于高性能的网络转发。②灵活可编程与性能的平衡,控制和转发功能分离后,使得网络可以由专有的自动化工具以编程方式配置。③降低成本,控制和数据层面分离后,尤其是在使用开放的接口协议后,就实现了网络设备的制造与功能软件的开发相分离,从而有效降低了成本。

SDN的问题

①安全风险,集中管理容易受攻击,如果崩溃,整个网络会受到影响。②瓶颈问题,原本分布式的控制层面集中化后,随着网络规模扩大,控制器可能成为网络性能的瓶颈。

3.5 ICMP差错报文

ICMP是网络层中用来及时报错的协议,针对路由中存在的错误能够及时发现并报错。

  • 终点不可达报文 : 路由器 / 主机 不能交付数据报时 , 就会向源点 发送 终点不可达报文 ;

  • 源点抑制报文 : 路由器 / 主机 拥塞 , 丢弃 IP 数据报 , 向源点发送源点抑制报文 , 让源点降低发送速率 ;

  • 时间超过报文

    • 路由器生存周期 TTL = 0 时 , 丢弃该报文 , 同时向源点发送 时间超过报文 ;
    • 终点 在预定时间内 没有收到 数据报的全部数据分组时 ,说明可能发生了分组丢失, 就会将已收到的数据分组全部丢弃 , 向源点发送时间超过报文 ;
  • 参数问题报文 : 路由器 / 主机 收到的 IP分组首部字段有错误值 , 丢弃该数据报 , 向源点发送 参数问题报文 ;

  • 改变路由报文 : 路由器 将 改变路由报文 发送给主机 , 让主机下次将数据报发送给另外的路由器 ; 又称为 “重定向报文” ;

  • ICMP 回送请求 和 回答报文 PING命令专属,而且PING命令属于应用层

  • ICMP 时间超过差错报告报文Tracert命令专属,工作在应用层

四、计算机组成原理部分

1.硬件多线程、多核处理器、多处理器技术

1.1 硬件多线程

硬件多线程技术出现的目的是为了提升系统性能,减小线程切换造成的开销。同时经过多年的发展,硬件多线程分为以下几种:

  1. 细颗粒多线程(交替运行,CPU一个CLK本质上还是只能执行一个线程):当同时有多个线程要执行时,CPU交替执行不同线程,本质上一个CLK还是只能执行一个线程,不能实现并行操作;
  2. 粗颗粒多线程(性能最差):这是最笨的方法,CPU一次只执行一个线程,当且仅当线程发生阻塞(Cache缺失或者请求I/O)的时候才切换线程;
  3. 同时多线程(超线程!):比较重量级,这个单独说一下。
超线程

超线程技术为CPU中存在的每个物理核心创建两个虚拟处理核心。物理核心为虚拟核心提供动力,然后虚拟核心承担任务处理的责任。每个虚拟内核都彼此相同,尽管两者都不像物理内核那么强大,但是当不启用HT时,它们合起来远远超过了物理内核的能力。这些虚拟内核的使用使CPU可以实时在内核之间委派任务。

优点

这是一种非常高明的技术,就是在一个CPU的一个内核中添加多套线程的执行单元(包括通用寄存器组、PC等),可以将一个物理内核虚拟化为多个虚拟内核。超线程实现的是线程级并行,CPU在一个CLK内可以同时发射并执行不同线程的指令,而且所有线程共享Cache和功能部件(如ALU)。

由CPU密集型操作(例如同时运行两个苛刻的程序)创建的工作负载(该操作会降低单个物理核心的运行速度,而不论其原始功率如何)都会在处理器的虚拟核心之间分配利用HT技术。使用两个虚拟内核同时处理任务,处理时间更短,程序打开速度更快,并且在多任务处理期间您的计算机将保持更高的响应速度。简而言之,超线程可提高处理效率。

image-20231115005138941
超线程能否满足1+1=2?虚拟内核的性能为何比不上物理内核?

超线程是一种 “1+1<2”的技术,因为==Cache和功能部件(比如ALU)==是所有线程共享的,那么就肯定涉及到的有同步和互斥问题,还有Cache的访问一致性问题,解决这些问题肯定是需要额外的时间开销的,所以2个虚拟内核终究发挥不出真正的两个内核的效果。

1.2 多核处理器

就是在一个CPU中设置多个内核,使得CPU具有真正意义上的并行能力。这里注意一下,超线程是在一个内核中设置多个执行单元,而多核处理器则是在一个CPU中设置多个内核,多处理器则是在一台电脑中设置多个CPU。

多核处理器本质上还是一个CPU里面安上多个小内核,内核可以拥有自己的专属Cache,也可以共享同一个Cache。

image-20231115005450933
多核处理器和超线程的区别:
image-20231115005621589
1.3 共享内存多处理器(SMP)

具有共享物理地址空间的多处理器被称为共享内存多处理器(SMP)。由于是真正意义上的多个处理器,每个处理器又可以是多核处理器,每个内核又可以超线程,所以性能可以大大提高。多个CPU之间可以相互通信,但是只能通过存储器的共享变量进行间接通信。

当然,根据不同CPU访存速度是否相同,可以分为:

  • 统一存储访问多处理器(UMA):

    所有CPU访问存储器的速度都一致。

  • 非统一存储访问多处理器(NUMA):

    不同CPU访问存储器的速度不完全一致,自由度更高,运算扩展性更强。

    1. 处理器携带高速Cache,称为CC-NUMA;
    2. 处理器不携带高速Cache,称为NC-NUMA;
UMA和NUMA的区别

二者最根本的区别是不同处理器访存的速度是否一致。不过NUMA的运算扩展性要远强于UMA,因为UMA需要多个处理器都保持一致的访存速度,那假设我们此时有一个快速CPU,一个慢速CPU,那么使用NUMA结构两个CPU可以并用,增强性能;而使用UMA结构二者访问速度不一致,性能反而会减小

UMA和NUMA共同面对的重要问题

答案就是一致性问题。无论是UMA,还是NUMA,都需要解决Cache一致性问题和主存一致性问题。因为不同CPU使用存储器的共享变量相互通信,而访问存储器必不可免要使用Cache。假设CPU1将共享变量x赋值为3,而CPU2将共享变量x赋值为4,那么这时候该采取哪一个呢?这就是一致性问题。

image-20231115010118524

2.绪论小知识

2.1 编译程序和解释程序,编译过程和汇编过程
注意:汇编≠汇编程序!!编译≠编译程序!!
image-20231111010739956

本题最大的疑惑点就在于这个编译程序。这里必须说一下,编译和编译程序压根就不是一个概念

编译、汇编、链接是高级语言程序准备执行过程的三个步骤,编译是将高级语言->汇编语言,汇编负责汇编语言->机器语言,链接程序负责将逻辑地址和物理地址进行链接。

而编译程序、解释程序就是另一个概念了。编译程序就是C、C++、Java这种,直接将高级语言一次性全部转换为机器语言代码文件,然后再执行;解释程序就是JavaScript、Python这种,边翻译边执行,不会生成机器语言代码文件,翻译一句就执行一句,本身执行速度较慢。

image-20231109021901164

首先需要明确一点,计算机硬件能执行的永远都只有机器语言,就算是汇编语言,也必须转为机器语言之后才能被执行。

3.指令系统

  • 基址寻址和变址寻址确实是能够增加指令的寻址范围
  • 直接编码无需进行译码,微命令字段的每一位都代表一个微命令,使用"0"和"1"表示是否使用该微命令
  • 垂直型微指令的缺点是微程序长、执行速度慢、工作效率低;
  • DRAM的集成度更高,而且功耗更低

4.磁盘

4.1 RAID磁盘阵列

RAID磁盘阵列是指将相同的数据存储在多个硬盘的不同地方。很显然,这种做法会导致数据冗余存放,但是在不同硬盘上放上相同的数据,输入输出操作能以平衡的方式交叠,提升磁盘输入输出的性能,而且多个硬盘增加了平均故障间隔时间,提升了存储器的可靠性。

5.补码、浮点数、IEEE754编码

5.1 什么是机器零?
  • 当浮点数尾数为0时,不论其阶码为何值,按机器零处理

  • 当浮点数阶码等于或小于它所表示的最小数时,不论尾数为何值,按机器零处理

    如 m = 4 n = 10

    • 当阶码和尾数都用补码表示时,机器零为:

      X, X X X X; 0 . 0 00
      (阶码=-161, 0 0 0 0; X . X XX
      
    • 当阶码用移码,尾数用补码表示时,机器零为:

      0, 0 0 0 0; 0 . 0 00
      

由上可以看出,机器零必定不是规格化浮点数,因为规格化浮点数(IEEE754用的也是规格化)的基础 X应满足范围(基数为R) 1/R <= |X| <= 1,而机器零只是一种浮点数取0的做法。

机器零与真值零的区别

机器零在数轴上表示为0点及其附近的一段区域,即在计算机中小到机器数的精度达不到的数均视为“机器零”,而真值零则表示0这一个点。

所以机器零并不特指某一个数字,它的含义是无限接近0的那个"0"。 机器零只能用于浮点数,而且还不能是规格化的浮点数,他就是一种方法,强行认定尾数为0了整个数就是0。而定点数表示的0就是实实在在的那个0,特指0那一点

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值