【计组】DMA、数据完整性--《深入浅出计算机组成原理》(十三)

news2024/9/23 5:34:28

目录

一、DMA

(一)理解DMA,一个协处理器

(二) Kafka 的实现原理

二、数据的完整性

(一)单比特翻转:软件解决不了的硬件错误

(二)海明码

1、海明码的纠错原理

2、海明距离


一、DMA

无论 I/O 速度如何提升,比起 CPU,总还是太慢。如果对 I/O 的操作,都是由 CPU 发出对应的指令,然后等待 I/O 设备完成操作之后返回,那 CPU 有大量的时间都是在等待 I/O 设备完成操作。

然而对 I/O 设备的大量操作,其实都只是把内存里面的数据,传输到 I/O 设备而已。在这种情况下, CPU 只是在傻等。特别是当传输的数据量比较大的时候,比如进行大文件复制,如果所有数据都要经过 CPU,实在是有点儿太浪费时间了。

因此,计算机工程师们,就发明了 DMA 技术,也就是直接内存访问(Direct Memory Access)技术,来减少 CPU 等待的时间。

(一)理解DMA,一个协处理器

DMA 技术本质上就是在主板上放一块独立的芯片。在进行内存和 I/O 设备的数据传输的时候,不再通过 CPU 来控制数据传输,而直接通过 DMA 控制器(DMA Controller,简称 DMAC)。这块芯片,我们可以认为它其实就是一个协处理器(Co-Processor),协助”CPU,完成对应的数据传输工作。

DMAC 最有价值的应用是,要传输的数据特别大、速度特别快,或者传输的数据特别小、速度特别慢的时候。

比如说,用千兆网卡或者硬盘传输大量数据的时候,如果都用 CPU 来搬运的话,肯定忙不过来,所以可以选择 DMAC。而当数据传输很慢的时候,DMAC 可以等数据到齐了,再发送信号,给到 CPU 去处理,而不是让 CPU 在那里忙等待。

DMAC 是一个特殊的 I/O 设备,它和 CPU 以及其他 I/O 设备一样,通过连接到总线来进行实际的数据传输。总线上的设备有两种:一种是主设备(Master),另外一种,是从设备(Slave)

想要主动发起数据传输,必须要是一个主设备才可以,CPU 就是主设备。从设备(比如硬盘)只能接受数据传输。所以,如果通过 CPU 来传输数据,要么是 CPU 从 I/O 设备读数据,要么是 CPU 向 I/O 设备写数据。

 I/O 设备可以向主设备发起请求,不过发送的不是数据内容,而是控制信号。I/O 设备可以告诉 CPU,我这里有数据要传输给你,但是实际数据是 CPU 拉走的,而不是 I/O 设备推给 CPU 的。

DMAC 就不一样了,对 CPU 来说,它是一个从设备;对于硬盘这样的 IO 设备来说,它又变成了一个主设备。那使用 DMAC 进行数据传输的过程究竟是什么样的呢?

1、CPU 作为一个主设备,向 DMAC 设备发起请求,其实就是在 DMAC 里面修改配置寄存器。

2、CPU 修改 DMAC 的配置的时候,会告诉 DMAC 这样几个信息:

  • 源地址的初始值以及传输时候的地址增减方式(大的地址向小的地址传输,还是从小的地址往大的地址传输)。
  • 目标地址初始值和传输时候的地址增减方式。
  • 要传输的数据长度。

3、设置完信息,DMAC 变成一个空闲的状态(Idle)。

4、如果要从硬盘上往内存里加载数据,硬盘就会向 DMAC 发起一个数据传输请求。这个请求不是通过总线,而是通过一个额外的连线。

5.  DMAC 需要再通过一个额外的连线响应申请。

6、DMAC芯片,向硬盘的接口发起要总线读的传输请求。数据硬盘里面,读到了 DMAC 的控制器里面。

7、DMAC向内存发起总线写的数据传输请求,把数据写入到内存里面。

8、DMAC 反复进行上面第 6、7 步的操作,直到 DMAC 的寄存器里面设置的数据长度传输完成。

9、 数据传输完成之后,DMAC 重新回到第 3 步的空闲状态。

整个数据传输的过程中,不是通过 CPU 来搬运数据,而是由 DMAC 这个芯片来搬运数据。但是 CPU 在这个过程中也是必不可少的。因为传输什么数据,从哪里传输到哪里,其实还是由 CPU 来设置的。所以,DMAC 被叫作“协处理器”。

