嗨玩手游网

内存溢出和内存泄露的区别

内存溢出和内存泄露都是与内存管理相关的问题,但它们之间存在明显的区别:

1、概念不同:

内存溢出(Memory Overflow)是指程序试图使用超过其分配的内存空间,这通常是由于程序没有正确地管理其内存使用。例如,如果程序试图创建一个比可用内存大的数组,那么就会出现内存溢出。

内存泄露(Memory Leak)是指程序在使用完内存后未正确地释放它,这导致内存被占用,即使程序不再需要它。这通常是由于程序中的错误引用管理,例如,当一个对象不再需要时,如果仍有对象引用它,那么这个对象就不能被垃圾回收器回收,从而造成内存泄露。

2、造成的原因不同:

内存溢出通常是由于一次性加载过多的数据到内存中,例如,一次性读取整个大型数据库或大文件到内存中,而可用的内存不足以容纳这些数据。

内存泄露则通常是由于程序中的对象被创建后,其引用没有被正确释放。例如,在一个循环中创建了大量的对象,并且在循环结束后,这些对象仍然被引用并保持活跃状态,导致它们不能被垃圾回收器正确回收。

3、后果不同:

内存溢出会导致程序无法获取所需的内存而中断或崩溃,因为操作系统无法为程序提供更多的内存。

内存泄露的后果是程序占用的内存会逐渐增加,直到可用内存耗尽。这可能导致程序的运行速度变慢,因为程序需要花费更多的时间来处理和分配内存。此外,如果程序持续创建新的对象并且不释放旧对象,那么可用的内存将会耗尽,从而导致程序崩溃。

4、处理方法不同:

内存溢出的处理方法通常是通过优化程序的数据结构和算法,例如,分批读取数据或文件,而不是一次性读取所有数据。此外,还可以通过增加系统的内存容量来解决内存溢出问题。

内存泄露的处理方法通常是通过优化程序的代码来管理内存。例如,确保在不再需要对象时释放引用,使用弱引用或软引用等。此外,还可以使用垃圾回收器来自动回收不再使用的对象。

一次元数据空间内存溢出的排查记录

在应用中,我们使用的 SpringData ES的 ElasticsearchRestTemplate来做查询,使用方式不对,导致每次ES查询时都新实例化了一个查询对象,会加载相关类到元数据中。最终长时间运行后元数据出现内存溢出;

问题原因:类加载过多,导致元数据OOM。非类实例多或者大对象问题;

排查方式:

查看JVM运行情况,发现元数据满导致内存溢出;导出内存快照,通过OQL快速定位肇事者;排查对应类的使用场景和加载场景(重点序列化反射场景);

起源

06-15 下午正摩肩擦掌的备战着晚上8点。收到预发机器的一个GC次数报警。

