学前说两句

这个章节内容还是比较多的,学习的内容都是很基础的计算机知识,如果你是计算机专业的,这些东西你都了解过的,学习起来应该不难。

根据我的理解,最核心的内容应该是:前驱图、死锁与银行家算法、存储管理、磁盘管理、索引文件、位视图。

不过这个章节在软件架构师的内容中不算太核心,大家学习的时候不要投入太多的时间。

核心知识

计算机系统

从硬件层面上学习就是计算机组成

从软件层面上学习就是操作系统

计算机组成

冯诺依曼体系结构

层次化存储

局部性原理

寄存器里面存储的比特位,32的机器,存储的就是32位的

这里要了解一下局部性原理,局部性原理是层次化存储的支撑

总线

  1. 单工:数据只能单向传输,如广播、电视信号,发送方和接收方角色固定,无法反向通信。

  2. 半双工:数据可双向传输,但同一时间仅支持一个方向,如对讲机,需切换发送/接收状态。

  3. 全双工:数据可同时双向传输,如电话通话,双方能同时说话和聆听,无需切换模式。

1. 数据总线(Data Bus)

  • 功能:负责在CPU、内存、外设之间传输实际数据(如数字、文字、指令等)。
  • 例子
    当你用键盘输入字母“A”时,键盘通过数据总线将“A”的二进制编码(如01000001)发送给CPU;CPU处理后,又通过数据总线将结果(如显示指令)传给显示器。

2. 地址总线(Address Bus)

  • 功能:指定数据要发送到哪个位置(如内存的某个地址、硬盘的某个扇区),相当于“门牌号”。
  • 例子
    CPU想读取内存中第1000号地址的数据时,会通过地址总线发送地址1000,内存收到后,从该地址取出数据,再通过数据总线传回CPU。

3. 控制总线(Control Bus)

  • 功能:传递控制信号(如读写指令、中断请求),协调各部件的动作,相当于“交通警察”。
  • 例子
    CPU通过控制总线向内存发送“读”信号,内存收到后,知道要将数据通过数据总线传给CPU;如果是“写”信号,内存则准备接收数据。

通俗比喻

  • 数据总线:像货车,负责运送货物(数据)。
  • 地址总线:像导航,告诉货车去哪里(目标地址)。
  • 控制总线:像红绿灯,指挥货车何时出发、何时停止(控制操作)。

三者协同工作,才能让计算机各部件高效协作!

并行总线适合短距离的,串行总线适合长距离的

串行总线的传输速度(波特率)可以调整。

无论是串行还是并行,要想验证是否通过,需要通过验证码来实现,数据传输方式可以有多种,比如中断,DMA等等

一般不说总线都是半双工的。软件查询?可以通过多种方式来查询

数据传输方式

 程序控制(查询)方式

  • 解释:这就好比你去快递站取快递,你(相当于CPU)得不停地问快递站工作人员(相当于外设),有没有自己的快递。这种方式分为两种情况,一种是一直问,不管有没有快递(无条件传送);另一种是先问问有没有,有的话再取(程序查询方式)。它的优点是方法简单,就像这种简单的询问流程很容易理解和操作,硬件开销也小;缺点是I/O能力不高,因为CPU要一直去查询,就像你一直问快递,就没办法去做其他事情,严重影响了CPU的利用率。
  • 例子:计算机的键盘输入,早期可能采用这种方式,CPU不断查询键盘是否有按键按下,若有则读取按键信息。

2. 程序中断方式

  • 解释:还是以取快递为例,你不用一直在快递站守着问,而是留下自己的联系方式,等快递到了,快递站工作人员会主动通知你。这种方式下,CPU不用等待外设准备好数据,可以先去执行其他任务,当外设准备好数据后,会向CPU发送一个中断信号,就像工作人员给你打电话通知你取快递,CPU再转去处理数据传输。这种方式提高了传输请求的响应速度,而且CPU与I/O传输可以并行进行,也就是取快递和做其他事情互不耽误。
  • 例子:在计算机打印文件时,CPU将打印任务发送给打印机后,就可以去处理其他任务,当打印机准备好接收数据时,会向CPU发出中断信号,CPU再响应并传输数据给打印机。鼠标和键盘就是程序中断方式

3. DMA方式

  • 解释:假如你要把一大批货物从仓库(主存)运到另一个地方,如果还是靠你(CPU)一件一件搬运或者指挥搬运,效率很低。DMA方式就相当于请了一个专业的搬运团队(DMA控制器),他们可以直接在仓库(主存)和目的地(外设)之间快速、批量地搬运货物,不需要你(CPU)一件一件去操作,只需要在搬运开始和结束时通知你一下。这种方式是为了在主存与外设之间实现高速、批量数据交换而设置的,比前两种方式都高效,同样CPU与I/O传输可并行。
  • 例子:计算机从硬盘读取大量数据到内存,比如加载一个大型游戏,DMA控制器可以直接控制数据在硬盘和内存之间快速传输,而不需要CPU逐个数据地去处理传输过程,大大提高了数据传输效率。

不需要CPU的参与,外设可以直接和内存(主存)交换数据。也就是说,DMA让外设(比如硬盘、网卡)和内存之间建立了一条“直达的高速公路”,绕过了CPU。

处理器体系结构

  • 存储方式:冯·诺依曼结构指令和数据存一块;哈佛结构指令和数据分开存。
  • 总线情况:冯·诺依曼结构共用一组总线传输指令和数据;哈佛结构指令、数据各有独立总线,还有地址总线。
  • 读取特点:冯·诺依曼结构同一时间只能取指令或读数据;哈佛结构能同时并行读取指令和数据,数据吞吐率高。
  • 典型应用:冯·诺依曼结构多用于PC处理器;哈佛结构常用于嵌入式系统处理器。

指令集

复杂:可变长 用的多的就短一些,用的少的就长一些

简单:指令都放在寄存器里面

操作系统

操作系统的概述

操作系统主要有:进程管理、存储管理、文件管理、作业管理、设备管理这几个主要功能

操作系统的分类

进程管理

进程管理就是CPU如何调度进程进行的管理

什么是进程

就把计算机正在执行的任务想象成一场热闹的舞台剧,每个上台表演的角色就相当于一个进程。而PCB呢,就是这个角色的专属小档案。


这个档案里记录了关于这个角色(进程)的各种各样重要信息。比如,角色的身份编号(进程标识符),让计算机能清楚区分不同的进程;角色现在处于表演的哪个状态,是在台上激情表演(运行状态)、在后台候场(就绪状态),还是因为一些原因暂时不能上台(阻塞状态),这些状态信息都在档案里;还有角色在舞台上的位置信息,方便下次继续表演时能准确找到地方;另外,档案里还有控制角色表演方式的控制信息,以及和其他相关角色(进程)的关联信息等等。

计算机靠这个PCB小档案来管理和调度每一个进程,就像导演靠演员的档案来安排舞台剧的表演一样,这样才能让各个进程有条不紊地运行。

第一问中,我们只需要看PCB也就是最后一列,我们可以看到他们之间并没有任何连接,所以不是顺序也不是连接

索引方式是为每种进程状态设置一个索引表,索引表的表项指向处于该状态的进程的PCB。在图中,运行进程索引表、就绪进程索引表、阻塞进程索引表分别对应运行、就绪、阻塞三种状态的进程,并且通过运行指针、就绪表指针、阻塞表指针来指向相应的索引表,每个索引表中的表项又指向具体进程的PCB,完全符合索引方式的特点。

线程

进程的状态

要注意状态之间是否可流转

进程调度算法

高响应有限综合了先来先服务和最短作业有限两种

进程的同步与互斥

  • 互斥:像千军万马过独木桥,同一时刻只一个进程能用临界资源,是直接制约。
  • 同步:进程速度不同,需等待,如张三步行慢,李四骑车快但要在起点A等张三一起出发(或在途中某点等),是间接制约。

同步不同类的进程

互斥相同类的进程

PV操作与信号量

这张图很复杂,首先用通俗的语言来解释一下,这里面有三个核心的内容:

一个是信号量,这个信号量表示任务中资源的数量,注意是任务中,所以第一步要区分任务是什么,只有确定了任务,才能知道信号量为多少。

第二个核心内容是PV操作,P表示进行加锁,进程在加锁的时候,会触发信号量-1,表示锁定资源。此时如果发现资源不小于0,那么就表示资源够用,此时就可以顺利执行,如果发现资源小于0,就表示资源不够用,那么进程就不会执行了,此时就会进入到阻塞队列中,所以这就是为什么,信号量为负时表示排队的进程数。

第三个核心内容是PV操作,V表示解锁,进行在解锁的时候,会触发信号量+1,表示进程使用完成资源了,释放资源,如果此时发现信号量小于等于0,这里要说一下等于0,等于0,说明之前是-1,-1表示有排队,所以说明有进行在刚刚找资源的时候,没有找到,所以此时就需要将阻塞进程唤醒一个。