最早,计算机里是没有 DMAC 的,所有数据都是由 CPU 来搬运的。随着人们数据传输的需求越来越大,先是出现了主板上独立的 DMAC 控制器。到了今天,各种 I/O 设备越来越多,数据传输的需求越来越复杂,使用的场景各不相同。加之显示器、网卡、硬盘对于数据传输的需求都不一样,所以各个设备里面都有自己的 DMAC 芯片了。

(二) Kafka 的实现原理

 Kafka是一个用来处理实时数据的管道,我们常常用它来做一个消息队列,或者用来收集和落地海量的日志。作为一个处理实时数据和日志的管道,瓶颈自然也在 I/O 层面。Kafka很好地利用了 DMA 的数据传输方式,通过 DMA 的方式实现了非常大的性能提升。

Kafka 里面会有两种常见的海量数据传输的情况:一种是从网络中接收上游的数据,然后需要落地到本地的磁盘上,确保数据不丢失。另一种是从本地磁盘上读取出来,通过网络发送出去。

从磁盘读数据发送到网络上去,最直观的办法自然是用一个文件读操作,从磁盘上把数据读到内存里面来,然后再用一个 Socket,把这些数据发送到网络上去。这个过程中,数据一共发生了四次传输。其中两次是 DMA 的传输,另外两次,则是通过 CPU 控制的传输。

  • 第一次传输,从硬盘上读到操作系统内核的缓冲区里。通过 DMA 搬运的。
  • 第二次传输,把内核缓冲区里面的数据复制到应用分配的内存里面。通过 CPU 搬运的。
  • 第三次传输,从应用的内存里写到操作系统的 Socket 的缓冲区里面去。是由 CPU 搬运的。
  • 最后一次传输,需要从 Socket 的缓冲区里写到网卡的缓冲区里面去。通过 DMA 搬运的。

事实上,Kafka 做的事情是,把这个数据搬运的次数,从上面的四次,变成了两次,并且只有 DMA 来进行数据搬运,而不需要 CPU。

@Override
public long transferFrom(FileChannel fileChannel, long position, long count) throws IOException {
    return fileChannel.transferTo(position, count, socketChannel);
}

Kafka 的代码调用了 Java NIO 库,具体是 FileChannel 里面的 transferTo 方法。数据并没有读到中间的应用内存里面,而是直接通过 Channel,写入到对应的网络设备里。并且,对于 Socket 的操作,也不是写入到 Socket 的 Buffer 里面,而是直接根据描述符(Descriptor)写入到网卡的缓冲区里面。于是,在这个过程之中,只进行了两次数据传输。

这个方法里面,没有在内存层面去“复制(Copy)”数据,所以这个方法,也被称之为零拷贝(Zero-Copy)

二、数据的完整性

(一)单比特翻转:软件解决不了的硬件错误

单比特翻转(Single-Bit Flip)

内存里面的单比特翻转或者错误,并不是一个特别罕见的现象。无论是因为内存的制造质量造成的漏电,还是外部的射线,都有一定的概率会造成单比特错误。不管是硬盘还是内存,都存在普通版和企业版,普通版硬件会更可能出现问题。而内存层面的数据出错,软件工程师并不知道,而且这个出错很有可能是随机的。遇上随机出现难以重现的错误,大家肯定受不了。我们必须要有一个办法,避免这个问题。

ECC 内存的全称是 Error-Correcting Code memory,中文名字叫作纠错内存。顾名思义,就是在内存里面出现错误的时候,能够自己纠正过来。

在 ECC 内存发明之前,工程师们通过奇偶校验的方式,来发现这些错误。

奇偶校验的思路很简单:把内存里面的 N 位比特当成是一组。常见的,比如 8 位就是一个字节。然后,用额外的一位去记录,这 8 个比特里面有奇数个 1 还是偶数个 1。如果是奇数个 1,那额外的一位就记录为 1;如果是偶数个 1,那额外的一位就记录成 0。那额外的一位,就称之为校验码位

如果在这个字节里面,不幸发生了单比特翻转,那么数据位计算得到的校验码,就和实际校验位里面的数据不一样。我们的内存就知道出错了。

校验位有一个很大的优点,就是计算非常快,往往只需要遍历一遍需要校验的数据,通过一个 O(N) 的时间复杂度的算法,就能把校验结果计算出来。