【警告】UMP JVM监控【警告】异步(async采集点:async.jvm(别名:jvm监控)15:42:40至15:42:50【xx.xx.xx(10174422426)(未知分组)】,JVM监控FullGC次数=2次[偏差0%],超过1次FullGC次数>=2次【时间】2023-06-15 15:42:50【类型】UMP JVM监控

第一时间诧异了下。该应用主要作用是接MQ消息和定时任务,同时任务和MQ都和线上做了隔离,也没有收到大流量的告警。

先看了下对应JVM监控:

只看上面都怀疑是监控异常(之前用文件采集的时候有遇到过,看CPU确实有波动。但堆基本无涨幅,怀疑非堆。)

问题排查定位分析

既然怀疑非堆,我们先通过 jstat来看看情况

S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 0.00 0.89 3.67 97.49 97.96 854 23.720 958 615.300 639.020 0.00 0.00 0.89 3.67 97.49 97.96 854 23.720 958 615.300 639.020 0.00 0.00 0.89 3.67 97.49 97.96 854 23.720 958 615.300 639.020 0.00 0.00 0.89 3.67 97.49 97.96 854 23.720 958 615.300 639.020 0.00 0.00 0.89 3.67 97.49 97.96 854 23.720 958 615.300 639.020

M列代表了metaspace的使用率,当前已经 97.49% 进一步印证了我们的猜测。

接下来通过 jmap 导出内存快照分析。这里我习惯使用 Visual VM 进行分析。

在这里我们看到有 118588 个类被加载了。正常业务下不会有这么多类。

这里我们走了很多弯路。

首先查看内存对象,根据类的实例数排了个序,试图看看是否是某个或某些类实例过多导致。

这里一般是排查堆异常时使用,可以看大对象和某类的实例数,但我们的问题是类加载过多。非类实例对象多或者大。这里排除。

后续还尝试了直接使用 Visual VM 的聚合按包路径统计,同时排序。收效都甚微。看不出啥异常来。

这里我们使用 OQL 来进行查询统计。

语句如下:

var packageClassSizeMap = {};// 遍历统计以最后一个逗号做分割heap.forEachClass(function (it) { var packageName = it.substring(0, itstIndexOf('.')); if (packageClassSizeMap[packageName] != null) { packageClassSizeMap[packageName] = packageClassSizeMap[packageName] + 1; } else { packageClassSizeMap[packageName] = 1; }});// 排序 因为Visual VM的查询有数量限制。var sortPackageClassSizeMap = [];map(sort(Object.keys(packageClassSizeMap), function (a, b) { return packageClassSizeMap[b] - packageClassSizeMap[a]}), function (it) { sortPackageClassSizeMap.push({ package: it, classSize: packageClassSizeMap[it] })});sortPackageClassSizeMap;

执行效果如下:

可以看到,com.jd.bapp.match.sync.query.es.po 下存在 92172 个类。这个包下,不到20个类。这时我们在回到开始查看类的地方。看看该路径下都是些什么类。

这里附带一提,直接根据路径获取对应的类数量:

var packageClassSizeMap = {};// 遍历统计以最后一个逗号做分割heap.forEachClass(function (it) { var packageName = it.substring(0, itstIndexOf('.')); // 加路径过滤版 if (packageNamedexOf('com.jd.bapp.match.sync.query.es.po')){ if (packageClassSizeMap[packageName] != null) { packageClassSizeMap[packageName] = packageClassSizeMap[packageName] + 1; } else { packageClassSizeMap[packageName] = 1; } }});sortPackageClassSizeMap;

查询 com.jd.bapp.match.sync.query.es.po 路径下的classes

我们可以看到:

每个ES的Po对象存在大量类加载,在后面有拼接Instantiator_xxxxx部分类有实例,部分类无实例。(count为实例数)

从上面得到的信息得出是ES相关查询时出现的。我们本地debug查询跟踪下。

抽丝剥茧

这里列下主要排查流程

在应用中,我们使用的 SpringData ES的 ElasticsearchRestTemplate来做查询,主要使用方法 org.springframework.data.elasticsearchre.ElasticsearchRestTemplate#search

重点代码如下:

public <T> SearchHits<T> search(Query query, Class<T> clazz, IndexCoordinates index) { // 初始化request SearchRequest searchRequest = requestFactory.searchRequest(query, clazz, index); // 获取值 SearchResponse response = execute(client -> client.search(searchRequest, RequestOptions.DEFAULT)); SearchDocumentResponseCallback<SearchHits<T>> callback = new ReadSearchDocumentResponseCallback<>(clazz, index); // 转换为对应类型 return callback.doWith(SearchDocumentResponse.from(response));}加载

首先看初始化request的逻辑

org.springframework.data.elasticsearchre.RequestFactory#searchRequest首先是: org.springframework.data.elasticsearchre.RequestFactory#prepareSearchRequest这里有段代码是对搜索结果的排序处理: prepareSort(query, sourceBuilder, getPersistentEntity(clazz)); 重点就是这里的 getPersistentEntity(clazz)这段代码主要会识别当前类是否已经加载过,没有加载过则加载到内存中:@Nullable private ElasticsearchPersistentEntity<?> getPersistentEntity(@Nullable Class<?> clazz) { // 从convert上下文中获取判断该类是否已经加载过,如果没有加载过,就会重新解析加载并放入上下文 return clazz != null ? elasticsearchConverter.getMappingContext().getPersistentEntity(clazz) : null; }

具体加载的实现见: 具体实现见:org.springframework.data.mappingntext.AbstractMappingContext#getPersistentEntity(org.springframework.data.util.TypeInformation<?>)

/* * (non-Javadoc) * @see org.springframework.data.mapping.model.MappingContext#getPersistentEntity(org.springframework.data.util.TypeInformation) */@Nullable@Overridepublic E getPersistentEntity(TypeInformation<?> type) {Assert.notNull(type, "Type must not be null!");try {read.lock();// 从上下文获取当前类Optional<E> entity = persistentEntities.get(type);// 存在则返回if (entity != null) {return entity.orElse(null);}} finally {read.unlock();}if (!shouldCreatePersistentEntityFor(type)) {try {write.lock();persistentEntities.put(type, NONE);} finally {write.unlock();}return null;}if (strict) {throw new MappingException("Unknown persistent entity " + type);}// 不存在时,添加该类型到上下文return addPersistentEntity(type).orElse(null);}使用

上述是加载流程。执行查询后,我们还需要进行一次转换。这里就到了使用的地方:org.springframework.data.elasticsearchre.ElasticsearchRestTemplate#search中 callback.doWith(SearchDocumentResponse.from(response));

这里这个方请求内部的 doWith 方法。实现如下:

@Nullablepublic T doWith(@Nullable Document document) { if (document == null) { return null; } // 获取到待转换的类实例 T entity = reader.read(type, document); return maybeCallbackAfterConvert(entity, document, index);}

其中的 reader.read 会先从上下文中获取上述加载到上下文的类信息,然后读取

@Overridepublic <R> R read(Class<R> type, Document source) {TypeInformation<R> typeHint = ClassTypeInformation.from((Class<R>) ClassUtils.getUserClass(type));typeHint = (TypeInformation<R>) typeMapper.readType(source, typeHint);if (conversions.hasCustomReadTarget(Map.class, typeHint.getType())) {R converted = conversionServicenvert(source, typeHint.getType());if (converted == null) {// EntityReader.read is defined as non nullable , so we cannot return nullthrow new ConversionException("conversion service to type " + typeHint.getType().getName() + " returned null");}return converted;}if (typeHint.isMap() || ClassTypeInformation.OBJECT.equals(typeHint)) {return (R) source;}// 从上下文获取之前加载的类ElasticsearchPersistentEntity<?> entity = mappingContext.getRequiredPersistentEntity(typeHint);// 获取该类信息return readEntity(entity, source);}

读取会走 org.springframework.data.elasticsearchrenvert.MappingElasticsearchConverter#readEntity

先是读取该类的初始化器:EntityInstantiator instantiator = instantiators.getInstantiatorFor(targetEntity);

是通过该类实现:org.springframework.datanvert.KotlinClassGeneratingEntityInstantiator#createInstance然后到:org.springframework.data.mapping.model.ClassGeneratingEntityInstantiator#doCreateEntityInstantiator

/* * (non-Javadoc) * @see org.springframework.datanvert.ClassGeneratingEntityInstantiator#doCreateEntityInstantiator(org.springframework.data.mapping.PersistentEntity) */@Overrideprotected EntityInstantiator doCreateEntityInstantiator(PersistentEntity<?, ?> entity) {PreferredConstructor<?, ?> constructor = entity.getPersistenceConstructor();if (ReflectionUtils.isSupportedKotlinClass(entity.getType()) && constructor != null) {PreferredConstructor<?, ?> defaultConstructor = new DefaultingKotlinConstructorResolver(entity).getDefaultConstructor();if (defaultConstructor != null) {// 获取对象初始化器ObjectInstantiator instantiator = createObjectInstantiator(entity, defaultConstructor);return new DefaultingKotlinClassInstantiatorAdapter(instantiator, constructor);}}return super.doCreateEntityInstantiator(entity);}

这里先请求内部的:createObjectInstantiator

/** * Creates a dynamically generated {@link ObjectInstantiator} for the given {@link PersistentEntity} and * {@link PreferredConstructor}. There will always be exactly one {@link ObjectInstantiator} instance per * {@link PersistentEntity}. * * @param entity * @param constructor * @return */ObjectInstantiator createObjectInstantiator(PersistentEntity<?, ?> entity,@Nullable PreferredConstructor<?, ?> constructor) {try {// 调用生成return (ObjectInstantiator) this.generator.generateCustomInstantiatorClass(entity, constructor).newInstance();} catch (Exception e) {throw new RuntimeException(e);}}

获取对象生成实例:generateCustomInstantiatorClass 这里获取类名称,会追加 _Instantiator_和对应类的 hashCode

/** * Generate a new class for the given {@link PersistentEntity}. * * @param entity * @param constructor * @return */public Class<?> generateCustomInstantiatorClass(PersistentEntity<?, ?> entity,@Nullable PreferredConstructor<?, ?> constructor) {// 获取类名称String className = generateClassName(entity);byte[] bytecode = generateBytecode(className, entity, constructor);Class<?> type = entity.getType();try {return ReflectUtils.defineClass(className, bytecode, type.getClassLoader(), type.getProtectionDomain(), type);} catch (Exception e) {throw new IllegalStateException(e);}}private static final String TAG = "_Instantiator_";/** * @param entity * @return */private String generateClassName(PersistentEntity<?, ?> entity) {// 类名+TAG+hashCodereturn entity.getType().getName() + TAG + Integer.toString(entity.hashCode(), 36);}

到此我们元数据中的一堆 拼接了 Instantiator_xxxxx 的类来源就破案了。

真相大白

对应问题产生的问题也很简单。

// 每次search前 都new了个RestTemplate,导致上下文发生变化,每次重新生成加载new ElasticsearchRestTemplate(cluster);

这里我们是双集群模式,每次请求时会由负载决定使用那一个集群。之前在这里每次都 new了一个待使用集群的实例。

内部的上下文每次初始化后都是空的。

请求查询ES初始化ES查询上下文为空加载类信息(hashCode发生变化)获取类信息(重计算类名)重新加载类到元数据

最终长时间运行后元数据空间溢出;

事后结论

1.当时的临时方案是重启应用,元数据区清空,同时临时也可以放大元数据区大小。

2.元数据区的类型卸载或回收,8以后已经不使用了。

3.元数据区的泄漏排查思路:找到加载多的类,然后排查使用情况和可能的加载场景,一般在各种序列化反射场景。

4.快速排查可使用我们的方案。使用OQL来完成。

5.监控可以考虑加载类实例监控和元数据空间使用大小监控和对应报警。可以提前发现和处理。

6.ES查询在启动时对应集群内部初始化一个查询实例。使用那个集群就使用对应的集群查询实例。

附录

VisualVM下载地址:https://visualvm.github.io/

OQL: Object Query Language 可参看在VisualVM中使用OQL分析

获取路径下类加载数量,从高到低排序

var packageClassSizeMap = {};// 遍历统计以最后一个逗号做分割heap.forEachClass(function (it) { var packageName = it.substring(0, itstIndexOf('.')); if (packageClassSizeMap[packageName] != null) { packageClassSizeMap[packageName] = packageClassSizeMap[packageName] + 1; } else { packageClassSizeMap[packageName] = 1; }});// 排序 因为Visual VM的查询有数量限制。var sortPackageClassSizeMap = [];map(sort(Object.keys(packageClassSizeMap), function (a, b) { return packageClassSizeMap[b] - packageClassSizeMap[a]}), function (it) { sortPackageClassSizeMap.push({ package: it, classSize: packageClassSizeMap[it] })});sortPackageClassSizeMap;

获取某个路径下类加载数量

var packageClassSizeMap = {};// 遍历统计以最后一个逗号做分割heap.forEachClass(function (it) { var packageName = it.substring(0, itstIndexOf('.')); // 加路径过滤版 if (packageNamedexOf('com.jd.bapp.match.sync.query.es.po')){ if (packageClassSizeMap[packageName] != null) { packageClassSizeMap[packageName] = packageClassSizeMap[packageName] + 1; } else { packageClassSizeMap[packageName] = 1; } }});sortPackageClassSizeMap;特别鸣谢

感谢黄仕清和Jdos同学提供的技术支持。

作者:京东零售 王建波

来源:京东云开发者社区

计算机原理

计算机原理

【课程代码:02384】

内部资料 免费交流

- 1 -

第一章 计算机系统概论

知识点 1.电子计算机从总体上来说可以分为两大类:电子模拟计算机和电子数字计算机。

知识点 2.发展的应用需求:提高计算能力(计算速度和精度等)和提高计算的可用性(方便性等)。

知识点 3.两个方面推进:计算机体系结构的进步和元器件技术的进步。

知识点 4.计算机发展经历的三个阶段:①手工计算阶段;②机械计算阶段;③电子计算阶段。

知识点 5.一个完整的计算机系统包含硬件和软件两大部分。

硬件是指组成计算机的所有器件或装置的总称,它们是"看得见、摸得着"的有形设备。

软件是相对硬件而言的,是指在计算机硬件上运行的各种程序以及有关的文档资料。

知识点 6.冯·诺依曼首次提出了以二进制和存储程序控制为核心的通用电子数字计算机体系结构原

理,从而奠定了当代通用电子计算机体系结构的基础。

▲冯·诺依曼思想体制主要包括:

(1)采用二进制数字代码形式表示各种信息。

(2)用存储程序控制工作方式。

(3)计算机硬件由运算器、控制器、存储器、输入设备和输出设备组成。

知识点 7.存储器是用来存放程序和数据的部件。

存储单元:由若干个存储元组成,每个存储单元都有唯一的地址。

知识点 9.运算器和控制器统称为中央处理机(CPU);

CPU 和内部存储器一起称为主机。

知识点 10.主机内的存储器称为内部存储器或简称内存,位于主机之外的存储器称为外部存储器或

简称外存,外存和输入、输出设备一起又统称为外部设备或简称外设。

知识点 11.计算机工作时,有两股信息在流动:一股是控制信息,一股是数据信息。

知识点 12.计算机通过总线将五大部件连接起来,总线是它们之间相互传递信息的公共通路。

知识点 13.总线包括数据总线、地址总线和控制总线,传输的分别为数据信息、地址信息、控制信

息。

知识点 14.▲计算机系统的层次结构:

(1)数字逻辑层。(2)微程序设计层。(3)机器语言层。

(4)操作系统层。(5)汇编语言层。 (6)高级语言层。

知识点 15.▲计算机的基本性能衡量指标:

(1)机器字长。字长是指计算机的运算部件能同时处理的二进制数据的位数。字长不但决定

着寄存器、加法器、数据总线等部件的位数,直接影响着硬件的代价,而且还决定了计算机的运算

精度。

(2)内存容量。一个内存所能存储的全部信息量称为内存容量。容量单位:TB>GB>MB>KB>B,

相邻两单位间的进制都是 1024(210)。

内部资料 免费交流

- 2 -

(3)运算速度。它是用每秒能执行的指令条数来表示的,单位一般用 MIPS(Million Instructions

Per Second,每秒百万条指令)表示。

第二章 数字逻辑基础

知识点 1.基本的逻辑关系有"与"、"或"和"非"三种逻辑关系。

知识点 2.逻辑关系真值表。

A B Y=AB Y=A+B Y=A0 0 0 0 10 1 0 1 11 0 0 1 01 1 1 1 0

知识点 3.常用复合逻辑运算的真值表。

A B Y=A B Y=A B Y=A B0 0 1 1 1

0 1 1 0 0

1 0 1 0 0

1 1 0 0 1

知识点 5.逻辑门符号

逻辑"与" 逻辑"或" 逻辑"非" 与非 或非 异或非

知识点 6.逻辑代数的运算法则

(1)关于变量与常量的关系:A+0=A,A+1=A,A+A=1,A ・ 0=0,A ・ 1=A,A ・A=0

(2)重复律:A ・ A=A,A+A=A

(3)吸收律:A+A ・ B=A,A(A+B)=A

(4)分配律:A(B+C)=A ・ B+A ・ C,(A+B)・ C=(A+B)・(A+C)

(5)交换律:A+B=B+A,AB=BA

(6)结合律:(A+B)+C=A+(B+C),(A ・ B)・ C=A ・(B ・ C)

(7)反演律:A B C ...=A B C ...      ,  CBACBA知识点 7.数字系统的逻辑电路两大类:组合逻辑电路和时序逻辑电路。

知识点 8.常用的组合逻辑电路:全加器、译码器和数据选择器。

知识点 9.全加器:Ci+1=AiBi+(Ai⨁Bi)Ci Si = Ai⨁Bi+Ci全加器真值表

输入 输出

(被加数)Ai (加数)Bi (低位进位)Ci (本位和)Si (本位进位)Ci+1

00

0 0 0 00 1 1 0

0 1 0 1 00 1 1 0 1

内部资料 免费交流

- 3 -

1 0 0 1 01 0 1 0 11 1 0 0 11 1 1 1 1

知识点 10.数据选择器又称多路开关其作用是在选择信号的作用下,从多个输入通道中选择一个通

道的数据作为输出。它的作用相当于一个具有多个输入端的单刀多掷开关。

4 选 1 数据选择器有 4个数据输入端 X0~ X3 和 1 个输出端 Y,A、B 为 2 个数据选择输入端。

逻辑表达式为:

Y=X0BA+X1BA+X2BA+X3BA知识点 11.触发器是时序逻辑电路能够储存信息的记忆元件。

知识点 12.▲时序逻辑电路有何特点?

逻辑电路中的输出状态不但与当时的输入状态有关,而且还与电路以前的输入状态有关,这种

逻辑电路称为时序逻辑电路。因此,时序逻辑电路中必须要有能够储存信息的记忆元件——触发器。

触发器也是构成各种复杂时序逻辑电路的基本部件。

计算机中常用的时序逻辑电路:寄存器和计数器。

知识点 13.触发器按时钟控制方式分,有电位触发、边沿触发、主从触发等;按功能来分,有 RS 型、

D 型、JK 型等触发器。

知识点 14.RS 触发器有两个输出端 Q 和Q,两个信号输入端R 、S。

▲工作原理

S R 触发器状态

0 0 不确定

0 1 "1"状态

1 0 "0"状态

1 1 保持原来的状态

知识点 15.D 触发器只有一个数据 D(Data)输入端,CLK 为边沿触发方式,上升沿有效(简记为

"↑")。

知识点 16.计数器的分类

(1)按构成计数器的触发器的翻转次序分类,可分为异步计数器和同步计数器。

(2)按计数过程中计数器中数字的增减来分类,可分为加法计数器、减法计数器和可逆计数

器(加减计数器)。

(3)按计数器中数字的编码方式来分类,可分为二进制计数器和十进制计数器。

知识点 17.双向移位寄存器 74LS194 的具体逻辑功能如下:

(1)异步清零:当 MR=0 时。

(2)同步并行置数:MR=1、S1=1、S0=1。

(3)移位功能:

MR=1、S1=0、S0=1 时,左移一位。

MR=1、S1=1、S0=0 时,右移一位。

内部资料 免费交流

- 4 -

(4)保持功能:MR=1、S1=0、S0=0。

第三章 计算机中的信息表示

知识点 1.在计算机中,信息可分为两大类:数据信息和控制(指令)信息。

知识点 2.十进制主要用于计算机的输入输出,实现人机交互;二进制是计算机内部所采用的数制;

十六进制目的是为了方便书写或显示二进制数,被看成是二进制数的缩写形式。

知识点 3.一个数无论采用何种进位制表示,都包含两个基本要素:基数与位权。

基数:任何一种计数制允许选用的基本数字符号的个数。

位权:一个数字符号所表示的数值就等于该数字乘以一个与它所在数位有关的常数。

知识点 4.▲二进制数的特点:(1)容易实现(2)工作可靠(3)运算简单(4)便于逻辑运算与逻

辑设计。

知识点 5.进位计数制之间的转换

(1)十进制数转换成二进制数。整数用"除 2 取余",小数用"乘 2 取整"的方法。转换后的小

数部分有误差,一般转换到所要求的精度为止。

(2)十六进制数转换为二进制数。不论是十六进制数的整数部分或小数部分,只要把每一位十六

进制数用等值的四位二进制数代替即可。

(3)二进制数转换成十六进制数。整数部分由小数点向左每四位一组,小数部分由小数点向右每

四位一组,不足四位的补 0,然后用四位二进制数的等值十六进制数代替即可。

知识点 6.进制后缀:H——十六进制、B——二进制、D——十进制、O或 Q——八进制。

知识点 7.n 位的无符号数的表示范围是 0~(2n-1)。

知识点 8.机器数又有三种不同的编码:原码、反码和补码。

知识点 9.原码表示法,其最高位为符号位,符号位:"0"——正数,"1"——负数。数值位部分

与真值相同。

原码"0":[+0]原=00000000;[-0]原=10000000(设字长=8 位)。

对于 8 位原码表示的数值范围为:-127~+127。

知识点 10.反码编码规则如下:

①对于正数:[ ] [ ]X X反 原 (X≥0)。

②对于负数,除符号位仍为"1"外,其余各数值位是"按位取反"。

③反码的"0"也有两种表示形式:[ ]0 反 00000000;[ ]0 反 =11111111

④对于 8 位反码表示的数值范围为-127~+127。

知识点 11.补码表示法:[ ]X 补 M+X(mod M)

补码编码规则如下:

①对于正数的补码与原码相同。

②对于负数(字长=8 位),除符号位仍为"1"外,其余各数值位"按位取反,末位加 1"。

内部资料 免费交流

- 5 -

③补码的"0"只有一种表示形式:[ ] [ ] 000000000 0  补 补④对于 8 位补码表示的数值范围为+127~-128。

知识点 12.由真值、原码转换为补码

原码转换为补码:

当 X 为正数时,[ ] [ ] XX X 补 原

当 X 为负数时,[ ]X 补等于把[ ]X 原 除去符号位外的各位求反后再末位加"1"。

知识点 13.若假设字长为 n位,其中最高位是符号位,表示范围如下:

原码定点小数 1-2-(n-1)~-(1-2-(n-1))

定点整数 2n-1~-(2n-1-1)

补码定点小数 -1~+(1-2-n)

定点整数 -2n-1~+(2n-1-1)

知识点 14.浮点数 n由阶码 E和尾数 M两部分组成,任意一个二进制数据 n都可以表示为:

2EN M  若假设某计算机中浮点数的尾数为 n+1 位,阶码为 m+1 位,则浮点数的取值范围为:

     2 1 2 12 2 1 2 2m m

n nN      ≤ ≤

知识点 15.计算机能够直接对十进制数进行运算。这时就要用到二进制编码的十进制数,简称 BCD

码。最自然、最简单的一种形式是 8421BCD 码,即 4 位二进制数的权从左往右分别为 8、4、2、1。

知识点 16.世界上最通用的编码方案是 ASCII(美国信息互换标准代码)。

知识点 17.▲汉字的编码有输入码、内码、字形码三种形式。

用计算机进行汉字信息处理,首先必须将汉字代码化,即对汉字进行编码,称为汉字输入码。

汉字输入码送入计算机后还必须转换成汉字内部码才能进行信息处理,处理完毕之后再把汉字内部

码转换成汉字字形码,才能在显示器或打印机输出。

知识点 18.汉字的输入码分为三类:数字编码、拼音码和字形编码。

知识点 19.汉字的内码汉字内码是用于汉字信息的存储、交换检索等操作的机内代码,一般采用两

个字节表示。

知识点 20.汉字字形码是存储在计算机内的汉字在屏幕上显示或在打印机上输出时,需要知道汉字

的字形信息,汉字内码并不能直接反映汉字的字形,而要采用专门的字形码。

知识点 21.语音是一种模拟信号,和位图图像处理类似,必须经过采样、量化等模/数转换处理。

知识点 23.▲通常的数据校验方法是在每个字上添加一些校验位,用来确定字中出现错误的位置。

最简单且应用广泛的检错码是采用一位校验位的奇偶校验。奇偶校验提供奇数个错误检测,但

是无法检测偶数个错误,更无法识别错误信息的位置。

知识点 24.指令格式:一条机器指令的基本格式:

操作码 OP 地址码 D

知识点 25.

指令格式类型 特点

内部资料 免费交流

- 6 -

零地址指令(又称为无操作数指令) 只有操作码,没有操作数

一地址指令(又称为单操作数指令)①操作数既是操作数的地址,又是操作结果的存储地址;

②给出一个操作数,而另一个操作数隐含在 CPU 的某个寄存器中。

二地址指令(又称为双操作数指令)

参与操作的两个操作数地址,分别为源地址 D2 和目的地址 D1。操

作结果存入目的地址 D1 所指定的单元,而 D1 单元中原来的值被

冲掉。

三地址指令(又称为三操作数指令)指明参与操作的三个操作数地址 D1、D2和 D3,操作结束后,D2、

D3中的内容均未被破坏;缺点是加大了取指令时间。

知识点 26.在双操作数指令中,从操作数的物理位置来说,又可分为三种类型:

①寄存器——寄存器(RR)型指令。

②存储器——存储器(SS)型指令。

③寄存器——存储器(RS)型指令。

知识点 27.指令字:每一条机器指令都是一串二进制代码来表示的,称为指令字。

指令的长度:一条指令中所包含的二进制代码的位数。

知识点 28.▲指令系统设计上两种相反的趋势:

○1 采用可变长指令字结构,让指令功能尽可能丰富,称之为复杂指令系统计算机(CISC);

○2 采用定长指令字结构,只选取简单、常用的指令,称之为精简指令系统计算机(RISC)。

知识点 29.寻址方式:指令中以什么方式提供操作数或操作数地址。

知识点 30.

常见寻址方式 指令格式(举例) 含义

立即寻址 MOVAL,26H; 将立即数 26H传送到 AL 寄存器中。

寄存器寻址 MOV BL,DL; 将 DL 寄存器中的内容传送到 BL寄存器中。

直接寻址(绝对寻址方式) MOVAL,[2050H];将 2050H 作为操作数的地址,从 2050H 号存

储单元中取出操作数传送到 AL寄存器中。

寄存器间接寻址 MOVAH,[BX];

将 BX 寄存器中的内容作为操作数的有效地

址,从该地址指定的存储单元中取出操作数传

送到 AH 寄存器中。

存储器间接寻址 —— ——

变址寻址 MOV CL,[SI+2050H];

将变址寄存器 SI 中的内容加形式地址 2050H

之后的结果作为操作数的有效地址 EA,从该

地址指定的存储单元中取出操作数传送到 CL

寄存器中。

相对寻址 —— ——

基址寻址 —— ——

第四章 运算方法及运算器

内部资料 免费交流

- 7 -

知识点 1.运算器是计算机中加工与处理数据的功能部件。由算术逻辑单元(ALU)、累加器、通用

寄存器、状态字寄存器等组成。

知识点 2.运算器的基本功能是实现算术运算和逻辑运算。

知识点 3.采用补码做加、减法运算原因:补码加、减法运算规则最简单,实现起来也最方便。

知识点 4.补码加法:     =X Y X Y 补 补 补

补码减法:         X Y X Y X Y     补 补 补 补 补

 Y补是 Y

补连同符号位在内一起"求反加 1"得到。   Y Y  

补 补

知识点 5.

若两个有符号数进行加、减法运算的结果超出给定的取值范围,结果无法表示时,称之为溢出。

两个符号相异相加不会产生溢出,两个符号相同的数相加时才有可能产生溢出。

知识点 6.▲

进位检测方法符号位的进位⨁最高数值位的进位=1,则溢出

符号位的进位⨁最高数值位的进位=0,则没有溢出

变形补码检测方法符号位的代码为 01,表示运算结果"正溢"。

符号位的代码为 10,表示运算结果"负溢"。

知识点 7.提高加法器运算速度方法:采用超前进位并行技术。

知识点 8.在原码一位乘法中,乘积的符号位为被乘数和乘数符号位异或。

知识点 9.▲补码一位乘法运算规则如下:

(1)运算的数均以补码表示,符号位参与运算。

(2)为了避免中间结果溢出,被乘数、部分积取双符号位参加运算,部分积初值为 0。

(3)乘数可取单符号位,以决定最后一步是否需要校正,即是否要加减 X补。

(4)乘数末位增设附加位 1ny  ,且初值为 0。

(5)按表中所列规则进行操作。

补码一位乘法操作规则

ny (高位) 1ny  (低位) 操作0 0 部分积右移一位

0 1 部分积加 X 补 ,右移一位1 0 部分积加 X 补 ,右移一位1 1 部分积右移一位

(6)按照上述操作规则重复 n+1 次操作,但第 n+1 次操作不再移位。

知识点 10.▲原码除法运算规则

恢复余数法 不恢复余数法(加/减交替法)

①被除数和除数均取绝对值参加运算,符号位单独处理。为了避免溢出,要求 0<|被除数|≤|除数|。

②被除数减除数得余数。

③如果余数为正,表示够减,上商"1",然后 ③如果余数为正,表示够减,上商"qi=1",

内部资料 免费交流

- 8 -

余数左移一位,减去除数得新余数;如果余数

为负,表示不够减,上商"0",加除数,以恢

复原来的余数,然后余数左移一位,减去除数

得新余数。

余数左移一位,减去除数得新余数;如果余数

为负,表示不够减,上商"qi=0",余数左移

一位,加除数得到新余数。

④重复第③步一直到 n 位商时,计算结束。

④重复第③步 n 次。

⑤当第 n 步余数为负时需加上除数,以恢复正

确的余数 rn,最后的余数 R=2-nrn(余数与被除

数取同号)。

知识点 11.补码不恢复余数法运算规则:

 X补

与 Y补

第一步操作  ir 补 与 Y 补 上商 下一步操作

同号  X补- Y

同号(够减) 1      1 2i ir r Y  补 补 补异号(不够减) 0      1 2i ir r Y  补 补 补

异号  X补+ Y

同号(不够减) 1      1 2i ir r Y  补 补 补异号(够减) 0      1 2i ir r Y  补 补 补

知识点 12.为了减少内部数据传送线和便于控制,通常将一些寄存器之间数据传送的通路加以归并,

组成总线结构,使不同来源的信息在此传输线上分时传送。

知识点 13.总线:就是一个或多个信息源传送信息到多个目的的数据通路,它是多个部件之间传送

信息的一组公用传输线。

知识点 14.总线分类:

分类根据 类别

位置 内部总线和外部总线

逻辑结构 单向总线和双向总线

知识点 15.运算器三种总线结构:

总线类型 优缺点

单总线结构运算器 实现一次双操作数的运算需要分三步,操作速度慢,但控制简单,实现较容易。

双总线结构运算器 实现一次双操作数的运算需要分二步,操作速度比单总线快,但要设置一缓冲寄存器。

三总线结构运算器 实现一次双操作数的运算只需要一步,操作速度快,但控制复杂。

第五章 中央处理器

知识点 1.CPU 基本功能:

(1)程序控制。(2)操作控制。(3)时间控制。(4)数据加工。

知识点 2.传统的 CPU 由运算器和控制器两部分组成。

现代 CPU 主要由运算器、控制器和 Cache三大部分组成。

知识点 3.▲控制器组成:

①程序计数器 PC。②指令寄存器 IR。③指令译码器 ID。④微命令发生器 OC。⑤时序信号产

生器。

内部资料 免费交流

- 9 -

知识点 4.控制器的基本功能:(1)取指令。(2)分析指令。(3)执行指令。

知识点 5.CPU 中的寄存器:(1)通用寄存器

(2)专用寄存器

①程序计数器:在程序开始执行前,必须将程序的第一条指令所在的存储单元地址送入 PC。

②指令寄存器:用于暂存从存储器取出的当前指令码。

③状态字寄存器:用来存放程序状态字(PSW)。程序状态字用于记录现行程序的运行状态和

机器的工作方式。

④存储器地址寄存器 MAR 与存储器数据寄存器 MDR

 存储器地址寄存器用来保存当前 CPU所要访问的内存单元或 I/O设备的地址。由于内存和 CPU

之间存在着操作速度上的差异,所以必须使用地址寄存器来保持地址信息,直到内存读/写操作

完成为止。

 存储器数据寄存器用来暂时存放 CPU 与存储器或 I/O 设备之间待传送的数据。

知识点 6.CPU 要完成某一指令的功能,就要使信息在各寄存器之间流动。通常把各寄存器之间信息

流动的通路,称为"数据通路"。

知识点 7.CPU 组成:

寄存器 用来保存各类数据信息或运行状态信息

算术逻辑单元 用于进行算数运算与逻辑运算

指令寄存器 保存 CPU 正在执行的指令;算术逻辑单元实现对数据的加工,进行算术运算和逻辑运算

微命令发生器 产生各类操作控制信号,以便在各寄存器之间建立数据通路和控制整个计算机的操作

时序信号产生器 对各类操作控制信号进行定时,以便进行时间上的约束组成

知识点 8.CPU 取出一条指令并分析、执行该指令,都要完成一系列的操作,完成这一系列操作所需

要的时间称为一个指令周期。

知识点 9.许多计算机系统常常按照指令执行时 CPU 访问内存的次数来确定该指令周期中含 CPU 周

期的数量,并以存储周期为基础来规定 CPU 周期(总线周期)。

知识点 10.常用 5条指令的指令含义

指令助记符 操作描述与说明

MOV Rd,Rs; 传送指令,把源寄存器 Rs 中的数据传送给目的寄存器 Rd,即(Rs)→Rd

LAD Rd,[X]; 取数指令,从内存 X 号单元中取数给目的寄存器 Rd,即(X)→Rd

ADD Rd,Rs; 加法指令,执行(Rs)+(Rd)→Rd

STA [X],Rs; 存数指令,把 Rs 中的数据存入为地址为 X 的内存单元,即(Rs)→X

AND Rd,Rs; 逻辑与指令,执行(Rs)(Rd)→Rd

JC X; 条件转移指令,如果标志 CF=1(有进位),则转移到地址 X 去执行,即 X→PC

JMP X; 无条件转移指令,下一条指令转移到地址 X 去执行,即 X→PC

知识点 11.当计算机运行时,在计算机的各部件之间有指令和数据不断地流动,从而形成了指令流

和数据流。

知识点 12.各指令所对应的 CPU 周期数

内部资料 免费交流

- 10 -

指令 CPU 周期

MOV 2

LAD 3

ADD 2

STA 4

JMP 2

知识点 13.在计算机设计时,通常采用方框图(或称为寄存器传送级)语言来描述一条指令的指令

周期。

知识点 14.计算机时序信号最基本的体制是"节拍电位与时钟脉冲"体制。

知识点 15.在组合逻辑控制器中,时序信号往往采用 CPU 周期、节拍电位与时钟脉冲三级体制。在

微程序控制器中,一般采用节拍电位与时钟脉冲的两级体制。

知识点 16.▲我们把计算机的"微操作与时序信号"之间的关系,在时间控制上如何安排微操作,

用怎样的时序方式来形成微操作序列称为时序控制方式。

知识点 15.▲按照同步或非同步的关系,可将时序控制方式分为三类:

同步控制方式优点

时序关系简单,时序划分规整,控制不复杂,控制部件在结构上易于集中,

设计方便等。

缺点 在时间的安排上不合理,对时间的利用不经济(时间的利用率不高)。

异步控制方式

优点能按不同部件、不同设备的实际需要分配时间,没有时间上的浪费,时间

安排紧凑、合理,提高了机器的工作效率。

缺点

由于没有统一的基准时钟信号,而是由各功能部件自己产生各自的时序信

号自我控制,因而要求各个部件都要有"应答电路"(故又称为分散控制

方式或局部控制方式),控制比较复杂。

联合控制方式 —— ——

知识点 17.控制函数一般包含有两个意义:一是指出该微操作在什么条件下进行,也就是在哪些指

令、哪些操作时进行该种微操作,即逻辑条件;二是指出在什么时间进行。

知识点 18.

寄存器传送语言的基本符号

符号 含义 例子

大写字母与数字 寄存器名 A,MBR,B

下标 某寄存器的一位 A2,B3

括号() 寄存器的一部分 MBR(AD),A(0~4)

冒号: 控制函数结果 P:

箭头→ 信息传送的方向 A→B

逗号, 区分同时进行的微操作 A→B,C→A

内部寄存器微操作

符号 说明

A→B B 中的内容传送到寄存器 A

MDR(AD)→MAR MDR寄存器中地址部分 AD 传送到 MAR

常数→A 常数传送到寄存器 A

内部资料 免费交流

- 11 -

R2→BUS R2 寄存器的内容送到总线 BUS

BUS→R4 总线 BUS 的内容送到 R4寄存器

M(AD)→MDR 存储器中 AD 地址单元中的内容传送到MDR

MDR→M(AD) MDR 中的内容写入内存储器 AD 地址单元中

算术逻辑操作

符号 说明

A+B→A A、B 中内容的相加结果送至 A

A-1→A A中的内容减"1"

0→F 清零

1→F 置"1"

A B→A A、B 中的内容逻辑与结果送至 A

A B→A A、B 中的内容逻辑或结果送至 A

A㊉B→A A、B 中的内容逻辑异或结果送至 A

知识点 19.▲控制器的基本组成:(1)指令部件。(2)时序信号发生器。(3)微命令发生器。(4)

中断控制逻辑。(5)操作控制台。

知识点 20.▲CPU 设计步骤:(1)拟定指令系统。(2)确定总体结构。(3)安排时序。(4)拟

定指令操作流程和微命令序列。(5)形成控制逻辑。

知识点 21.微程序控制优点:规整性、灵活性、可维护性及便于自动化设计等

知识点 22.基本术语

微命令 是控制计算机各部件完成某个基本操作的命令,它是构成控制序列的最小单位。

微操作 微操作是由执行部件接受微命令后所进行的最基本的操作。

微指令 微指令是一组实现一定操作功能的微命令的组合,通常用二进制编码表示。

微地址 存放微指令的控制存储器的单元地址就称为微地址。

微周期 微周期是指从控制存储器中读取一条微指令并执行相应的操作步骤所需的时间。

微程序 微程序是一系列微指令的有序集合,每一条机器指令都对应一个微程序。

知识点 23.微程序控制器的基本组成:①控制存储器 CM。控制存储器是微程序控制器的核心部件,

用来存放全部机器指令的微程序,而微程序是由硬件设计者所编制的。②微指令寄存器μIR。③微

地址寄存器μAR 。④微地址形成电路。

知识点 24.自计算机诞生至今,人们追求的目标之一是很高的运算速度,因此并行处理技术便成为

计算机发展的主流。

知识点 25.(1)完成指令时间计算:

①流水方式:[(子过程数-1)+指令条数]×每个子过程所需时间

特点:上一条指令的子过程在时间上可以重叠执行,当流水线满载时,每一个 CPU 周期都可

以输出一个结果。

②非流水方式:子过程数×每个子过程所需时间×指令条数

特点:上一条指令的子过程全部执行完毕之后才能开始下一条,每隔 4 个周期才有一个输出结

果。

内部资料 免费交流

- 12 -

(2)流水线中的主要问题:①资源相关冲突;②数据相关冲突;③控制相关冲突。

知识点 26.MMX 是一种多媒体扩展结构技术,它极大提高了计算机在多媒体和通信应用方面的功

能。

第六章 存储器与存储系统

知识点 1.存储器分类

分类标准 分类

存储介质

半导体存储器

磁表面存储器

光材料存储器

存取方式

随机存取存储器(RAM)

顺序存取存储器

直接存取存储器

只读存储器(ROM)

信息的可保护性易失性存储器

非易失性存储器

所处位置及功能内部存储器

外部存储器

知识点 2.易失性存储器。断电后信息即消失的存储器(静态的 RAM)。

非易失性存储器。断电后仍能保存信息的存储器(ROM)。

知识点 3.存储器系统访问速度:高速缓冲存储器>主存储器>外存储器。

知识点 4.两个存储层次:Cache/主存层次(Cache 存储系统)

主存/外存层次(虚拟存储系统)

知识点 5.Cache 存储系统是为了解决 CPU 和主存之间速度的不匹配而提出来的。

知识点 6.主存的性能指标主要有:存储容量、存取时间、存储周期和存储器带宽。

芯片容量例:有 11 根地址引脚(A0~A10),8 根数据线(D0~D7),其存储容量为 211=2048=2K

个存储单元;每个单元存储 8 位二进制数,即该芯片的容量为 2K×8bit。

知识点 7.

随机存取存储器(RAM)静态随机存取存储器(SRAM)

动态随机存取存储器(DRAM)

知识点 8.基本存储元:一个基本存储元能够存储 1 位二进制信息,能够读出和写入。

知识点 9.▲当 CPU 对存储器进行读/写时,其过程主要分为以下三步:

①由地址总线给地址信号;

②通过控制总线发出相应的读操作信号或写操作信号;

内部资料 免费交流

- 13 -

③在数据总线上实现数据传送。因此,CPU 与存储器的连接也要实现对应的三类信号的连接,

即地址线的连接、控制线的连接、数据线的连接。

知识点 10.存储器容量扩展:芯片数=总容量÷芯片容量

例:要求总容量为 64K × 8bit

字扩展(地址线) 位扩展(数据线)

字位同时扩展:总芯片数为:(N/L)×(M/K)或(N/M)×(L/K)。

知识点 11.片选:选择存储芯片;字选:选芯片内部某一存储单元。

知识点 12.片选信号的产生方法主要有三种:线选法、全译码法和部分译码法。

全译码法把除片内寻址外的全部高位地址线都作为地址译码器的输入,译码器的输出作为各芯

片的片选信号。

知识点 14.只读存储器根据编程方法的不同,ROM 通常分为以下几类:

①掩模式 ROM。

②一次编程 ROM(PROM)。

③多次可编程 ROM:光擦除编程只读存储器(EPROM)、电擦除编程只读存储器(EEPROM)。

④闪速存储器(FlashEEPROM)。

知识点 15.由于闪速存储器具有随机存取(读写)的特点,又具有 EEPROM 高密度性、非易失性的

特性。

知识点 16.

高速存储器 特点

双端口存储器

1.具有两个端口。

2.有两组数据总线、地址总线和控制总线。

3.可以通过两个端口同时对存储器进行读/写操作,以提高存储器的存取速度。

多模块交叉存储器1.连续地址分布在相邻的不同模块内,同一个模块内的地址都是不连续的。

2.对连续字的成块传送可实现多模块并行存取,大大提高了存储器的带宽。

相联存储器

1.相联存储器是按内容访问的。

2.在 Cache中,相联存储器用于存放在 Cache中的主存单元的地址。

3.在虚拟存储器中,相联存储器用于存放段表、页表和快表等。

知识点 17.▲程序局部性原理

当 CPU 从主存中取出指令和数据时,在一个较短的时间间隔内,由程序产生的地址往往局限

在主存空间的某个很小的区域内。这种对局部范围的存储器地址频繁访问,而对此范围以外的地址

甚少访问的现象,称为程序访问的局部性。

适用于:Cache 和虚拟存储器的实现。

知识点 18.CPU 与 Cache 之间的数据交换是以字为单位,而 Cache 与主存之间的数据交换则是以块

为单位。

知识点 19.三种基本的地址映射方法。

直接映射 直接映射的 Cache组织主存中每一个块只能映射到某一固定的 Cache 块中。

内部资料 免费交流

- 14 -

特点:地址映射速度快,硬件简单,成本低;但是不够灵活,Cache存储空间

的利用率低。

全相联映射主存中任何一块都可以映射到 Cache中的任何一块。

特点:比较灵活,其硬件复杂、成本高、实现困难。

组相联映射

这时主存和Cache都被分组,主存中每个组内的块数与 Cache中的分组数相同,

组间采用直接映射,组内采用全相联映射。

特点:判断的速度较快,硬件较简单,成本较低,实现起来也比较容易。

知识点 20.Cache命中率:

Nc——Cache完成存取总次数;Nm——主存完成存取总次数。

tc——命中 Cache时的访问时间;tm——命中主存时的访问时间]。

命中率:h=Nc÷(Nc+Nm)

平均访问时间:ta=h×tc+tm×(1-h)

访问效率:e=tc/ta

知识点 21.替换算法的问题:采用全相联映射或组相联映射方法组织 Cache 时,当一个新的主存块

需要复制到 Cache 中,而 Cache 的可用位置已被占满。

替换方式:①最不经常使用(LFU)算法。②近期最少使用(LRU)算法。③随机替换。

知识点 22.虚拟存储器不仅解决了存储容量大、存取速度快和成本低三种需求之间的矛盾,而且也

是一种有效的存储体系管理方式。

知识点 23.▲Cache 和虚拟存储器异同点:Cache/主存的控制完全由硬件实现,所以对各类程序员是

透明的;而虚拟存储器的控制是软、硬件相结合的,对于设计存储管理软件的系统程序员来说是不

透明的,对于应用程序员来说是透明的。

知识点 24.以页为基本单位的虚拟存储器叫页式虚拟存储器。

主存储器容量→物理地址 页表长度=虚存容量/页面大小。

虚拟容量→虚拟地址 实地址大小=主存储器容量/页面大小

知识点 25.虚存与实存之间信息调度以页为基本传送单位。每个程序有一张段表,每段对应有一张

页表。

第七章 输入输出系统

知识点 1.输入输出系统是执行计算机主机与外界之间信息交换任务的软件和硬件的总称,简称 I/O

(Input/Output)系统。

知识点 2.▲什么是接口?I/O 接口是 CPU 同 I/O 设备之间实现数据传送的中间环节(部件)用以解

决两者之间的速度匹配,数据格式转换和电信号等问题。一个完整的接口不仅包含一些硬件电路,

还包括相关的软件驱动程序模块。

知识点 3.接口的分类:

数据传送方式 串行接口

内部资料 免费交流

- 15 -

并行接口

功能选择的灵活性可编程接口

不可编程接口

通用性通用接口

专用接口

按输入/输出的信号数字接口

模拟接口

输入/输出的控制方式

程序直接控制方式接口

程序中断控制方式接口

直接存储器存取(DMA)方式接口

通道控制方式接口

知识点 4.数据传送方式指的是外设和接口一侧的传送方式,而在主机和接口一侧,数据总是并行传

送的。

知识点 5.在并行接口中,外设和接口间的传送宽度是一个字(或字节)的所有位。在串行接口中,

外设和接口间的数据是逐位串行传送的,一次传输的信息量小,只需一根数据线。

知识点 6.▲可编程接口与不可编程接口的特点:

可编程接口的功能及操作方式是由程序来改变或选择的,因此,在不改动硬件的情况下,只修

改相应的驱动程序就可以改变接口的工作方式,使一块接口芯片可以执行多种不同的功能,并使得

同一种接口电路能与多种类型外设连接,从而大大地增加了接口的灵活性和扩充性。

不可编程接口不能由程序来改变其功能,只能用硬连线逻辑来实现不同的功能。

知识点 7.模/数转换器——输入是模拟信号,输出数字信号。

数/模转换器——输入是数字信号,输出模拟信号。

知识点 8.I/O 接口的基本功能:

(1)设备选择功能。(2)数据缓冲功能。(3)具有接收、解释并执行 CPU 命令的功能。(4)

联络功能。(5)中断管理功能。(6)可编程功能。

知识点 9.CPU 与 I/O 设备之间通过接换的信息主要有

 数据信息是 CPU 和外设交换的基本信息。

 状态信息用来标志外设或接口当前所处的工作状态。

 控制信息是 CPU 通过接口对 I/O 设备发出的控制信息或管理命令。

状态信息和控制信息也被看成是一种广义的"数据"信息,即把状态信息视为输入数据,而把

控制信息视为输出数据。

知识点 10.I/O 端口有两种编址方式:

统一编址方式优点:CPU不必设置专门的 I/O 指令,使用存储器操作指令。

缺点:使存储器的地址空间减小;执行 I/O操作的时间较长;程序可读性差。

独立编址方式优点:I/O端口地址不占用存储器地址空间,执行速度较快。程序可读性强。

缺点:输入/输出的灵活性较差。

知识点 11.▲CPU 与外部设备之间的联络问题

内部资料 免费交流

- 16 -

在输入/输出过程中,我们最关心的问题是 I/O 设备的速度能否和 CPU 相匹配,即输入/输出时

采用何种机制实现 CPU 与外设之间的时序配合问题,又称为 CPU 与外设之间的联络问题(或定时

问题),主要包括:

(1)何时 I/O 设备输入数据"准备就绪"(可以通知 CPU 取走数据了)。

(2)何时 CPU 输入完数据(可以通知 I/O 设备输入下一个要交换的数据了)。

(3)何时 CPU 输出数据完毕(输出缓冲寄存器满,可以通知 I/O 设备取走数据了)。

(4)何时数据"输出缓冲寄存器空"(可以通知 CPU 输出数据了)。

知识点 12.直接控制 I/O 方式:利用程序的直接控制实现 CPU 与外设之间的数据交换。输入/输出过

程完全处于 CPU 指令控制下,即外设的有关操作都要由 CPU 指令直接指定。

知识点 13.▲采用程序直接控制,外设与 CPU 的数据传送有两种方式。

①无条件传送方式(同步传送方式)

在无条件传送方式中,CPU 可以完全不管外设的状态如何。I/O 端口总是准备好接收 CPU 的输

出数据,或总是准备好向 CPU 输入数据。CPU 无需查询外设的工作状态,而默认外设始终处于"准

备就绪"状态。在 CPU 认为需要时,随时可直接利用 I/O 指令访问相应的 I/O 端口,实现 CPU 与

外设之间的数据交换。

②程序查询传送方式

CPU 在程序中查询外设的工作状态。如果外设尚未准备"就绪",CPU 只能循环等待。只有当

外设已经做好准备,CPU 才能执行 IN/OUT 指令进行数据传送,这就是程序查询传送方式。

知识点 14.▲什么是中断控制方式?当 CPU 接收到请求信号后,要决定是否响应。若条件允许响应,

则 CPU 中止现行程序的运行,转去执行中断服务程序,为中断请求者服务,在中断服务程序中完

成一次主机与外设之间的数据传送,传送完成后 CPU 再返回原来被中断的程序继续执行,这便是

中断控制方式。

知识点 15.中断的分类:

内中断 ——

外中断不可屏蔽中断(优先级别较高)

可屏蔽中断

向量中断 入口地址是直接由硬件提供

非向量中断 入口地址是 CPU执行程序,用查询方式来确定

硬件中断 通过中断请求信号形成向量地址

软件中断 由中断指令提供中断号再转换为向量地址

程序中断 当 CPU 在响应中断请求后,通过执行一段中断服务程序来处理更紧迫的任务

简单中断简单中断是一种外设与主存之间直接进行信息交换的方法,即 DMA 方式,这种"中断"

不去执行中断服务程序,故不破坏现行程序的状态。

知识点 16.中断排队(中断判优):根据中断源的重要性、紧迫性把中断源分成若干等级,以便排

出一个处理顺序,让最重要、最紧迫的中断优先处理。

知识点 17.中断嵌套高级别中断可以使低级别中断过程再中断,称为中断嵌套。

内部资料 免费交流

- 17 -

知识点 18.CPU 响应中断必须同时满足三个条件:有中断请求信号;CPU 允许接受中断请求;当前

一条指令执行完毕,这是 CPU 响应中断请求的时间限制条件,以保证现行程序执行的完整性。

知识点 19.▲什么是 DMA?

所谓 DMA 方式,是在外设与主存之间开辟一条"直接数据传送通道",在不需要 CPU 干预也

不需要软件介入的情况下,在两者之间进行高速数据传送的一种方式。在这种方式中,对数据传送

过程进行控制的硬件称为 DMA 控制器(DMAC)。在 DMAC 的控制下,数据不经过 CPU 而直接

在主存和外设之间传送,从而提高了 CPU 与外设交换数据的速度和效率。

知识点 20.DMA 传送方式传送的数据单位是数据块。

知识点 21.DMA 传送过程可分为传送前预处理、数据传送和传送后处理三个阶段。

知识点 22.输入/输出处理机通常称作外围处理机(PPU),是通道方式的进一步发展。它基本上独

立于主机工作。

知识点 23.五种数据传送方式特点:

无条件传送方式 设计简单,传送时可靠性差,常用于同步传送系统和开放式传送系统中;

查询方式传送方式 可靠性很高、但 CPU的使用效率很低,常用在任务比较单一的系统中;

DMA 方式传送方式可靠性和效率都很高,但硬件电路复杂、开销较大,常用于传送速度高,数据量

很大的系统中;

数据的通道或外围处理机方式既能控制低速外设,又能控制高速外设,兼有程序控制输入输出功能和 DMA 控

制器的高速数据传送功能,主要用于大型计算机系统的输入输出。

知识点 24.常用输入设备有:键盘、鼠标、条码、磁卡、IC 卡阅读器、扫描仪、多媒体输入设备。

知识点 25.显示设备的分类

按显示设备所使用的显示器件分类,有阴极射线管(CRT)显示器、液晶显示器(LCD)、等

离子显示器和 LED(发光二极管)显示器等。

按所显示的信息内容分类,分为字符显示器、图形显示器和图像显示器三种。

知识点 26.▲显示器与终端的区别:

显示器功能简单,只能用于接收视频信号,显示器的控制逻辑和存储逻辑都在主机的接口板中。

终端是由显示器和键盘组成的一套独立完整的输入输出设备,它可以通过标准的通信接口与远方的

主机相连。终端的接口远比显示器复杂。

知识点 27.常见的微机显示标准:①分辨率。分辨率是指显示设备所能表示的像素个数,像素越密,

分辨率越高,图像越清晰。②颜色或灰度级。目前一般采用 16位或 24位表示一个像素,能够表示

65536 或 16777216级灰度或颜色。③刷新频率。

知识点 28.打印机

针式打印机 是一种点阵打印设备,打印速度慢、噪音大,质量不高

喷墨打印机喷墨打印机也属于点阵式打印机,是非击打式打印机。有体积小巧、分辨率高、速度快、

噪音低、可打印彩像等优点。

激光打印机 激光打印机速度快、分辨率高。

第一章 计算机系统概论第二章 数字逻辑基础第三章 计算机中的信息表示第四章 运算方法及运算器第五章 中央处理器第六章 存储器与存储系统第七章 输入输出系统
更多攻略
游戏推荐
更多+