首先第一点,我们必须要确定任务是什么,任务是3个进程抢夺两个打印机,所以打印机就是资源,所以s的初始值就是2。设想一种极端情况,只有p,没有v。第一个进程执行p操作,此时s=1,第二个进程执行p操作,此时s=0,第三个进程执行p操作,此时s=-1,所以取值范围为[-1,2]

首先,先分析任务是什么,任务是用户订票,那么这个时候用户可以理解为进程,那么票就是信号量,所以票有Tj,所以信号量初始值应该为Tj,但是选项里面没有。那么这个时候应该选择什么呢?

其实仔细想一下,这个的本质确实是订票,虽然进程们强的是Tj,但是如果多个进程同时操作Tj​,就会出现数据不一致的问题,比如两个进程同时读取到相同的剩余票数,然后都进行售票操作并修改Tj​,导致实际售出的机票数超过真实剩余量。所以,这里的关键是要保证同一时间只有一个进程能够访问和修改Tj​,这就需要一个互斥信号量来控制,互斥信号量初始值应该为1

系统有n个售票点管理机票销售,用n个进程Pi模拟,Tj单元存机票剩余票数。信号量S用于实现对Tj单元的互斥访问,因为多个进程可能同时操作Tj,为保证数据正确性需互斥,所以S初始值应为1,确保同一时间只有一个进程访问Tj

空(a)、空(b)、空(c)处操作分析

  • 空(a)处:在进程Pi按用户要求找到单元Tj后,准备操作Tj前,要保证对Tj的互斥访问,所以应执行P(S)操作,申请资源使用权。
  • 空(b)处:当Temp < x,即余票不足时,进程应释放对信号量S的控制,让其他进程能访问Tj,所以此处是V(S)操作。
  • 空(c)处:在完成售票操作(Temp = Temp - xTj = Temp)后,进程要释放信号量S,使其他等待进程有机会获取资源,因此也是V(S)操作。

综上,信号量S初始值为1,空(a)、空(b)、空(c)处应分别填入P(S)V(S)V(S),答案选A。

前驱图

前驱图表示进程和进程之间的关系,A->D表示A做完之后D才可以,要想保证这个逻辑,就必须使用信号量,在进程D开始之前,要加锁来检查,也就是p,没有锁定到资源就等待。在进程A结束之后,要释放锁,也就是V,释放锁后要检查有没有进程在等待,等待要执行等待进程。

前驱图和信号量的结合关键在于->p检查前驱,v通知后驱,A->D,A就是前驱,D就是后驱,前驱完成需要V操作,后驱开始需要P操作,这是核心

表示方式:

如上所示,前驱图和信号量的表示方式有两种,如上所示。我们可以完成的看到了原则,就是前驱结束会V,后驱开始会P。

图中有四个箭头,所以就会有四个信号量

死锁和银行家算法

死锁产生的条件

互斥:争夺相同的资源

保持和等待:已经有的资源不放手,继续等待需要的资源

不剥夺:已经被占用的资源,不能被抢夺

环路等待:我需要的资源,在别人那,我有的资源,别人需要

四大条件是死锁的必要条件,必须同时发生才能产生死锁。要想死锁不出现,有两种方式,一种方式是破坏四大条件,其中互斥是无法破坏的,不然会产生安全性问题。

另外一种方法就是银行家算法,它的核心思想是通过一定规则的资源分配,保证在有限的资源情况下,让进程能够正常完成

死锁所需资源数

假设资源为N,进程为M,每个进程需要a个资源才可以运行,那么N为多少的时候一定会出现死锁,N为多少的时候通过一定的方式分配可以保证死锁不出现,N为多少的时候一定不会出现死锁?

如上所示,当资源为13个的时候是一定不会出现死锁的,这样就肯定会有一个进程拥有五个资源,此时一定不会死锁

银行家算法

银行家算法的原则就是通过一定规则的资源分配,保证在有限的资源情况下,保证所有进程都能逐步获取到所需要的资源,最终保证程序的稳定执行。

示例:

银行家算法非常简单,就是看现有资源有限分配给谁的问题,如果先分配给了一个进程,那么进程就会释放它已经占有的资源,不断的分配资源给进程,最终完成所有进程执行完毕的任务。

存储管理

页式存储

页式存储的核心就是将内存一个大空间,按照4kb(默认)为一个单位来划分成多个独立的小块,这个小块就会称为页。

对于用户程序而言,程序操作是逻辑地址,比如第几页,但是实际数据存储再内存中,是物理地址,这两者之间的映射关系是通过页表来维护的,操作系统负责页表。

页表有两列,第一列是逻辑地址的页号,第二页为物理地址的块号。

整个使用逻辑是这样的,当用户程序操作第N页的时候,就可以通过页面找到第N页对应的物理块号,然后通过物理块号来找到对应的内存地址。

当找到块之后,还没有完,因为一个块为4kb,那么可能我们只需要一个块中的一小部分数据,那么此时还要有一个偏移量的概念,也就是页内地址。无论是物理地址还是逻辑地址,他们两个对应的其实都是同一个物理块,那么对于二者而言,两个的偏移量也就是页内地址其实是描述的同一个位置的数据。

逻辑地址=页号+页内地址

物理地址=页帧号+页内地址

页号和页帧号通过页表对应,页内地址肯定是一样的。这个是核心

一个页有4kb,页内地址唯一标识一页(4KB)内的某个字节位置,范围是04095(共4096个地址)。要想表示4096个地址,需要12位0、1来表示。例如,地址000000000010(二进制)指向页内第2个字节。每个字节的数据使用8位二进制进行数据表示,不要小看8位二进制,asc码才有多少位啊。

  1. 不要混淆“地址”与“数据”
    • 地址是位置标识(如门牌号),数据是位置存储的内容(如房间里的物品)。
    • 页内地址用12位二进制表示位置,每个位置存储的数据是1字节(8比特)。

明白这个之后,我们就可以给定一个物理地址算出逻辑地址,或者给出逻辑地址算出物理地址,因为页内地址都是12位,并且一样的,页号和页帧号可以通过页表来映射。

比如逻辑地址:10 1100 1101 1110

此时首先可以看出页内地址位1100 1101 1110

然后页号为10,对应十进制为2,此时可以看到页帧号为6,二进制表示就是110,所以最终可以得到的物理地址为110 1100 1101 1110

在页式存储管理中,抖动(Thrashing)现象是指进程在运行过程中,频繁地发生页面置换(Page Fault),导致大部分时间都用于从磁盘等外存中调入页面和将页面写回外存,而真正用于执行程序指令的时间却很少,就好像系统在不停地“抖动”,无法有效地推进程序的执行。

缺页中断

访问位与时间有关系

修改位与实践没有关系

当程序访问4的时候,发现页表中没有该页,此时就会产生缺页中断,他会把先把页面淘汰出去,然后再加加进来,淘汰的原则就是右下角。

段式存储

一般来说,一个程序的逻辑不只有4kb,会更大,所以页式存储肯定是会把程序的逻辑给分割的,所以引入段式存储,可以保证程序逻辑不被分割来。

页式存储中有一个隐含的概念,就是一页只有4kb,所以页面中只用记录页号和页帧号(页的起始物理位置)的映射就可以了。但是在段式存储中,每个段的大小是不一样的,所以我们不仅要记录每个段的起始位置,还要记录段的长度。

(0,35k),段号为0对应的段长只有30k,那么35k越界了,此时一定是有问题的。

段页式

段页式存储是段式与页式存储管理的结合。其基本思路是先将程序的地址空间按逻辑模块分段(如代码段、数据段、堆栈段等),再将每段细分成固定大小的页。这样,程序的逻辑地址就由段号、段内的页号以及页内的位移三部分组成。

系统中为每个进程建立一段表,段表寄存器用于存放当前运行进程的段表起始地址和段表长度。段表寄存器是CPU中的一组专用寄存器,用于在程序执行过程中快速访问当前进程的段表信息。当一个进程被调度到CPU上运行时,操作系统会将该进程的段表起始地址和段表长度加载到段表寄存器中。这样,CPU在进行地址转换时,可以直接从段表寄存器中获取段表的起始位置和大小,而无需每次都通过操作系统查询。也就是说段表寄存器只存当前用的这段

段表中每个表目对应一个段,包含段表大小、段表始址、状态等信息,还指向该段的页表起始地址和页表大小,这样就可以通过段找到这个段中包含的所有的页。

图中右上角展示的是逻辑地址的结构,在段页式存储管理系统中,逻辑地址通常被划分为段号、页号和页内地址三个部分。图中展示的逻辑地址结构可能只是一个简化的示例,为了说明段页式存储管理中逻辑地址的划分方式,并不一定反映实际的页大小设置。如果按照图中的说明,那么一个页的大小就是256字节了。

磁盘管理


物理结构

磁盘就像是一个光盘一样,有一个磁头不停的转,转的时候磁道没有变更,变的是扇区,这是顺序的。

磁头还可以沿着中心位置移动,此时变的是磁道,这是随机的

电脑上的磁盘是立体的,又多个,同一时刻,磁头在不同盘面的扇区都是一样的。