校验码的思路,在很多地方都会用到。比如,我们下载一些软件的时候,你会看到,除了下载的包文件,还会有对应的 MD5 这样的哈希值或者循环冗余编码(CRC)的校验文件。当我们把对应的软件下载下来之后,可以计算一下对应软件的校验码,和官方提供的校验码去做个比对,看看是不是一样。如果不一样,你就不能轻易去安装这个软件了。因为有可能,这个软件包是坏的。但是,还有一种更危险的情况,就是你下载的这个软件包,可能是被人植入了后门的。安装上了之后,你的计算机的安全性就没有保障了。

使用奇偶校验,有两个比较大的缺陷:

  • 奇偶校验只能发现奇数个位的错误。
  • 只能发现错误,不能纠正错误。即使在内存里面发现数据错误了,也只能中止程序,而不能让程序继续正常地运行下去。

所以,我们需要一个比简单的校验码更好的解决方案,一个能够发现更多位的错误,并且能够把这些错误纠正过来的解决方案,也就是ECC 内存所使用的解决方案。

这个策略,叫作纠错码(Error Correcting Code)。纠错码需要更多的冗余信息,通过这些冗余信息,我们不仅可以知道哪里的数据错了,还能直接把数据给改对。它还有一个升级版本,叫作纠删码(Erasure Code),不仅能够纠正错误,还能够在错误不能纠正的时候,直接把数据删除。无论是我们的 ECC 内存,还是网络传输,乃至硬盘的 RAID,其实都利用了纠错码和纠删码的相关技术。

(二)海明码

最知名的纠错码就是海明码。海明码(Hamming Code)是以他的发明人 Richard Hamming(理查德·海明)的名字命名的。这个编码方式早在上世纪四十年代就被发明出来了。而直到今天,我们使用的 ECC 内存,也还在通过海明码来纠错。

最基础的海明码叫 7-4 海明码。这里的“7”指的是实际有效的数据,一共是 7 位(Bit),“4”,指的是额外存储了 4 位数据,用来纠错。纠错码的纠错能力是有限的。事实上,在 7-4 海明码里面,只能纠正某 1 位的错误。

4 位的校验码,一共可以表示  2^4 = 16 个不同的数。根据数据位计算出来的校验值,一定是确定的。所以,如果数据位出错了,计算出来的校验码,一定和确定的那个校验码不同。那可能的值,就是在 2^4 - 1 = 15 那剩下的 15 个可能的校验值当中。

15 个可能的校验值,其实可以对应 15 个可能出错的位。这个时候你可能就会问了,既然数据位只有 7 位,那为什么要用 4 位的校验码呢?用 3 位不就够了吗?2^3 - 1 = 7,正好能够对上 7 个不同的数据位啊!

你别忘了,单比特翻转的错误,不仅可能出现在数据位,也有可能出现在校验位。校验位本身也是可能出错的。所以,7 位数据位和 3 位校验位,如果只有单比特出错,可能出错的位数就是 10 位,2^3 - 1 = 7 种情况是不能找到具体是哪一位出错的。

事实上,如果数据位有 K 位,校验位有 N 位。那么需要满足下面这个不等式,才能确保能够对单比特翻转的数据纠错。这个不等式就是:

K + N + 1 <= 2^N

1、海明码的纠错原理

为了算起来简单一点,我们少用一些位数,来算一个 4-3 海明码(也就是 4 位数据位,3 位校验位)。把 4 位数据位,分别记作 d1、d2、d3、d4。把 3 位校验位,分别记作 p1、p2、p3。

从 4 位的数据位里面,拿走 1 位,然后计算出一个对应的校验位。这个校验位的计算用之前讲过的奇偶校验就可以了。比如,我们用 d1、d2、d4 来计算出一个校验位 p1;用 d1、d3、d4 计算出一个校验位 p2;用 d2、d3、d4 计算出一个校验位 p3。

当数据码出错的时候,至少会有 2 位校验码的计算是不一致的。当校验码出错,只有一个校验码的计算是不一致的。所以校验码不一致,一共有 2^3-1=7 种情况,正好对应了 7 个不同的位数的错误。

生成海明码的步骤:

  • 先确定编码后,要传输的数据是多少位。比如 7-4 海明码,就是一共 11 位。
  • 给这 11 位数据从左到右进行编号,并且也把它们的二进制表示写出来。
  • 把这 11 个数据中的二进制的整数次幂找出来。在这个 7-4 海明码里面,就是 1、2、4、8。这些数,就是校验码位,把他们记录做 p1~p4。如果从二进制的角度看,它们是这 11 个数当中,唯四的,在 4 个比特里面只有一个比特是 1 的数值。
  • 剩下的 7 个数,就是 d1-d7 的数据码位了
  • 校验码位还是用奇偶校验码。但是每一个校验码位,不是用所有的 7 位数据来计算校验码。而是 p1 用 3、5、7、9、11 来计算。也就是,在二进制表示下,从右往左数的第一位比特是 1 的情况下,用 p1 作为校验码。
  • 剩下的 p2,用 3、6、10、11 来计算校验码,也就是在二进制表示下,从右往左数的第二位比特是 1 的情况下,用 p2。p3 自然是从右往左数,第三位比特是 1 的情况下的数字校验码。而 p4 则是第四位比特是 1 的情况下的校验码。

