NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
[TOC] ## 硬件图 ![](https://img.kancloud.cn/38/0a/380a17d8a1d8df737250190b9022c294_1032x543.png) ### CPU 部分 #### 运算器: * **ACC(累加器-Accumulator)**: * 是 CPU 中的一个寄存器,临时存储算术或逻辑运算的中间结果。 * 运算完成后结果通常保存在 ACC 中。 * **MQ(乘商寄存器-Multiplier Quotient Register)**: * 用于乘法和除法操作中存储乘数或商/余数。 * **ALU(算术逻辑单元-Arithmetic Logic Unit)**: * 执行算术运算(如加减乘除)和逻辑运算(如与、或、非)。 * **X (寄存器-Index Register)**: * 通常用于与 ALU 协作,参与运算,辅助存储一个操作数。 * **PSW(程序状态字-Program Status Word)**: * 记录程序执行状态,比如零标志、进位标志、溢出标志等。 * * * #### 控制器: * **CU(控制单元-Control Unit)**: * 产生控制信号,协调各部分工作流程。 * 依据指令内容发出操作指令,控制数据在 CPU、内存、I/O 之间流动。 * **IR(指令寄存器-Instruction Register)**: * 存储当前正在执行的那条指令。 * **ID(指令译码器-Instruction Decoder)**: * 对 IR 中的指令进行译码,交由 CU 决定具体操作。 * **PC(程序计数器-Program Counter)**: * 存放下一条要执行的指令的地址,每执行一条指令就加 1。 * 实现程序的自动顺序执行。 * **时序部件**: * 控制不同阶段(如取指、译码、执行)信号的时序与节奏 ### 主存储器部分: * **存储体**: * 实际存储程序指令和数据的区域(RAM 内存)。 * CPU 从这里读取指令和数据。 * **MAR(内存地址寄存器-Memory Address Register)**: * 用于指定要访问的内存地址。 * 由 PC 或 CU 送入指令或数据的地址。 * **MDR(内存数据寄存器-Memory Data Register)**: * 用于临时存放从内存中读出的数据或将要写入内存的数据。 ### I/O设备(输入输出): * 外围设备的数据输入输出,可通过 MDR 等寄存器进行数据传输。 ### 数据流编号解析 | 编号 | 含义 | | -- | -------------------- | | 1 | PC → MAR:将指令地址送入 MAR | | 2 | MAR → 内存:访问内存获取指令 | | 3 | 指令 → MDR:从内存中取出的指令 | | 4 | MDR → IR:将指令送入 IR | | 5 | IR → ID:指令译码 | | 6 | 控制信号发出,执行相关操作 | | 7 | 数据访问(如读取数据操作) | | 8 | 数据写入内存(如写操作) | | 9 | I/O 设备读写(可与 MDR 通信) | ## cpu硬件组成 ### 运算器的组成包含如下: 1. **算术逻辑单元 ALU**: 数据的算术运算和逻辑运算; 2. **累加寄存器 AC**: 通用寄存器,为 ALU 提供一个工作区,用来暂存数据; 3. **数据缓冲寄存器 DR**: 写内存时,暂存指令或数据; 4. **状态条件寄存器 PSW**: 存状态标志与控制标志。 * * * ### 控制器的组成包含如下: 1. **程序计数器 PC**: 存储下一条要执行指令的地址;处理器首先需要从PC中取出指令在内存中的地址,通过地址总线址获取。 2. **指令寄存器 IR**: 存储即将执行的指令; 3. **指令译码器 ID**: 对指令中的操作码字段进行分析解释; 4. **地址寄存器 AR**: 用来保存当前 CPU 所访问的内存单元的地址; 5. **时序部件**: 提供时序控制信号。 ## 主存 **存储器**的基本单位是存储单元,一般以8位二进制为一个存储单元。每个存储单元都有一个地址,一般用十六进制数表示。 ## 数据总线 * **数据总线(Data Bus)**: * 用途:传输实际的数据(如操作数、计算结果)。 * 特点:双向传输,宽度(如8位、32位、64位)决定一次能传输的数据量。例如,64位数据总线可同时传输64位数据。 * 示例:CPU与内存交换运算结果时使用数据总线。 * **地址总线(Address Bus)**: * 用途:传输内存地址或I/O设备地址,指定数据存储或读取的位置。 * 特点:单向传输(通常由CPU发出),宽度决定寻址范围。例如,32位地址总线可寻址2^32(4GB)内存。 * 示例:CPU通过地址总线告诉内存读取或写入的具体地址。 * **控制总线(Control Bus)**: * 用途:传输控制信号,协调系统各部分的运行(如读/写信号、中断信号、时钟信号)。 * 特点:信号种类多样,单向或双向,具体信号取决于系统设计。 * 示例:CPU发送“读”信号到内存,触发数据读取操作。 按总线数据线的多少分为并行总线和串行总线 | 特性 | 并行总线 | 串行总线 | | --- | --- | --- | | **数据线数量** | 多条(如8、16、32条) | 单条或少数几条(如1-4条) | | **传输方式** | 同时传输多位 | 按序传输单比特 | | **带宽** | 依赖宽度和频率 | 依赖频率和通道数 | | **布线复杂度** | 高,占用空间大 | 低,布线简单 | | **抗干扰性** | 易受串扰影响 | 差分信号,抗干扰强 | | **频率限制** | 高频下信号同步困难 | 支持更高频率 | | **典型应用** | 早期PCI、并行ATA | PCIe、USB、SATA | ## 存储器 按照所处位置分类: - **内存(主存)**:CPU 当前使用的指令和数据; - **外存(辅存)**:存放程序和数据。 按照构成材料分类: - **半导体存储器**:双极结电路器件; - **磁存储器**:依靠电流上磁存储信息,主存; - **光存储器**:利用光学两种不同的状态长期保存信息,外存。 按照工作方式分类: - **读/写存储器**:如 RAM。 - **只读存储器**(ROM):用户不能写入数据。 - 可擦写的只读存储器:PROM(用户可写入一次)。 - 可编程的只读存储器:EPROM(可多次编程,紫外线擦除)。 - 电可擦写的只读存储器:EEPROM(可多次编程,电擦除)。 - 可编程的只读存储器:擦近 EEPROM,U 盘。 按照访问方式分类: - **顺序存储器**(如磁带); - **随机存储器**(如 RAM)。 - **直接存储器**(如 DAM)。 - **相对存储器**(如硬盘,Cache)。 按照寻址方式分类 - **随机存储器RAM**:按地址访问存储器的任一单元,主存 - **顺序存储器SAM**:方问时按顺序查找目标地址,磁带 - **直接存储器DAM**:按数据块所在位置方问,磁盘 - **相联存储器**:按照内容进行访问,如何CPU Cache 分类 - **速度从快到慢**: 寄存器->cache->主存->磁盘 - **容量从小到大**: 寄存器->cache->主存->磁盘 - **价格从高到低**: 寄存器->cache->主存->磁盘 ## 校验码 信息保存在电容中,如遇电磁环境干扰,会导致电容的充放电或触发器的翻转,存在存储器的信息可能会出错 类型 - 奇偶校验码 - 海明码 - 循环冗余校验码(CRC) 码距 - 在一个码组内为了检测e个误码,要求最小码距应该满足: d>=e+1 (为了检测一个误码,最少为2) - 在一个码组内为了纠正t个误码,要求最小码距应该满足: d>=2t+1 (为了纠正一个误码,最少为3) - 同时纠错检错:d>=e+t+1 ### 奇偶校验码 **奇偶效验码例子** 在原始数据后加上一位 校验位,使得整个数据的“1”的个数变成: - 偶校验(Even Parity):偶数个 1 - 奇校验(Odd Parity):奇数个 1 示例:使用偶校验 **正确例子** 1. 原始数据(4 位): ``` 1011 (3 个 1) ``` 2. 为变成偶数个 1 → 加个校验位 1: ``` 1011 1(共 4 个 1,是偶数) ``` 3. 接收端校验: 如果接收到的数据中“1”的个数不是偶数 ⇒ 说明有错误。 **出错例子** - 接收方收到: ``` 1001 1(共 3 个 1,是奇数) ``` 发现不是偶数 ⇒ 说明出错,但 不能定位是哪一位错了,只能检测错误 ### 海明码 - 海明码是奇偶效验码和分组码组成 已知原始数据为1001011,采用Hamming Code编码后,求实际发送的数据? 1. 计算需要的校验位数目。从题目中可知数据为的长度为7,即`m=7`,带入公式`$ m + k + 1 \leq 2^k $` 可等`k>=4`最小值为4,最后实际发送的数据长度为`7+4=11`,根据海明码原则组合排列7为数据和4位校验码`$ 1 = 2^0, 2 = 2^1, 4 = 2^2, 8 = 2^3 $` ![](https://img.kancloud.cn/04/e7/04e7d09268d6922a83f4058c75c2f925_780x190.png) ![](https://img.kancloud.cn/a6/6a/a66a6d08ca5a965d4e0e849b8409941a_384x320.png) 列表中数是格子数是左侧是指的二进制码 计算海明码, 是否是奇数,计算方式是表格中列中为1的值 ``` a1=X3⊕X5⊕X7⊕X9⊕X11=1⊕0⊕1⊕0⊕1=1 a2=X3⊕X6⊕X7⊕X10⊕X11=1⊕0⊕1⊕1⊕1=0 a3=X5⊕X6⊕X7=0⊕0⊕1=1 a4=X9⊕X10⊕X11=0⊕1⊕1=0 ``` 得到新的11位数为10110010011 **海明码纠错** 如果接收端收到的数据10110110011,接收方需要先计算校验位的值,计算的值再和数据中的校验位进行异或比较 监督公式如下 ``` h1=X3⊕X5⊕X7⊕X9⊕X11⊕a1=X3⊕X5⊕X7⊕X9⊕X11⊕X1 h2=X3⊕X6⊕X7⊕X10⊕X11⊕a=X3⊕X6⊕X7⊕X10⊕X11⊕X2 h3=X5⊕X6⊕X7⊕a3=X5⊕X6⊕X7⊕X3 h4=X9⊕X10⊕X11⊕a4=X9⊕X10⊕X11⊕X4 ``` 计算的本意是接收端重新计算一次校验码,然后和数据中校验码进行比较。如果自己计算的校验码和数据中的校验码相同,记为0,不同则记为1 计算结果按照 `$ h_{4} h_{3} h_{2} h_{1} $`的顺序进行排列,如果结果等于0说明数据没有出错;如果结果不等于0,说明数据出错,把该数据转 化为10进制数,就是出错数据的位置,因为二进制数中每一位置只有2种状态,0或者1。因此知道错误的位置后,改正错误就非常简单,把对应的数据取反即可 ### 循环冗余校验码 CRC 是把数据看作一个二进制多项式,通过“模一个固定多项式”来计算出一个校验码,用于发现数据是否被篡改或损坏。 - 只能检测错误,**不能纠正**。 - 比奇偶校验和简单的校验和算法更强大,能检测到突发错误(如多个连续比特翻转)。 - 算法简单、硬件实现容易,常用在以太网、USB、文件压缩、磁盘校验等地方。 | CRC 名称 | 多项式(十六进制) | 用途 | | ---------- | ------------ | -------------------- | | CRC-4 | `0x07` | SMBus,ATM头部 | | CRC-8 | `0x07` | SMBus,ATM头部 | | CRC-16-IBM | `0x8005` | Modbus,XMODEM | | CRC-32 | `0x04C11DB7` | Ethernet,ZIP文件,PNG图片 | **示例** ### 举个简单例子(CRC-4) 假设: * 数据:`10111` * 生成 CRC-4多项式:`10011`(对应多项式:x⁴ + x + 1=`$ 1x^{4} +0x^{3} +0x^{2} +1x^{1} +1 $`=10011) **步骤如下:** 1. **数据末尾补零:** 补零的个数 = 生成多项式的位数 - 1 = 4 所以补 4 个 0,数据变成:`101110000` 2. **进行模2除法(异或运算):** 用 `10011` 去“除”上面的数据(本质上是异或) 3. **最终得到的余数就是 CRC 校验码,。** 结果为 1100 ![](https://img.kancloud.cn/d3/92/d39222ee82815b6f8857aa63a64c6613_452x372.png) **注意**: 余数必须比除数少且只少一位,不够就前面补0 4. **将余数添加到原始数据末尾,一起发送。** 接收端也用相同的方式做除法,如果最后余数为 0,则数据无误;否则说明有错误。 ## 指令 ### 顺序方式 各条机器指令之间顺序串行地执行,执行完一条指令后才取下一条指令。缺点是速度慢,机器各部件利用率低。 ### 重叠方式 在解释第K条指令的操作完成之前就可以开始解释第K+1条指令。 ### 指令流水技术 指令步骤的并行、提高处理器执行指令的效率。假设使用流水线将指令流的处理过程划分为取指、分析、执行三个并行处理的过程段。在这个流水线中,处理器有三个操作部件,同时对这三条指令进行加工,加快了程序的执行速度。几乎所有的高性能计算机都采用了指令流水线。 ![](https://img.kancloud.cn/e5/8f/e58fc4b04667abef03e9abee224ec43c_885x245.png) **流水线的周期** 为取指、分析、执行三段中**最长的一端**当中流水线的周期即`$ \triangle t $` 理论公式(考试重点) `$ (t1+t2+...+tk)+(n-1)*\triangle t $` 实践公式 `$ (k+n-1)+(n-1)*\triangle t $` **示例** 例如:若流水线把一条指令分为取指、分析和执行三个部分,三部分的时间分别是取指2ns,分析2ns,执行1ns。那么流水线周期是多少?100条指令全部执行完毕需要的时间是多少? **那么流水线周期是多少:** 解:取最大的时间,即2ns **100条指令全部执行完毕需要的时间是多少?** 解: 根据理论公式`t1...tk`为 `(2+2+1)`三段一共为5ns,然后在加上`(100-1)`等于99 乘以流水线周期为2ns,一共为203 ### 流水线的吞吐率和最大吞吐率 **流水线的吞吐率和最大吞吐率**:吞吐率是指单位内流水线处理机流出的结果数。对指令而言,就是单位时间内执行的指令数。 吞吐率: `$ TP=\frac{指令条数}{流水线执行时间} $` 最大吞吐率 `$ TP_{max} =\frac{1}{\triangle t} $` 流水线加速比:`$ S=\frac{不使用流水线的时间}{使用流水线执行时间} $`,不使用流水线时间就是顺讯执行指令的时间 ## 高速缓冲存储器 是为了解决:解决CPU和主存之间的速度差异,避免CPU“空等”现象。 局部性原理: - **时间局部性** 是指如果一个数据(或程序指令)在某一时刻被访问过,那么在不久的将来,它可能会再次被访问。换句话说,程序在某个时间点访问的数据可能会在短时间内再次被访问。如CPU 缓存和for等循环的优化 - **空间局部性** 是指如果程序访问了某个存储位置,那么它可能会访问该存储位置附近的数据。例如,当一个数据项被访问时,紧邻的内存地址的数据也很可能会在接下来的操作中被访问。如数组访问和内存页的访问当读取数组或内存页时,会提前把附近的数据缓存 ### cache 映射方法 - 直接映射 - 直接映像方式的优点是地址变换很简单,如何Cache 中的第0页就是主存中的第0页,依此类处, - 缺点是不灵活,**块冲突率高**。 - 全相联映射 - 主存中的任何一页都可以映射到Cache中的任何一页 - 位置不受限制,十分灵活。其主要缺点是无法从主存块号中直接获得 Cachel的块号,变换比较复杂,速度比较慢。 - 组相联映像 - 距离CPU较近位置可以采用直接映像或者组相联映像距离CPU较远的可以采用全相联映像 ### cache 性能 **读Cache** CPU在访问内存时,首先判断所要访问的内容是否在Cache中,如果在,就称为"命中”,此时CPU直接从Cache中调用该内容;否则,就称为“不命中”,CPU只好去内存中调用所需的子程序或指令了。 如果以`Hc`为代表对Cache的访问命中率,`tc`为Cache的存取时间,`tm`为主存的访问时间,则Cache的平均访问时间ta为 `ta=Hctc+(1-Hc)tm`,即命中的时间+不明中的时间 <br/> **写Cache** 因为Cache的内容是部分主存内容的副本,应该与主存内容保持一致。而CPU对cache的写入更改了cache内容,如何与主存内容保持一致就有几种写操作工作方式可供选择,统称为**写策略**。 1. 写回法(write-back) 当CPU对cache写命中时,只修改cache的内容不立即写入主存,只当此行被换出时才写回主存。这种策略使cache在CPU-主存之间,不仅在读方向而且在写方向上都起到高速缓存作用。 2. 写直达法 又称全写法,写透。是当cache写命中时,cache与主存同时发生写修改。 3. 标记法 数据进入Cachel后,有效位置1,当cpu对该数据修改时,数据只写入主存并将该有效位置0。要从cache中读取数据时要测试其有效位,若为1则直接从cache中取数,否则从主存中取数。 ### Cache 替换算法 1. 随机算法 这是最简单的替换算法。随机法完全不管Cache块过去、现在及将来的使用情况,简单地根据一个随机数,选择一块替换掉。 2. 先进先出(First In and First Out,FIFO)算法 按调入Cache的先后决定淘汰的顺序,即在需要更新时,将最先进入Cache的块作为被替换的块。这种方法要求为每块做一记录,记下它们进入Cache的先后次序。这种方法容易实现,而且系统开销小。其缺点是可能会把一些需要经常使用的程序块(如循环程序)替换掉。 3. 近期最少使用(Least Recently Used,LRU)算法 LRU算法是把 CPU近期最少使用的块作为被替换的块。这种替换方法需要随时记录Cache中各块的使用情况,以便确定哪个块是近期最少使用的块。LRU算法相对合理但实现起来比较复杂,系统开销较大。通常需要对每一块设置一个称为“年龄计数器”的硬件或软件计数器,用以记录其被使用的情况。 4. 最不经常使用页置换(Least Frequently Used,LFU)算法 要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。LFU的复杂度以及计数器规模都L比LRU大,LRU只关注近期访问情况,而LFU会统计累计访问次数作为淘汰的依据。该算法计数器位数多,实现困难 ## 磁盘存储器 常用的外存有磁带存储器、硬盘存储器、磁盘阵列和光盘存储器。 **磁盘存储器** ![](https://img.kancloud.cn/39/1a/391af93657271e7e130396db3a0450ff_405x472.png) 其中:n为保存数据的总记录面数, t为每面磁道数,S为每道的扇区数, b为每个扇区存储的字节数。硬盘存取时间: 存储容量=`n×t×s×b` 硬盘存取时间=`寻道时间+等待时间+读/写时间其中读/写时间`可忽略不计,平均寻道时间+平均等待时间 ## 指令系统 Flynn 分类 根据指令流和数据流的多倍性特分类 1. 指令流:指机器执行的指令序列: 2. 数据流:指由指令流调用的数据序列,包括输入数据和中间结果,但不包括输出数据。 分成四类 1. **单指令流单数据流** (Single Instruction stream and Single Datastream,SISD):SISD其实就是传统的顺序执行的单处理器计算机,其指令部件每次只对一条指令进行译码,并只对一个操作部件分配数据。 2. **单指令流多数据流** (Single Instruction stream and Multiple Data stream,SIMD):SIMD以并行处理机(矩阵处理机)为代表,并行处理机包括多个重复的处理单元,由单一指令部件控制,按照同一指令流要求为它们分配各自所需的不同数据。 3. **多指令流单数据流** (Multiple Instruction stream and Single Data stream,MISD):MISD具有n个处理单元,按n条不同指令的要求对同一数据流及其中间结果进行不同的处理。一个处理单元的输出又作为另一个处理单元的输入。这类系统实际上很少见到。 4. **多指令流多数据流** (Multiple Instruction stream and Multiple Data stream,MIMD):MIMD是指能实现作业、任务、指令等各级全面并行的多机系统。如多核处理器、多处理机属于MIMD。 ### 复杂指令 复杂指令系统CISC的特点 1. 指令数量众多。指令系统拥有大量的指令,通常有100~250条。 2. 指令使用频率相差悬殊。最常使用的是一些比较简单的指令,仅占指令总数的20%,但在程序中出现的频率却占80%。而大部分复杂指令却很少使用。 3. 支持很多种寻址方式。支持的寻址方式通常为5~20种。 4. 变长的指令。指令长度不是固定的,变长的指令增加指令译码电路的复杂性 5. 指令可以对主存单元中的数据直接进行处理。典型的CISC通常都有指令能够直接对主存单元中的数据进行处理,其执行速度较慢。 6. 以微程序控制为主。CISC的指令系统很复杂,难以用硬布线逻辑(组合逻辑)电路实现控制器,通常采用微程序控制。 ### 简单指令集 1. 指令数量少。优先选取使用频率最高的一些简单指令和一些常用指令,避免使用复杂指令。只提供了LOAD(从存储器中读数)和STORE(把数据写入存储器)两条指令对存储器操作,其余所有的操作都在CPU的寄存器之间进行。 2. 指令的寻址方式少。通常只支持寄存器寻址方式、立即数寻址方式和相对寻址方式。 3. 指令长度固定,指令格式种类少。因为RISC指令数量少、格式少 相对简单,其指令长度固定,指令之间各字段的划分比较一致,译码相对容易 4. 以硬布线逻辑控制为主。为了提高操作的执行速度,通常采用硬布线逻辑(组合逻辑)来构建控制器。 5. 单周期指令执行,采用流水线技术。因为简化了指令系统,很容易利用流水线技术,使得大部分指令都能在一个机器周期内完成。少数指令可能会需要多周期,例如,LOAD/STORE指令因为需要访问存储器,其执行时间就会长一些。 6. 优化的编译器:RISC的精简指令集使编译工作简单化。因为指令长度固定、格式少、寻址方式少,编译时不必在具有相似功能的许多指令中进行选择,也不必为寻址方式的选择而费心,同时易于实现优化,从而可以生成效率执行的机器代码。 7. CPU中的通用寄存器数量多,一般在32个以上,有的可达上干 ## 磁盘阵列 创建类型 * **RAID 0(条带化)** * **特点**:数据分割后并行写入多个磁盘,提升读写速度,无冗余。 * **优点**:性能高,适合需要快速读写的场景(如视频编辑)。 * **缺点**:一个磁盘故障,数据全损,适合非关键数据存储。 * **适用场景**:高性能需求,无需数据保护。 * **RAID 1(镜像)** * **特点**:数据同时写入两个或多个磁盘,互为镜像,提供冗余。 * **优点**:高可靠性,一个磁盘故障不影响数据。 * **缺点**:存储效率低(仅50%),成本高。 * **适用场景**:关键数据存储,如数据库或服务器。 * **RAID 5(分布式奇偶校验)** * **特点**:数据和奇偶校验信息分布在至少三个磁盘上,允许一个磁盘故障。 * **优点**:兼顾性能和冗余,存储效率较高。 * **缺点**:重建数据耗时,写入性能稍低于RAID 0。,磁盘容量 N-1 * **适用场景**:企业存储、中小型服务器。 * **RAID 6(双奇偶校验)** * **特点**:类似RAID 5,但有两个奇偶校验,可容忍两个磁盘故障。 * **优点**:更高冗余,适合大型存储系统。 * **缺点**:需要至少四个磁盘,写入性能略低。磁盘容量 N-2 * **适用场景**:高可靠性需求的大型存储。 * **RAID 10(RAID 1+RAID 0,镜像+条带化)** * **特点**:结合RAID 1和RAID 0,先镜像再条带化,需至少四个磁盘。 * **优点**:高性能和高冗余,适合高负载环境。磁盘容量 N/2 * **缺点**:成本高,存储效率仅50%。 * **适用场景**:高性能、高可靠需求的场景,如数据库服务器。 * **RAID 50(5+0)** * **特点**:结合RAID 5和RAID 0,多个RAID 5阵列组成条带化。 * **优点**:比RAID 5性能更高,允许单个RAID 5组内磁盘故障。 * **缺点**:需要更多磁盘,成本较高。 * **适用场景**:需要性能和冗余平衡的大型存储。 ## 死锁 最少资源计算 `最少资源数\=进程数×(每个进程的最大资源需求−1)+1` 理解 - 为了 **避免死锁**,不单单是看资源数量,**还需要避免循环等待**,即通过合理的资源分配策略确保 **至少一个进程能够完成并释放资源**。这就涉及到一种更安全的策略:**保证系统能够安全地分配资源**,而不是简单地计算资源数量 因为要至少保证一个进程能获得他需要的资源,所在需要加这1个