读取磁盘的数据的时间

你可以理解位磁道和扇区就是磁盘体系下的坐标轴,当磁道和扇区确定了,此时磁盘的数据点就唯一确定了。

有的时候传输时间是可以忽略的。

例题一

一个旋转周期为33ms,一共有11个物理块,说明旋转一个物理块需要3ms,这是隐含条件。

单缓冲区,处理时间为3ms,说明当一个物理块数据往里面写的时候,另外一个物理块必须等待,是没有办法读的。

解决这个问题,很简单,通过一个画图就可以了,首先一个记录处理需要两部分,一部分是读取数据,另外一部分是处理数据,我们可以得到一个这样的图

我们先从R0开始,首先它不需要旋转,可以直接读取数据需要3ms,然后处理数据3ms,此时得到一个这样的图

6ms时候,磁头已经到R2的开始的位置了

此时R1就被过去了,所以需要30ms才可以到R1开始的位置,然后3ms读取R1,3ms处理数据

此时磁头已经到了R3开始的位置,已经错过了R2了

所以由此推断R2也会和R1一样

所以最终的结果为3+3+(30+3+3)*10=6+360=366

第二问,换了位置,设想一下,刚才如果R1和R2换下位置,是不是R0处理完成之后,跳过去的就不是R1了,就是R2了,如果此时是这样的位置呢

此时每一个都不需要轮询一圈了,可以直接读取+处理了,就是(3+3)*11=66ms

关键点:一定要看好这个时间是否会有重叠,不要以为数据处理的时间可以和磁头旋转并行,这里是不可以的。

所以记住一点,如果不能并行,那么这个图中就不能画出现纵向重合的情况

例题二

先看单缓冲区,处理一个磁盘块需要3个步骤:

读入缓冲区

缓存区到用户区

用户区处理

缓冲区是顺序的,所以读取缓冲区和缓冲区到用户区是无法并行的,也就是缓冲区在一个时刻,只能处理一个磁道的数据

首先先看第一块,读取缓冲区15,缓冲区到用户区5,处理1,此时可以得到

注意,标红的就是只能串行的,不能重合的部分 ,因为是独占的

接下来看第二块:

由此可以推测出来,10块需要(15+5)+(15+5)*9+1=201

接下来我们分析双缓冲区的

我们必须要解决一个误区,就是虽然是双缓冲区,但并不意味着可以通过往多个缓冲区中存储数据。在同一时刻由开关控制,也只能往一个缓存区中写入数据,同时缓冲区也在统一时刻也只能有一个缓冲区往用户进程里面写入数据,所以这里依然不能并行

但是输入到缓冲区,和缓冲区到用户进行这里是可以并行了,下面我们看一下

所以最终我们可以得到15*10+5+1=156

所以这种问题,只需要通过这种图就很好的就可以解决,核心就是看有没有办法并行,只要可以并行就大胆的并行就可以了,放心的画。

其实这种可以并行的有一种公式:

这个叫做流水线计算,它的核心公式,就是先看一个基本步骤的耗时,这里无论是并行还是串行都是15+5+1,然后再看tmax,核心就是找出所有的并行工作,然后找到最大的并行时间

移臂调度算法

旋转是没有算法的,但是寻找磁道是有算法的,所以移臂是切换磁道的

扫描算法不会换方向:从头到尾,再从尾到头

从头到尾,然后又直接跳到头,又从头开始

柱面号就是磁道号,相同磁道选扇区从小到大的

文件系统

索引文件结构

文件系统中索引文件结构有四种:直接索引、一级间接索引、二级间接索引、三级间接索引

如果题目没有明确,那么默认直接索引有一个、一级间接索引有一个、二级间接索引有一个,三级间接索引有一个

物理盘块可以存储两类数据,存储不同类型的数据叫法是不一样的。

假设一个物理盘块是1kb,而一个地址项大小是4B,那么此时一个物理盘块最多可以存储256个索引,那么整个文件系统最多可以存储10+256+256*256+256*256*256个物理盘,一个物理盘1kb,那么整个文件系统就是(10+256+256*256+256*256*256)kb

注意,这里说的是,索引节点只有8个地址项,其中0到5为直接索引,6为一级索引,7为二级索引,没有三级索引:

直接索引指向0到5的物理块

物理块大小为1kb,每个地址项大小为4字节,此时一个物理块有256个索引位置

一级索引指向6到6+256-1=261

二级索引指向到262+256*256-1= 65797

由于从0开始,所以逻辑总页数为65798

或者可以6+256+256*256=65798

记录磁盘空间使用情况

位图

通过位示图中标1的表示被占用,标0的表示不被占用

第一问:1000个物理块,这里假设计算机字长位16,那么需要1000/16=62...8 说明要63个字才可以

第二问:64号物理块,64/16=4....1,此时说明应该在第4个字的地方没法放,需要放在第五个字上的,1bit位置上,也就是4,0 设置为1,表示有数据。

  1. 算出物理块总数:磁盘总容量除以每个物理块的大小,就能知道磁盘被划分成了多少个物理块。即300×1024MB÷1MB=30720个物理块。这里把300GB换算成MB,因为1GB = 1024MB,所以要乘以1024。
  2. 算出位示图所需字数:用物理块总数除以一个字能对应的物理块数(也就是计算机字长32)。即30720÷32=9600个字。
  • 字的定义:在计算机领域,字(Word)是CPU一次能处理的数据的位数或者能传送的二进制位数,它是一个重要的基本单位。不同字长的计算机,其字的长度有所不同,比如常见的32位计算机,一个字就是32位。

性能指标

软硬件指标分类

时钟频率:CPU反应的快慢

吞吐率:单位时间内完成的任务量

吞吐量:一定时间内完成的任务量

特殊指标

字长:计算机一次表示的字的长度,通常与计算机的硬件性能相关

数据通路宽度:数据传输过程中,一次性通过的比特位位数

响应时间是系统或服务从接收到请求到开始处理的时间间隔,而完成时间则是从请求开始到处理结束的总耗时,两者核心区别在于前者关注“开始处理”的时效,后者关注“整个流程”的完成时效。

兼容性:主要是指操作系统的兼容性

主频:计算机单位时间(1s)内能够处理的脉冲数。或者理解为计算机的运算速度

CPU时钟周期是一次脉冲完成的时间,所以CPU时钟周期=1/主频

在计算机中,时钟周期是最小的单位时间,机器周期和指令周期会包含多个时钟周期

主频是CPU的频率,在它之外内是外频,它们相差的倍数叫做倍频

C就是总周期:总周期数:CPU 执行一段程序总共花费的时钟周期数量。

I就是总条数:总条数:这段程序包含的指令总数

CPU时钟周期:CPU 的时钟周期是 CPU 的节拍,由主频决定,CPU 时钟周期 = 1 / 主频。它表示 CPU 完成一个基本操作所需要的时间。

P就是/

S就是每条指令完成的总时间,每条指令完成的总时间=平均每条指令的平均周期个数*CPU始终周期= CPI × 时钟周期 = CPI / 主频

S表示总时间

IPS 是每秒执行的指令数,根据定义,IPS = 总条数 / 总时间

IPS=总条数/每条指令完成的总时间 × 总条数=1/每条指令完成的总时间

通过不同的推导方式都得到了 IPS = 主频 / CPI = 主频×IPC 这个公式,它用于衡量 CPU 每秒能够执行的指令数量,是评估 CPU 性能的重要指标之一。

MFLOPS与MIPS是一个东西,只不过是针对浮点数的

基本指令5个周期,每个周期3*10^-6s,那么一个指令总时间为15*10^-6s,此时IPS=1/每条指令完成的总时间,此时可以得到1/15*10^6IPS,转变为MIPS就是1/15MIPS,注意这里M到非M为10的6次方,G到M为10的3次方=0.067

这个选择A,因为200MHz*13=主频,2600MHZ,转变就是2.6GHz

所以G和M之间相差1000倍

性能调整

A,CPU利用率高是可以进行优化的

C、此时应该优化磁盘
D、首先不正比,同时这里也没有表明CPU是性能的主要问题点

阿姆达尔(Amdahl)解决方案

这个公式很复杂,不用看公式,就假设总时间为100,占有运行时间60%,那么就是60时间,提高5倍,时间就是12,所以从时间由100降低到了52,所以提高了1.923倍

这个就是求极限值,当n趋向于无穷的时候,p的值是多少

性能评价方法

时钟频率法,指令执行速度法,等效指令速度法,都是用来评价CPU的

数据处理速率法:衡量CPU和存储

A丢包率主要是网络层面的

性能评估

思维导图

计算机系统基础 - 核心知识思维导图(最终完整版)