任何一个数据码出错了,至少会有对应的两个或者三个校验码对不上,这样就能反过来找到是哪一个数据码出错了。如果校验码出错了,那么只有一位校验码对不上,那就是校验码出错了。

2、海明距离

两个二进制表示的数据之间有差异的位数,称为海明距离。比如 1001 和 0001 的海明距离是 1,因为他们只有最左侧的第一位是不同的。而 1001 和 0000 的海明距离是 2,因为他们最左侧和最右侧有两位是不同的。

所进行一位纠错,就是所有和要传输的数据的海明距离为 1 的数,都能被纠正回来。

任何两个实际传输的数据,海明距离都至少要是 3。如果是 2 的话,那么就会有一个出错的数,到两个正确的数据的海明距离都是 1。当我们看到这个出错的数的时候,就不知道究竟应该纠正到那一个数了。

课程链接:深入浅出计算机组成原理_组成原理_计算机基础-极客时间 

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

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

相关文章

《狂飙》壁纸大嫂如此惊艳,做成日历壁纸天天看(7)

小朋友们好&#xff0c;大朋友们好&#xff01;我是猫妹&#xff01;话说兔年春节期间&#xff0c;一部反黑反腐电视剧横空出世&#xff0c;收视率和口碑都有不错的成绩&#xff01;这部电视剧叫《狂飙》&#xff01;你看了吗&#xff1f;我没看&#xff01;不过这丝毫不影响它…

C语言fread和fwrite的用法详解

fgets() 有局限性&#xff0c;每次最多只能从文件中读取一行内容&#xff0c;因为 fgets() 遇到换行符就结束读取。如果希望读取多行内容&#xff0c;需要使用 fread() 函数&#xff1b;相应地写入函数为 fwrite()。对于 Windows 系统&#xff0c;使用 fread() 和 fwrite() 时应…

Python+OpenCV 简单实现人脸检测多个和人脸识别 2(附代码)

如果dilb和face_recognition第三方包安装失败&#xff0c;请移步到Python 解决dilb和face_recognition第三方包安装失败_水w的博客-CSDN博客 上篇请移步到Pythondilb 简单实现人脸检测&#xff08;附代码&#xff09;_水w的博客-CSDN博客 本篇是在上篇的工作基础上进行的。 目…

k8s之apiserver

1、Kube-APIServer 启动APIServer 启动采用 Cobra 命令行&#xff0c;解析相关 flags 参数&#xff0c;经过 Complete(填充默认值)->Validate(校验) 逻辑后&#xff0c;通过 Run 启动服务。在 Run 函数中&#xff0c;按序分别初始化 APIServer 链(APIExtensionsServer、Kube…

【Java开发笔记】分库分表

【Java开发笔记】分库分表 1 分库分表基本概述 为什么要分库分表&#xff1f; 【性能角度】分库分表就是为了解决由于数据量多大而导致数据库性能下降的问题&#xff1a; 原来独立的数据库拆分成若干数据库组成将原来的大表&#xff08;存储近千万数据&#xff09;拆分为若干…

利用git reflog 命令来查看历史提交记录,并使用提交记录恢复已经被删除掉的分支

一.问题描述 当我们在操作中手误删除了某个分支&#xff0c;那该分支中提交的内容也没有了&#xff0c;我们可以利用git reflog这个命令来查看历史提交的记录从而恢复被删除的分支和提交的内容 二.模拟问题 1.创建git仓库&#xff0c;并提交一个文件 [rootcentos7-temp /da…

oracle10g安装教程

oracle 10g 安装 环境 操作系统&#xff1a;win 7 64位 内存&#xff1a;8G Oracle 10压缩包&#xff1a;10203_vista_w2k8_x86_production_db.zip 客户端&#xff1a;Oracle_client_win32.zip pl/sql&#xff1a;plsqldev1005.exe 背景 Oracle是众多中大型企业必选的数…

17万字数字化医院信息化建设大数据平台建设方案WORD

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目录 第1章 医院信息化概述 1.…

MySQL-数据目录浅析

InnoDB 、 MyISAM 这样的存储引擎都是把表存储在磁盘上的&#xff0c;操作系统用文件系统来管理磁盘。 数据目录 MySQL服务器程序在启动时会到文件系统的某个目录下加载一些文件&#xff0c;之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中&#xff0c;这个目…

JVM学习02:内存结构

JVM学习02&#xff1a;内存结构 1. 程序计数器 1.1、定义 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用&#xff1a;是记住下一条jvm指令的执行地址 特点&#xff1a; 是线程私有的不会存在内存溢出 1.2、作用 程序计数器物理上是由寄存器来实…

Spring中IOC框架结构是什么?都包含那些模块,各个模块具体是什么样的

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库Java设计模式克隆下载学习使用&#xff01; 7.自定义Spring框架 7.1 Spring框架使用回顾 7.1.1 数据访问层 定义UserDaoMapper接口及实现类 public interface UserMapper { public void add(); } pu…

k8s默认StorageClass,解决pvc一直处于“Pending”

文章目录报错详情排查思路查看 pvc 详细属性查看 nfs-provisioner pod日志解决方案报错详情 排查思路 查看 pvc 详细属性 [rootk8s-master01 /opt/zadig]# kubectl describe pvc pvc-sc Name: pvc-sc Namespace: default StorageClass: nfs-yinwu Status: …

代码随想录算法训练营第27天|● 93.复原IP地址 ● 78.子集 ● 90.子集II

93.复原IP地址 看完题后的思路 典型分割问题略lue略剪枝条件 sub&#xff1a; 1&#xff09; 不是一位首字母为0 2&#xff09;大于三位 3&#xff09;介于0-255之间 4) 当已分割得到3个时&#xff0c;第四个直接从startIndex到末尾就行 代码 ArrayList<String> slist…

剑指Offer 第28天 复杂链表的赋值

复杂链表的复制_牛客题霸_牛客网 描述 输入一个复杂链表&#xff08;每个节点中有节点值&#xff0c;以及两个指针&#xff0c;一个指向下一个节点&#xff0c;另一个特殊指针random指向一个随机节点&#xff09;&#xff0c;请对此链表进行深拷贝&#xff0c;并返回拷贝后的头…

(免费分享)基于 SpringBoot 的高校宿舍管理系统带论文

项目描述 系统代码质量高&#xff0c;功能强大&#xff0c;带论文。 系统的功能主要有&#xff1a; &#xff08;1&#xff09;基本信息管理 基本信息分为学生信息和宿舍信息两部分&#xff0c;其功能是负责维护这些信息&#xff0c;对 它们进行增删查改等操作。 &#x…

UART通讯简介

UART全称Universal AsynchronousReceiver/Transmitter&#xff0c;通用异步收发传输器。 一、工作原理 和其它串口一样&#xff0c;数据按照二进制从低位到高位一位一位的传输&#xff0c;能将要传输的数据在串行通信与并行通信之间加以转换&#xff0c;能够灵活地与外部设备进…

网络编程(未完待续)

网络编程 文章目录网络编程前置概念1- 字节序高低地址与高低字节高低地址&#xff1a;高低字节字节序大端小端例子代码判断当前机器是大端还是小端为何要有字节序字节序转换函数需要字节序转换的时机例子一例子二2- IP地址转换函数早期(不用管)举例现在与字节序转换函数相比:**…

Open Street Map—2023年水系数据

之前文章我们给大家分享了从OSM地图下载的道路数据&#xff08;可查看之前推送的文章&#xff09;&#xff0c; 这一篇我们给大家带来的是从OSM地图下载的水系数据&#xff01;我们下载了全国范围&#xff08;包括港澳台&#xff09;的水系数据&#xff0c;下载时间为2023年2月…

硬件篇-配置

写在最前 这已经可以成为垃圾佬配置了。。。 机箱->239元 机箱选用的itx迷你机箱&#xff0c;为了后期nas方便拓展选了4盘位&#xff0c;该机箱还是比较符合我的预期的&#xff0c;颇有种麻雀虽小五脏俱全的感觉&#xff0c;机箱可以安装matx主板和itx主板&#xff0c;还是…

聊聊MySQL中的事务,MVCC

事务我们知道&#xff0c;事务具有四大特性——ACIDA atomicity 指的是原子性C consistency 指的是一致性I isolation 指的是隔离性D durability 指的是持久性四大特性的实现原理原子性原子性在这指的是整个事务操作&#xff0c;要么同时成功要么同时失败。让它变成一个整体。同…