├── 0️⃣ 计算机系统的组成 (★★★)
│   ├── 硬件
│   │   ├── CPU
│   │   ├── 内存
│   │   ├── 存储设备
│   │   ├── 输入设备
│   │   └── 输出设备
│   └── 软件
│       ├── 系统软件
│       │   ├── 操作系统
│       │   ├── 编译程序
│       │   ├── 汇编程序
│       │   └── 实用程序
│       └── 应用软件
│           ├── 办公软件
│           ├── 数据库应用
│           ├── 网络应用
│           └── 行业专用软件
│
├── 1️⃣ 处理器体系结构与指令系统 (★★★)
│   ├── 冯·诺依曼结构
│   │   ├── 指令与数据存储器合并
│   │   ├── 指令与数据通过相同数据总线传输
│   │   └── 典型应用:PC处理器(I3、I5、I7)
│   ├── 哈佛结构
│   │   ├── 指令与数据分开存储、独立编址
│   │   ├── 并行读取,数据吞吐率高
│   │   ├── 4条总线:指令/数据地址总线+指令/数据总线
│   │   └── 典型应用:嵌入式系统、DSP
│   ├── CISC(复杂指令集)
│   │   ├── 指令数量多、频率差别大
│   │   ├── 可变长格式、多种寻址方式
│   │   ├── 微程序控制技术
│   │   └── 典型:x86(Intel、AMD)
│   ├── RISC(精简指令集)
│   │   ├── 指令数量少、定长格式
│   │   ├── 单周期指令、操作寄存器
│   │   ├── 硬布线控制、适合流水线
│   │   ├── 典型:ARM、Power
│   │   └── RISC特点不包括:寻址方式丰富、指令功能强
│   ├── 总线
│   │   ├── 基本概念:一组能为多个部件分时共享的信息传送线
│   │   ├── 核心特点
│   │   │   ├── 分时发送:多个部件只能分时向总线发送数据
│   │   │   ├── 同时接收:多个部件可以同时从总线接收数据
│   │   │   ├── 总线复用:减少信号线数量,以较少的信号线传输更多信息
│   │   │   └── 注意:传统总线通常是半双工的,但现代总线可支持全双工
│   │   ├── 按层次分类
│   │   │   ├── 芯片内总线:集成电路芯片内部各部分的连接
│   │   │   ├── 系统总线(内总线):CPU、内存和接口等连接
│   │   │   └── 外总线(通信总线):计算机与外设或计算机间连接
│   │   ├── 按功能分类
│   │   │   ├── 数据总线:传输数据
│   │   │   ├── 地址总线:传输地址
│   │   │   └── 控制总线:传输控制信号
│   │   └── 按数据传输方式分类
│   │       ├── 并行总线
│   │       │   ├── 特点:多根数据线同时传送多位数据
│   │       │   ├── 适用:短距离传输
│   │       │   └── 代表:PCI、ISA
│   │       └── 串行总线
│   │           ├── 特点:一位一位顺序传输,每个位占据固定时间长度
│   │           ├── 适用:长距离传输
│   │           ├── 传输波特率可调整
│   │           ├── 正确性依赖于校验码
│   │           ├── 双工模式
│   │           │   ├── 半双工:同一时刻只能单向传输(发或收)
│   │           │   └── 全双工:可同时发送和接收(一条线发,一条线收)
│   │           ├── 数据传输控制方式
│   │           │   ├── 程序查询方式:CPU主动查询状态寄存器,判断是否可收/发
│   │           │   └── 中断方式:设备准备好后主动向CPU发中断请求,CPU响应后处理
│   │           └── 代表:USB、RS-232、SATA
│   └── I/O控制方式
│       ├── 程序控制(查询)方式
│       ├── 程序中断方式
│       ├── DMA方式
│       │   └── 工作方式:在主存与外设之间直接建立数据通路,数据不经过CPU,由DMA控制器控制传输
│       ├── 通道方式
│       └── I/O处理机
│
├── 2️⃣ 存储系统 (★★★)
│   └── 存储层级(由快到慢)
│       ├── 第1级:CPU寄存器
│       │   └── 速度最快,容量最小,成本最高
│       ├── 第2级:Cache(高速缓存)
│       │   ├── 局部性原理是Cache设计的理论基础
│       │   ├── 时间局部性:循环导致指令重复执行
│       │   ├── 空间局部性:顺序访问附近存储单元
│       │   └── 快表(TLB)
│       │       ├── 定义:专门用于缓存页表项的高速缓存
│       │       ├── 原理:利用局部性原理缓存最近使用的页表项
│       │       ├── 作用:加速逻辑地址到物理地址的转换
│       │       ├── 位置:通常位于CPU的MMU中
│       │       └── 命中效果:大大减少访问内存页表的次数
│       ├── 第3级:内存(主存)DRAM
│       │   └── 程序运行时驻留的主要区域
│       └── 第4级:外存(磁盘、SSD等)
│           └── 容量大,速度慢,断电不丢失
│
├── 3️⃣ 操作系统概述 (★★)
│   ├── 作用
│   │   ├── 人机接口
│   │   ├── 软硬件接口
│   │   ├── 控制程序运行
│   │   └── 管理系统资源
│   ├── 分类
│   │   ├── 批处理操作系统(单道/多道)
│   │   ├── 分时操作系统(时间片轮转)
│   │   ├── 实时操作系统(高可靠性)
│   │   │   ├── 硬实时(Hard Real-Time)
│   │   │   │   └── 必须在规定的时间内完成操作,由操作系统设计保证
│   │   │   ├── 软实时(Soft Real-Time)
│   │   │   │   └── 按任务优先级尽可能快地完成操作,不严格保证截止时间
│   │   │   └── 核心要求:对外部事件的处理必须在被控对象允许的时间范围内完成
│   │   ├── 网络操作系统(Unix、Linux、Windows Server)
│   │   ├── 分布式操作系统(透明性、高性能)
│   │   ├── 微机操作系统(Windows、Linux)
│   │   └── 嵌入式操作系统(微型化、可定制)
│   └── 多道程序设计提高CPU和外部设备利用率
│
├── 4️⃣ 进程管理 (★★★)
│   ├── 进程相关概念
│   │   ├── 互斥:间接制约关系,同时只能有一个进程访问某资源
│   │   ├── 同步:直接制约关系,一个进程需要等待另一个进程完成
│   │   ├── 临界资源:互斥方式共享的资源(如打印机、磁带机)
│   │   ├── 临界区:每个进程中访问临界资源的那段代码,需互斥进入
│   │   └── 信号量
│   │       ├── 定义:表示资源数量的特殊变量
│   │       ├── 正数:可用资源数量;负数:排队等待的进程数
│   │       ├── P操作(申请):信号量值减1,若结果<0则阻塞
│   │       ├── V操作(释放):信号量值加1,若结果≤0则唤醒
│   │       └── 🌰 多台打印机共享示例
│   │           ├── n个进程共享2台打印机 → 信号量初值=2
│   │           ├── 取值范围:[2-n, 2]
│   │           ├── 信号量≥0:可用打印机数;信号量<0:等待进程数
│   │           └── 每个进程进入临界区前执行P操作
│   ├── 进程与线程
│   │   ├── 进程:资源分配和调度的独立单位,拥有独立地址空间,组成:程序块+数据块+PCB
│   │   ├── 线程:CPU调度基本单位,一个进程包含多个线程
│   │   ├── 线程独享:PC、寄存器组、栈
│   │   └── 线程共享:内存地址空间、代码段、数据段、打开的文件
│   ├── PV操作与前趋图
│   │   ├── PV操作:P申请资源(值减1,<0则阻塞);V释放资源(值加1,≤0则唤醒)
│   │   ├── 前趋图:有向无环图,结点=进程/程序段,有向边=前趋关系
│   │   └── 核心技巧:每个箭头对应一个信号量(初值0),前趋进程V,后继进程P
│   ├── 进程三态模型
│   │   ├── 运行态(Running):正在CPU上执行
│   │   ├── 就绪态(Ready):等待调度
│   │   ├── 阻塞态(Blocked):等待事件(如I/O完成)
│   │   └── 状态转换
│   │       ├── 就绪→运行:被调度选中
│   │       ├── 运行→就绪:时间片用完/被抢占
│   │       ├── 运行→阻塞:请求I/O或等待事件
│   │       ├── 阻塞→就绪:事件发生
│   │       └── ❌ 阻塞→运行、就绪→阻塞 不允许
│   ├── 进程调度算法
│   │   ├── 先来先服务(FCFS):非抢占式,公平但平均等待时间长
│   │   ├── 短作业优先(SJF):平均等待时间最小,但长作业可能饥饿
│   │   ├── 高响应比优先(HRRN):(等待+执行)/执行,综合FCFS和SJF优点
│   │   ├── 时间片轮转(RR):公平,响应快,时间片大小影响性能
│   │   ├── 优先级调度:静态/动态优先级,低优先级可能饥饿(可用老化技术解决)
│   │   └── 抢占式 vs 非抢占式
│   └── 死锁与银行家算法
│       ├── 死锁四大必要条件:互斥、保持和等待、不剥夺、环路等待
│       ├── 死锁避免:有序分配资源、银行家算法
│       ├── 银行家算法:分配前检测是否安全,存在安全序列则分配
│       ├── 不可能死锁条件:资源数 ≥ 进程数 × (每个进程所需资源数-1) + 1
│       └── 注意:不安全状态 ≠ 死锁,但可能导致死锁
│
├── 5️⃣ 存储管理 (★★★)
│   ├── 页式存储
│   │   ├── 概念:程序与内存划分为同样大小的块(页/页帧)
│   │   ├── 地址转换:逻辑地址=[逻辑页号|页内地址] → 查页表 → 物理地址=[物理页帧号|页内地址]
│   │   ├── 页内地址位数 = log2(页面大小)
│   │   ├── 页表:记录逻辑页号到物理页帧号的映射
│   │   ├── 页面置换淘汰原则:状态位为1(在内存)→优先淘汰访问位0→其次修改位0
│   │   ├── 虚拟存储器与缺页处理
│   │   │   └── 发生页面失效(缺页中断)时,需要进行外部地址变换
│   │   │       └── 将虚地址转换为辅存(如磁盘)上的物理地址,以便调入所需页面
│   │   ├── 优点:利用率高、碎片小(内部碎片)、管理简单
│   │   └── 缺点:系统开销大(页表)、可能产生抖动
│   ├── 段式存储
│   │   ├── 概念:按自然段划分逻辑空间,段长可变
│   │   ├── 地址转换:逻辑地址=[段号|段内地址] → 查段表 → 物理地址=基地址+段内地址
│   │   ├── 优点:共享/保护方便,按逻辑模块组织
│   │   ├── 缺点:产生外部碎片
│   │   ├── 注意:段内地址超过段长则越界(段错误)
│   │   └── 🌰 段地址转换示例
│   │       ├── 段表:段0[1598,600]、段1[486,50]、段2[90,100]、段3[1327,2988]、段4[1952,960]
│   │       ├── (0,128):128<600 → 物理地址=1598+128=1726
│   │       └── (0,1597):1597≥600 → 越界,无法转换
│   └── 段页式存储
│       ├── 概念:段式与页式的综合体,先分段再分页
│       ├── 地址结构:[段号|页号|页内地址]
│       ├── 优点:空间浪费小、共享/保护容易、能动态连接
│       └── 缺点:管理复杂、开销大、执行速度下降
│
├── 6️⃣ 磁盘管理 (★★★)
│   ├── 磁盘存取时间 = 寻道时间 + 等待时间(旋转延迟+传输时间)
│   ├── 移臂调度算法
│   │   ├── FCFS:公平但平均寻道距离大
│   │   ├── SSTF:平均寻道时间短,但可能饥饿
│   │   ├── SCAN(电梯算法):双向扫描,避免饥饿
│   │   └── CSCAN:单向扫描,两端请求更公平
│   ├── 缓冲区优化
│   │   ├── 单缓冲区:处理时间 = (读+传+处) + (读+传)×(块数-1)
│   │   ├── 双缓冲区:读入和传送/处理可并行
│   │   └── 优化分布:减少旋转延迟
│   └── 磁盘空间管理(位示图)
│       ├── 位示图大小 = 磁盘容量 ÷ 物理块大小 ÷ 字长
│       └── 计算技巧(16位字长)
│           ├── 磁盘块序号n(从0开始):字序号=n÷16,位号=n mod 16
│           ├── 第N个块(从1开始):n=N-1,字序号=(N-1)÷16,位号=(N-1) mod 16
│           └── 示例:序号99 → 字序号6,位号3;前100块需7个字
│
├── 7️⃣ 文件系统 (★★)
│   ├── 文件组成:文件内容(数据)+ 文件说明(元数据)
│   ├── 文件类型(UNIX)
│   │   ├── 普通文件:存储用户数据/程序/文本
│   │   ├── 目录文件:组织目录结构,损坏对系统影响最大
│   │   └── 设备文件:代表硬件设备(块设备/字符设备)
│   ├── 索引文件结构(1KB块、4B地址项)
│   │   ├── 直接地址(10项):10KB
│   │   ├── 一级间接(256项):256KB
│   │   ├── 二级间接(256×256):64MB
│   │   ├── 三级间接(256×256×256):16GB
│   │   └── 总结:索引级别越高,文件越大
│   ├── 文件打开与资源占用
│   │   ├── 未打开:目录项 + 磁盘索引节点 + 若干盘块
│   │   ├── 打开后:内存索引节点 + 文件表登记项 + 用户文件描述符表登记项
│   │   ├── 文件系统管理5方面:索引节点、空闲盘块、目录文件、文件表/描述符表、文件使用
│   │   └── ⚠️ 目录文件写回异常影响最大(空闲块/用户数据损坏不影响系统整体运行)
│   ├── 文件共享的安全性与可靠性
│   │   └── UserA共享文件后:方便性提高,但其他用户可能修改/删除 → 安全性和可靠性下降
│   └── 位示图管理磁盘空间(同6️⃣)
│
├── 8️⃣ 性能指标与评价 (★★)
│   ├── 性能指标分类(硬件+软件)
│   ├── CPU性能指标
│   │   ├── 主频 = 外频 × 倍频
│   │   ├── CPI = 总时钟周期数 ÷ 总指令条数(越小越好)
│   │   ├── IPC = 1 / CPI(越大越好)
│   │   └── MIPS = 主频 / CPI(越大越好)
│   ├── 性能评价方法
│   │   └── 基准程序法(Benchmark):目前最好方法,测试精确度:真实程序>核心程序>小型>合成
│   ├── 阿姆达尔定律
│   │   └── 加速比 = 1 / [(1-Fe) + Fe/Se],性能提升受限于不可改进部分
│   └── 多处理机性能公式
│       └── P = n / [1 + (n-1)a],性能与CPU个数不成正比
│
├── 9️⃣ Web服务器与系统监视 (★)
│   ├── Web性能指标:最大并发连接数、响应延迟、吞吐量
│   └── 系统监视方式:系统命令(ps、last、netstat)、系统记录文件、监控工具(Perfmon)
│
└── 🔟 计算机层次结构 (★)
    ├── 第0级:硬联逻辑
    ├── 第1级:微程序机器
    ├── 第2级:传统机器
    ├── 第3级:操作系统机器
    ├── 第4级:汇编语言机器
    ├── 第5级:高级语言机器
    └── 第6级:应用语言机器

# 计算机系统基础 - 核心知识思维导图


├── 0️⃣ 计算机系统的组成 (★★★)
│   ├── 硬件
│   │   ├── CPU
│   │   ├── 内存
│   │   ├── 存储设备
│   │   ├── 输入设备
│   │   └── 输出设备
│   └── 软件
│       ├── 系统软件
│       │   ├── 操作系统
│       │   ├── 编译程序
│       │   ├── 汇编程序
│       │   └── 实用程序
│       └── 应用软件
│           ├── 办公软件
│           ├── 数据库应用
│           ├── 网络应用
│           └── 行业专用软件

├── 1️⃣ 处理器体系结构与指令系统 (★★★)
│   ├── 冯·诺依曼结构
│   │   ├── 指令与数据存储器合并
│   │   ├── 指令与数据通过相同数据总线传输
│   │   └── 典型应用:PC处理器(I3、I5、I7)
│   ├── 哈佛结构
│   │   ├── 指令与数据分开存储、独立编址
│   │   ├── 并行读取,数据吞吐率高
│   │   ├── 4条总线:指令/数据地址总线+指令/数据总线
│   │   └── 典型应用:嵌入式系统、DSP
│   ├── CISC(复杂指令集)
│   │   ├── 指令数量多、频率差别大
│   │   ├── 可变长格式、多种寻址方式
│   │   ├── 微程序控制技术
│   │   └── 典型:x86(Intel、AMD)
│   ├── RISC(精简指令集)
│   │   ├── 指令数量少、定长格式
│   │   ├── 单周期指令、操作寄存器
│   │   ├── 硬布线控制、适合流水线
│   │   ├── 典型:ARM、Power
│   │   └── RISC特点不包括:寻址方式丰富、指令功能强
│   ├── 总线
│   │   ├── 基本概念:一组能为多个部件分时共享的信息传送线
│   │   ├── 核心特点
│   │   │   ├── 分时发送:多个部件只能分时向总线发送数据
│   │   │   ├── 同时接收:多个部件可以同时从总线接收数据
│   │   │   ├── 总线复用:减少信号线数量,以较少的信号线传输更多信息
│   │   │   └── 注意:传统总线通常是半双工的,但现代总线可支持全双工
│   │   ├── 按层次分类
│   │   │   ├── 芯片内总线:集成电路芯片内部各部分的连接
│   │   │   ├── 系统总线(内总线):CPU、内存和接口等连接
│   │   │   └── 外总线(通信总线):计算机与外设或计算机间连接
│   │   ├── 按功能分类
│   │   │   ├── 数据总线:传输数据
│   │   │   ├── 地址总线:传输地址
│   │   │   └── 控制总线:传输控制信号
│   │   └── 按数据传输方式分类
│   │       ├── 并行总线
│   │       │   ├── 特点:多根数据线同时传送多位数据
│   │       │   ├── 适用:短距离传输
│   │       │   └── 代表:PCI、ISA
│   │       └── 串行总线
│   │           ├── 特点:一位一位顺序传输,每个位占据固定时间长度
│   │           ├── 适用:长距离传输
│   │           ├── 传输波特率可调整
│   │           ├── 正确性依赖于校验码
│   │           ├── 双工模式
│   │           │   ├── 半双工:同一时刻只能单向传输(发或收)
│   │           │   └── 全双工:可同时发送和接收(一条线发,一条线收)
│   │           ├── 数据传输控制方式
│   │           │   ├── 程序查询方式:CPU主动查询状态寄存器,判断是否可收/发
│   │           │   └── 中断方式:设备准备好后主动向CPU发中断请求,CPU响应后处理
│   │           └── 代表:USB、RS-232、SATA
│   └── I/O控制方式
│       ├── 程序控制(查询)方式
│       ├── 程序中断方式
│       ├── DMA方式
│       ├── 通道方式
│       └── I/O处理机

├── 2️⃣ 存储系统 (★★★)
│   ├── 存储层级(由快到慢)
│   │   ├── 第1级:CPU寄存器
│   │   │   └── 速度最快,容量最小,成本最高
│   │   ├── 第2级:Cache(高速缓存)
│   │   │   ├── 局部性原理是Cache设计的理论基础
│   │   │   ├── 时间局部性:循环导致指令重复执行
│   │   │   ├── 空间局部性:顺序访问附近存储单元
│   │   │   └── 快表(TLB,Translation Lookaside Buffer)
│   │   │       ├── 定义:专门用于缓存页表项的高速缓存
│   │   │       ├── 原理:利用局部性原理缓存最近使用的页表项
│   │   │       ├── 作用:加速逻辑地址到物理地址的转换
│   │   │       ├── 位置:通常位于CPU的MMU(内存管理单元)中
│   │   │       └── 命中效果:大大减少访问内存页表的次数,提升地址转换效率
│   │   ├── 第3级:内存(主存)DRAM
│   │   │   └── 程序运行时驻留的主要区域
│   │   └── 第4级:外存(磁盘、SSD等)
│   │       └── 容量大,速度慢,断电不丢失

├── 3️⃣ 操作系统概述 (★★)
│   ├── 作用
│   │   ├── 人机接口
│   │   ├── 软硬件接口
│   │   ├── 控制程序运行
│   │   └── 管理系统资源
│   ├── 分类
│   │   ├── 批处理操作系统(单道/多道)
│   │   ├── 分时操作系统(时间片轮转)
│   │   ├── 实时操作系统(高可靠性)
│   │   ├── 网络操作系统(Unix、Linux、Windows Server)
│   │   ├── 分布式操作系统(透明性、高性能)
│   │   ├── 微机操作系统(Windows、Linux)
│   │   └── 嵌入式操作系统(微型化、可定制)
│   └── 多道程序设计提高CPU和外部设备利用率

├── 4️⃣ 进程管理 (★★★)
│   ├── 进程相关概念
│   │   ├── 互斥(Mutual Exclusion)
│   │   │   ├── 性质:间接制约关系
│   │   │   └── 特点:同时只能有一个进程访问某资源
│   │   ├── 同步(Synchronization)
│   │   │   ├── 性质:直接制约关系
│   │   │   └── 特点:一个进程需要等待另一个进程完成
│   │   ├── 临界资源(Critical Resource)
│   │   │   ├── 定义:互斥方式共享的资源
│   │   │   └── 典型:打印机、磁带机
│   │   ├── 临界区(Critical Section)
│   │   │   ├── 定义:每个进程中访问临界资源的那段代码
│   │   │   └── 原则:互斥进入,不能同时有两个进程在临界区
│   │   └── 信号量(Semaphore)
│   │       ├── 定义:表示资源数量的特殊变量
│   │       ├── 正数:可用资源数量
│   │       ├── 负数:排队等待的进程数
│   │       ├── P操作(Passeren,申请)
│   │       │   ├── 信号量值减1
│   │       │   └── 若结果<0,进程阻塞
│   │       └── V操作(Verhoog,释放)
│   │           ├── 信号量值加1
│   │           └── 若结果≤0,唤醒等待进程
│   ├── 进程与线程
│   │   ├── 进程(Process)
│   │   │   ├── 定义:程序在一个数据集合上运行的过程
│   │   │   ├── 系统进行资源分配和调度的独立单位
│   │   │   ├── 拥有独立的地址空间和系统资源
│   │   │   └── 进程组成:程序块 + 数据块 + PCB
│   │   ├── 线程(Thread)
│   │   │   ├── 定义:进程中的一条执行路径
│   │   │   ├── CPU调度和分派的基本单位
│   │   │   ├── 一个进程包含多个线程
│   │   │   └── 线程分类:内核线程、用户线程
│   │   ├── 线程独享资源
│   │   │   ├── 程序计数器(PC)
│   │   │   ├── 寄存器组
│   │   │   └── 栈(Stack)
│   │   └── 线程共享资源(属于同一进程的线程间共享)
│   │       ├── 内存地址空间
│   │       ├── 代码段
│   │       ├── 数据段
│   │       └── 打开的文件
│   ├── PV操作与前趋图
│   │   ├── PV操作
│   │   │   ├── P操作(Passeren):申请资源,信号量值减1,若结果<0则阻塞
│   │   │   └── V操作(Verhoog):释放资源,信号量值加1,若结果≤0则唤醒
│   │   ├── 前趋图(Precedence Graph)
│   │   │   ├── 定义:描述多个进程之间执行顺序的有向无环图
│   │   │   ├── 表示并发执行关系
│   │   │   ├── 结点:一个进程或一个程序段
│   │   │   ├── 有向边:前趋关系(A→B表示A必须在B之前完成)
│   │   │   ├── 起始进程:没有前趋的结点
│   │   │   └── 终结进程:没有后继的结点
│   │   └── 前趋图与PV操作的关系(核心技巧)
│   │       ├── 实现并发的信号量初始值一般为0
│   │       ├── 有几个箭头(前趋关系)就有几个信号量
│   │       ├── 对于前趋关系 A → B(A先于B完成):
│   │       │   ├── A 执行完成后需要执行 V(S) 操作(释放资源,通知后继)
│   │       │   └── B 开始执行前需要执行 P(S) 操作(检查资源是否足够)
│   │       └── 总结:前趋图中的每个箭头对应一个信号量,前趋进程执行 V 操作,后继进程执行 P 操作
│   ├── 进程三态模型
│   │   ├── 运行态(Running)
│   │   │   └── 进程正在CPU上执行
│   │   ├── 就绪态(Ready)
│   │   │   └── 获得了除CPU外的一切资源,等待调度
│   │   ├── 阻塞/等待态(Blocked/Waiting)
│   │   │   └── 正在等待某一事件发生(如I/O完成)
│   │   └── 状态转换规则
│   │       ├── 就绪 → 运行:进程被调度程序选中
│   │       ├── 运行 → 就绪:时间片用完或被更高优先级进程抢占
│   │       ├── 运行 → 阻塞:进程主动请求I/O或等待某事件
│   │       ├── 阻塞 → 就绪:所等待的事件发生(如I/O完成)
│   │       ├── ❌ 阻塞 → 运行:不允许直接转换
│   │       └── ❌ 就绪 → 阻塞:不允许直接转换
│   ├── 进程调度算法
│   │   ├── 先来先服务(FCFS,First Come First Served)
│   │   │   ├── 原理:按进程到达就绪队列的先后顺序分配CPU
│   │   │   └── 特点:非抢占式,公平但平均等待时间较长
│   │   ├── 短作业优先(SJF,Shortest Job First)
│   │   │   ├── 原理:选择预估执行时间最短的进程先分配CPU
│   │   │   └── 特点:平均等待时间最小,但长作业可能饥饿
│   │   ├── 高响应比优先(HRRN,Highest Response Ratio Next)
│   │   │   ├── 原理:选择响应比最高的进程分配CPU
│   │   │   ├── 响应比公式:(等待时间 + 执行时间) / 执行时间
│   │   │   ├── 特点:综合考虑了作业的执行时间和等待时间
│   │   │   └── 优势:综合了先来先服务和短作业优先的优点
│   │   ├── 时间片轮转(RR,Round Robin)
│   │   │   ├── 原理:每个进程被分配一个固定大小的时间片
│   │   │   ├── 调度方式:进程用尽时间片后,调度器将其移动到队列末尾
│   │   │   ├── 特点:公平,响应时间快,适合分时系统
│   │   │   └── 关键:时间片大小影响系统性能(过大退化为FCFS,过小增加切换开销)
│   │   ├── 优先级调度(Priority Scheduling)
│   │   │   ├── 原理:选择优先级最高的进程分配CPU
│   │   │   ├── 分类:静态优先级(固定)、动态优先级(可调整)
│   │   │   └── 问题:低优先级进程可能饥饿(可用老化技术解决)
│   │   └── 抢占式 & 非抢占式
│   │       ├── 非抢占式:进程主动放弃CPU(如等待I/O或结束)
│   │       └── 抢占式:更高优先级进程可强制抢占当前进程的CPU
│   └── 死锁与银行家算法
│       ├── 死锁概念
│       │   ├── 定义:多个进程因互相等待对方持有的资源而无法继续执行
│       │   └── 结果:系统陷入无限等待状态,资源无法释放
│       ├── 死锁产生的四大必要条件
│       │   ├── ① 互斥(Mutual Exclusion)
│       │   │   └── 资源一次只能被一个进程使用
│       │   ├── ② 保持和等待(Hold and Wait)
│       │   │   └── 进程持有至少一个资源,同时等待其他进程持有的资源
│       │   ├── ③ 不剥夺(No Preemption)
│       │   │   └── 资源只能由进程主动释放,不能被强制剥夺
│       │   └── ④ 环路等待(Circular Wait)
│       │       └── 形成循环等待链,每个进程等待下一个进程持有的资源
│       ├── 死锁避免的方式
│       │   ├── 方式一:有序分配资源
│       │   │   └── 对所有资源统一编号,进程按编号顺序申请资源
│       │   └── 方式二:银行家算法
│       │       └── 动态检测资源分配的安全性,避免进入不安全状态
│       ├── 银行家算法(Banker's Algorithm)
│       │   ├── 核心思想:分配资源前先计算是否会导致不安全状态
│       │   ├── 分配资源的限制原则
│       │   │   ├── 原则一:当一个进程对资源的最大需求量不超过系统中的资源数时可以接纳该进程
│       │   │   ├── 原则二:进程可以分期请求资源,但请求的总数不能超过最大需求量
│       │   │   └── 原则三:当系统现有的资源不能满足进程尚需资源数时,对进程的请求可以推迟分配
│       │   └── 安全状态判断
│       │       ├── 安全状态:存在一个安全序列,所有进程都能按顺序完成
│       │       ├── 不安全状态:不存在安全序列,可能引发死锁
│       │       └── 注意:不安全状态 ≠ 死锁,但可能导致死锁
│       └── 不可能死锁的数学条件
│           └── 资源数 ≥ 进程数 × (每个进程所需资源数 - 1) + 1

├── 5️⃣ 存储管理 (★★★)
│   ├── 页式存储(Paging)
│   │   ├── 基本概念:将程序与内存均划分为同样大小的块(页/页帧)
│   │   ├── 页面大小与地址转换核心原理
│   │   │   ├── 核心:根据页面大小确定表示页内地址所需的位数
│   │   │   ├── 页内地址位数 = log2(页面大小)
│   │   │   ├── 示例:页面大小为4KB(4096字节),需要12位表示页内地址
│   │   │   ├── 关键规律:页内地址(低位)在转换前后保持不变
│   │   │   └── 变化部分:逻辑页号 → 物理页帧号(高位部分)
│   │   ├── 地址转换
│   │   │   ├── 逻辑地址 = 逻辑页号 + 页内地址
│   │   │   └── 物理地址 = 物理页帧号(物理块号) + 页内地址
│   │   ├── 地址转换示意图解
│   │   │   ├── 逻辑地址:[逻辑页号 | 页内地址]
│   │   │   ├── 查页表:逻辑页号 → 物理页帧号
│   │   │   └── 物理地址:[物理页帧号 | 页内地址]
│   │   ├── 页表:记录逻辑页号到物理页帧号的映射
│   │   ├── 淘汰原则(页面置换算法)
│   │   │   ├── 状态位为1(在内存中)才可淘汰
│   │   │   ├── 优先淘汰访问位为0的页面
│   │   │   └── 其次考虑修改位为0的页面
│   │   ├── 优点:利用率高、碎片小(内部碎片)、分配及管理简单
│   │   └── 缺点:增加了系统开销(页表)、可能产生抖动现象
│   ├── 段式存储(Segmentation)
│   │   ├── 基本概念:按用户作业中的自然段来划分逻辑空间
│   │   ├── 特点:段的长度可以不一样,段长可变
│   │   ├── 段表:记录段号到物理基地址和段长的映射
│   │   ├── 地址转换:逻辑地址 = 段号 + 段内地址
│   │   ├── 优点:方便共享和保护,按逻辑模块组织
│   │   ├── 缺点:会产生外部碎片
│   │   └── 注意:地址转换可能因段内地址超过段长而发生越界
│   └── 段页式存储(Segmented Paging)
│       ├── 基本概念:段式与页式的综合体,先分段再分页
│       ├── 结构:一个程序有若干个段,每个段中有若干页,每页大小相同
│       ├── 地址结构:段号 + 页号 + 页内地址
│       ├── 优点
│       │   ├── 空间浪费小(结合了页式的高利用率)
│       │   ├── 存储共享容易(按段共享)
│       │   ├── 存储保护容易(按段保护)
│       │   └── 能动态连接
│       └── 缺点
│           ├── 管理软件增加,复杂性和开销增大
│           ├── 需要的硬件及占用的内存增加
│           └── 执行速度下降(需多次查表)

├── 6️⃣ 磁盘管理 (★★★)
│   ├── 磁盘存取时间
│   │   ├── 公式:存取时间 = 寻道时间 + 等待时间
│   │   ├── 寻道时间:磁头移动到指定磁道所需的时间
│   │   ├── 等待时间:旋转延迟(读写的扇区转到磁头下方的时间)+ 传输时间
│   │   └── 优化目标:减少寻道时间和旋转延迟
│   ├── 移臂调度算法
│   │   ├── 先来先服务(FCFS,First Come First Served)
│   │   │   ├── 原理:按请求到达的先后顺序处理
│   │   │   └── 特点:公平,但平均寻道距离较大
│   │   ├── 最短寻道时间优先(SSTF,Shortest Seek Time First)
│   │   │   ├── 原理:选择距离当前磁头最近的请求优先处理
│   │   │   └── 特点:平均寻道时间较短,但可能导致饥饿
│   │   ├── 扫描算法(SCAN,电梯算法)
│   │   │   ├── 原理:磁头单向移动,处理沿途请求,到尽头后折返
│   │   │   └── 特点:双向扫描,避免饥饿
│   │   └── 循环扫描(CSCAN,Circular SCAN)
│   │       ├── 原理:磁头单向移动,到尽头后直接返回起始端重新扫描
│   │       └── 特点:单向扫描,两端请求响应更公平
│   ├── 缓冲区优化
│   │   ├── 单缓冲区:处理时间 = (读入+传送+处理) + (读入+传送) × (块数-1)
│   │   ├── 双缓冲区:读入和传送/处理可并行,效率更高
│   │   └── 优化分布:将逻辑记录按处理顺序优化分布在物理块上,减少旋转延迟
│   └── 磁盘空间管理
│       ├── 位示图(Bitmap):用二进制位记录磁盘块使用情况
│       ├── 位示图大小计算:磁盘容量 ÷ 物理块大小 ÷ 字长
│       └── 位示图计算技巧(第几个字的定位)
│           ├── 基本规则:磁盘序号、字的序号、对应位号均从0开始
│           ├── 给定磁盘块序号 n(从0开始):
│           │   ├── 所在字的序号 = n ÷ 16(整除,取整数部分)
│           │   └── 所在位的位号 = n mod 16(余数)
│           ├── 给定磁盘块为第 N 个(N从1开始):
│           │   ├── 先转换为从0开始的序号:n = N - 1
│           │   ├── 所在字的序号 = (N-1) ÷ 16(整除)
│           │   └── 所在位的位号 = (N-1) mod 16
│           ├── 需要几个字表示前 n+1 个磁盘块:
│           │   └── 所需字数 = ⌈(n+1) ÷ 16⌉(向上取整)
│           └── 示例:指定序号为 99(从0开始)的磁盘块
│               ├── 所在字的序号 = 99 ÷ 16 = 6(第6个字,索引从0开始)
│               ├── 所在位的位号 = 99 mod 16 = 3(第3位)
│               └── 前100个磁盘块需要 ⌈100 ÷ 16⌉ = 7个字

├── 7️⃣ 文件系统 (★★)
│   ├── 文件组成
│   │   ├── 文件真实内容(数据)
│   │   │   └── 文件中存储的实际数据信息
│   │   └── 文件说明(文件信息/元数据)
│   │       ├── 文件名
│   │       ├── 文件大小
│   │       ├── 创建时间、修改时间
│   │       ├── 所有者、权限
│   │       └── 文件在磁盘上的存储位置
│   ├── 文件类型(UNIX系统分类)
│   │   ├── 普通文件(Regular File)
│   │   │   └── 存储用户数据、程序、文本等,最常见类型
│   │   ├── 目录文件(Directory File)
│   │   │   ├── 用于组织和管理文件系统的目录结构
│   │   │   ├── 包含文件名和对应i节点的映射关系
│   │   │   └── ⚠️ 若目录文件的修改结果写回磁盘时发生掉电,对系统影响最大
│   │   │       ├── 原因:目录文件损坏会导致大量文件无法访问
│   │   │       └── 后果:文件系统结构破坏,可能造成大面积数据丢失
│   │   └── 设备文件(Device File)
│   │       ├── 代表硬件设备(如磁盘、键盘、打印机)
│   │       ├── 分类:块设备文件(如磁盘)、字符设备文件(如键盘)
│   │       └── 通过文件系统接口统一访问硬件
│   ├── 索引文件结构
│   │   ├── 基本参数(以1KB物理块、4B地址项为例)
│   │   │   ├── 物理块大小:1KB = 1024字节
│   │   │   ├── 地址项大小:4字节
│   │   │   └── 每个索引块可存放地址项个数 = 1024B ÷ 4B = 256个
│   │   ├── 直接地址索引
│   │   │   ├── 索引节点直接指向数据块
│   │   │   ├── 页号范围:0 ~ 9(假设10个直接地址项)
│   │   │   └── 可表示的文件大小 = 10 × 1KB = 10KB
│   │   ├── 一级间接索引
│   │   │   ├── 索引节点指向索引块,索引块再指向数据块
│   │   │   ├── 地址项个数:256个
│   │   │   └── 可表示的文件大小 = 256 × 1KB = 256KB
│   │   ├── 二级间接索引
│   │   │   ├── 索引节点→一级索引块→二级索引块→数据块
│   │   │   ├── 地址项个数:256 × 256 = 65536个
│   │   │   └── 可表示的文件大小 = 65536 × 1KB = 65536KB = 64MB
│   │   ├── 三级间接索引
│   │   │   ├── 索引节点→一级→二级→三级索引块→数据块
│   │   │   ├── 地址项个数:256 × 256 × 256 = 16,777,216个
│   │   │   └── 可表示的文件大小 = 16,777,216 × 1KB = 16GB
│   │   └── 总结:索引级别越高,可表示的文件越大
│   └── 位示图管理磁盘空间
│       ├── 原理:用二进制位表示磁盘块的使用状态(1表示已用,0表示空闲)
│       ├── 计算公式:位示图大小(字)= 磁盘容量 ÷ 物理块大小 ÷ 字长
│       └── 计算技巧(第几个字的定位)
│           ├── 基本规则:磁盘序号、字的序号、对应位号均从0开始
│           ├── 给定磁盘块序号 n(从0开始):
│           │   ├── 所在字的序号 = n ÷ 16(整除,取整数部分)
│           │   └── 所在位的位号 = n mod 16(余数)
│           ├── 给定磁盘块为第 N 个(N从1开始):
│           │   ├── 先转换为从0开始的序号:n = N - 1
│           │   ├── 所在字的序号 = (N-1) ÷ 16(整除)
│           │   └── 所在位的位号 = (N-1) mod 16
│           ├── 需要几个字表示前 n+1 个磁盘块:
│           │   └── 所需字数 = ⌈(n+1) ÷ 16⌉(向上取整)
│           └── 示例:指定序号为 99(从0开始)的磁盘块
│               ├── 所在字的序号 = 99 ÷ 16 = 6(第6个字,索引从0开始)
│               ├── 所在位的位号 = 99 mod 16 = 3(第3位)
│               └── 前100个磁盘块需要 ⌈100 ÷ 16⌉ = 7个字

├── 8️⃣ 性能指标与评价 (★★)
│   ├── 性能指标分类
│   │   ├── 硬件性能指标
│   │   │   ├── 计算机
│   │   │   │   ├── CPU主频、CPI、IPC、MIPS
│   │   │   │   ├── 内存容量与带宽
│   │   │   │   ├── 存储设备读写速度
│   │   │   │   └── 总线带宽与传输速率
│   │   │   ├── 路由器
│   │   │   │   ├── 包转发能力(pps)
│   │   │   │   ├── 路由表容量
│   │   │   │   ├── 吞吐量
│   │   │   │   └── 延迟
│   │   │   ├── 交换机
│   │   │   │   ├── 交换容量(bps)
│   │   │   │   ├── 包转发率
│   │   │   │   ├── 端口速率
│   │   │   │   └── MAC地址表深度
│   │   │   └── 网络
│   │   │       ├── 带宽(bps)
│   │   │       ├── 吞吐量
│   │   │       ├── 延迟(RTT)
│   │   │       ├── 丢包率
│   │   │       └── 抖动
│   │   └── 软件性能指标
│   │       ├── 操作系统
│   │       │   ├── 系统的可靠性
│   │       │   ├── 系统的吞吐率(量)
│   │       │   ├── 系统响应时间
│   │       │   ├── 系统资源利用率
│   │       │   └── 可移植性
│   │       ├── 数据库管理系统
│   │       │   ├── 数据库大小
│   │       │   ├── 表中允许的记录(行)数量
│   │       │   ├── 单个记录(行)的大小
│   │       │   ├── 最大并发事务处理能力
│   │       │   ├── 负载均衡能力
│   │       │   └── 最大连接数
│   │       └── Web服务器
│   │           ├── 最大并发连接数
│   │           ├── 响应延迟
│   │           └── 吞吐量
│   ├── CPU性能指标详解
│   │   ├── 主频(CPU时钟频率)
│   │   │   ├── 定义:CPU每秒产生的时钟周期数
│   │   │   ├── 单位:Hz(MHz、GHz)
│   │   │   └── 公式:外频 × 倍频 = 主频
│   │   ├── CPI(Clock cycles Per Instruction)
│   │   │   ├── 定义:平均每条指令所需的时钟周期个数
│   │   │   ├── 公式:CPI = 总时钟周期数 ÷ 总指令条数
│   │   │   └── 意义:CPI越小,CPU执行指令效率越高
│   │   ├── IPC(Instructions Per Clock)
│   │   │   ├── 定义:每个时钟周期平均执行的指令条数
│   │   │   ├── 公式:IPC = 总指令条数 ÷ 总时钟周期数
│   │   │   └── 关系:IPC = 1 / CPI
│   │   └── MIPS(Million Instructions Per Second)
│   │       ├── 定义:每秒执行的百万条指令数,表示CPU运算速度
│   │       ├── 公式:MIPS = 主频 / CPI = 主频 × IPC
│   │       ├── 单位:百万条指令/秒
│   │       └── 意义:MIPS值越大,CPU运算速度越快
│   ├── 性能评价方法
│   │   ├── 时钟频率法:以时钟频率高低衡量速度
│   │   ├── 指令执行速度法(MIPS):用MIPS表示运算速度
│   │   ├── 等效指令速度法(Gibson mix):通过各类指令在程序中所占比例计算
│   │   ├── 数据处理速率法(PDR):PDR = L/R,考虑CPU+存储
│   │   ├── 综合理论性能法(CTP):用MTOPS表示
│   │   └── 基准程序法(Benchmark)
│   │       ├── 定义:把应用程序中用得最多、最频繁的那部分核心程序作为评估计算机系统性能的标准程序
│   │       ├── 地位:目前一致承认的测试系统性能的较好方法
│   │       ├── 测试精确度排名:真实程序 > 核心程序 > 小型基准程序 > 合成基准程序
│   │       ├── 常见基准程序
│   │       │   ├── Dhrystone:综合整数基准测试程序
│   │       │   ├── Linpack:测试高性能计算机浮点性能
│   │       │   ├── Whetstone:综合性测试程序(浮点运算、功能调用等)
│   │       │   ├── SPEC:速度测试(单项任务)和吞吐率测试(多任务)
│   │       │   └── TPC:评测事务处理、数据库性能(TPC-C、TPC-H等)
│   │       └── 核心特点:测试结果反映真实应用场景下的系统性能
│   ├── 阿姆达尔定律
│   │   ├── 定义:系统性能提升受限于可改进部分所占比例
│   │   ├── 公式:加速比 = 1 / [(1-Fe) + Fe/Se]
│   │   │   ├── Fe:可改进部分在总执行时间中所占比例
│   │   │   └── Se:改进部分性能提升倍数
│   │   └── 意义:性能提升的上限由不可改进部分决定
│   └── 多处理机性能公式
│       ├── 公式:P = n / [1 + (n-1)a]
│       │   ├── n:CPU个数
│       │   └── a:开销常数
│       └── 意义:多机系统性能存在上限,与CPU个数不成正比

├── 9️⃣ Web服务器与系统监视 (★)
│   ├── Web性能指标
│   │   ├── 最大并发连接数
│   │   ├── 响应延迟
│   │   └── 吞吐量
│   └── 系统监视方式
│       ├── 系统命令(ps、last、netstat)
│       ├── 系统记录文件
│       └── 监控工具(Perfmon)

└── 🔟 计算机层次结构 (★)
    ├── 第0级:硬联逻辑
    ├── 第1级:微程序机器
    ├── 第2级:传统机器
    ├── 第3级:操作系统机器
    ├── 第4级:汇编语言机器
    ├── 第5级:高级语言机器
    └── 第6级:应用语言机器

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