深入浅出计算机组成原理
徐文浩
bothub创始人
立即订阅
13019 人已学习
课程目录
已完结 62 讲
0/4登录后,你可以任选4讲全文学习。
入门篇 (5讲)
开篇词 | 为什么你需要学习计算机组成原理?
免费
01 | 冯·诺依曼体系结构:计算机组成的金字塔
02 | 给你一张知识地图,计算机组成原理应该这么学
03 | 通过你的CPU主频,我们来谈谈“性能”究竟是什么?
04 | 穿越功耗墙,我们该从哪些方面提升“性能”?
原理篇:指令和运算 (12讲)
05 | 计算机指令:让我们试试用纸带编程
06 | 指令跳转:原来if...else就是goto
07 | 函数调用:为什么会发生stack overflow?
08 | ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?
09 | 程序装载:“640K内存”真的不够用么?
10 | 动态链接:程序内部的“共享单车”
11 | 二进制编码:“手持两把锟斤拷,口中疾呼烫烫烫”?
12 | 理解电路:从电报机到门电路,我们如何做到“千里传信”?
13 | 加法器:如何像搭乐高一样搭电路(上)?
14 | 乘法器:如何像搭乐高一样搭电路(下)?
15 | 浮点数和定点数(上):怎么用有限的Bit表示尽可能多的信息?
16 | 浮点数和定点数(下):深入理解浮点数到底有什么用?
原理篇:处理器 (18讲)
17 | 建立数据通路(上):指令+运算=CPU
18 | 建立数据通路(中):指令+运算=CPU
19 | 建立数据通路(下):指令+运算=CPU
20 | 面向流水线的指令设计(上):一心多用的现代CPU
21 | 面向流水线的指令设计(下):奔腾4是怎么失败的?
22 | 冒险和预测(一):hazard是“危”也是“机”
23 | 冒险和预测(二):流水线里的接力赛
24 | 冒险和预测(三):CPU里的“线程池”
25 | 冒险和预测(四):今天下雨了,明天还会下雨么?
26 | Superscalar和VLIW:如何让CPU的吞吐率超过1?
27 | SIMD:如何加速矩阵乘法?
28 | 异常和中断:程序出错了怎么办?
29 | CISC和RISC:为什么手机芯片都是ARM?
30 | GPU(上):为什么玩游戏需要使用GPU?
31 | GPU(下):为什么深度学习需要使用GPU?
32 | FPGA和ASIC:计算机体系结构的黄金时代
33 | 解读TPU:设计和拆解一块ASIC芯片
34 | 理解虚拟机:你在云上拿到的计算机是什么样的?
原理篇:存储与I/O系统 (17讲)
35 | 存储器层次结构全景:数据存储的大金字塔长什么样?
36 | 局部性原理:数据库性能跟不上,加个缓存就好了?
37 | 高速缓存(上):“4毫秒”究竟值多少钱?
38 | 高速缓存(下):你确定你的数据更新了么?
39 | MESI协议:如何让多核CPU的高速缓存保持一致?
40 | 理解内存(上):虚拟内存和内存保护是什么?
41 | 理解内存(下):解析TLB和内存保护
42 | 总线:计算机内部的高速公路
43 | 输入输出设备:我们并不是只能用灯泡显示“0”和“1”
44 | 理解IO_WAIT:I/O性能到底是怎么回事儿?
45 | 机械硬盘:Google早期用过的“黑科技”
46 | SSD硬盘(上):如何完成性能优化的KPI?
47 | SSD硬盘(下):如何完成性能优化的KPI?
48 | DMA:为什么Kafka这么快?
49 | 数据完整性(上):硬件坏了怎么办?
50 | 数据完整性(下):如何还原犯罪现场?
51 | 分布式计算:如果所有人的大脑都联网会怎样?
应用篇 (5讲)
52 | 设计大型DMP系统(上):MongoDB并不是什么灵丹妙药
53 | 设计大型DMP系统(下):SSD拯救了所有的DBA
54 | 理解Disruptor(上):带你体会CPU高速缓存的风驰电掣
55 | 理解Disruptor(下):不需要换挡和踩刹车的CPU,有多快?
结束语 | 知也无涯,愿你也享受发现的乐趣
免费
答疑与加餐 (5讲)
特别加餐 | 我在2019年F8大会的两日见闻录
FAQ第一期 | 学与不学,知识就在那里,不如就先学好了
用户故事 | 赵文海:怕什么真理无穷,进一寸有一寸的欢喜
FAQ第二期 | 世界上第一个编程语言是怎么来的?
特别加餐 | 我的一天怎么过?
深入浅出计算机组成原理
登录|注册

48 | DMA:为什么Kafka这么快?

徐文浩 2019-08-19
过去几年里,整个计算机产业界,都在尝试不停地提升 I/O 设备的速度。把 HDD 硬盘换成 SSD 硬盘,我们仍然觉得不够快;用 PCI Express 接口的 SSD 硬盘替代 SATA 接口的 SSD 硬盘,我们还是觉得不够快,所以,现在就有了傲腾(Optane)这样的技术。
但是,无论 I/O 速度如何提升,比起 CPU,总还是太慢。SSD 硬盘的 IOPS 可以到 2 万、4 万,但是我们 CPU 的主频有 2GHz 以上,也就意味着每秒会有 20 亿次的操作。
如果我们对于 I/O 的操作,都是由 CPU 发出对应的指令,然后等待 I/O 设备完成操作之后返回,那 CPU 有大量的时间其实都是在等待 I/O 设备完成操作。
但是,这个 CPU 的等待,在很多时候,其实并没有太多的实际意义。我们对于 I/O 设备的大量操作,其实都只是把内存里面的数据,传输到 I/O 设备而已。在这种情况下,其实 CPU 只是在傻等而已。特别是当传输的数据量比较大的时候,比如进行大文件复制,如果所有数据都要经过 CPU,实在是有点儿太浪费时间了。
因此,计算机工程师们,就发明了 DMA 技术,也就是直接内存访问(Direct Memory Access)技术,来减少 CPU 等待的时间。

理解 DMA,一个协处理器

取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入浅出计算机组成原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(21)

  • soimage
    看到最后,也没看出kafka快跟dma有关系,倒是跟zero-copy关系大一些,通过砍掉两次内核空间和用户空间的数据拷贝,以及内核态和用户态的切换成本来优化

    作者回复: soimage,

    这样说也对,不过砍完之后数据传输其实都是DMA的过程了。

    2019-09-16
    1
    3
  • 免费的人
    从kafka论文里摘的:
    In addition we optimize the network access for consumers. Kafka
    is a multi-subscriber system and a single message may be
    consumed multiple times by different consumer applications. A
    typical approach to sending bytes from a local file to a remote
    socket involves the following steps: (1) read data from the storage
    media to the page cache in an OS, (2) copy data in the page cache
    to an application buffer, (3) copy application buffer to another
    kernel buffer, (4) send the kernel buffer to the socket. This
    includes 4 data copying and 2 system calls. On Linux and other
    Unix operating systems, there exists a sendfile API [5] that can
    directly transfer bytes from a file channel to a socket channel.
    This typically avoids 2 of the copies and 1 system call introduced
    in steps (2) and (3). Kafka exploits the sendfile API to efficiently
    deliver bytes in a log segment file from a broker to a consumer.

    作者回复: 👍

    2019-08-20
    3
  • 斐波那契
    老师 我想问一下 对于传统的四步读取文件然后网络发送里 操作系统的内核缓冲区是不是也在内存的某一个地方(只是用户访问不到)然后第二步 复制到应用程序内存中 事实上就是从内存的某一个地方复制到内存另一个地方 然后应用程序就可以操作了
    2019-08-20
    1
    3
  • 码农Kevin亮
    请问老师,我是不是可以这样理解,java的fileChannel的api都是基于DMAC的实现?
    2019-10-17
    2
  • prader
    因为cpu比较快,而io比较慢,所以在处理数据的时候,主板或者外部设备上添加了DMA这个io读取操作的协处理器。
     kafaka 是利用dma的硬件条件,减少,cpu对于数据的搬运次数,因为kafuka在处理实时消息方面比较快。
    2019-10-17
    1
  • 焰火
    DMAC:我们不加工数据,只是数据的搬运工
    2019-10-02
    1
  • 活的潇洒
    从去年一直在在用elk+kafka 作为日志系统,之所以选择kafka是因为知道他快,但是具体怎么快?为什么快只有学完这篇你会觉得一下通透了
    day 48天笔记:https://www.cnblogs.com/luoahong/p/11412797.html
    2019-08-26
    1
  • yhh
    如果我们的应用程序需要对数据做进一步的加工,那还能使用零拷贝吗

    作者回复: yhh同学,

    你好,那就不能了,我们需要把数据复制到内存里面来,在用户态用程序进行处理。

    2019-08-20
    1
    1
  • 大明
    哈哈哈哈
    2019-08-19
    1
  • QQ怪
    以前只知道kafka通过零拷贝技术提高了吞吐量,但不知道为什么?这下老师通过硬件知识体系理解了相关技术原理,简直太棒了
    2019-12-11
  • David Xing
    👍
    2019-10-15
  • skye
    老师,DMAC搬运数据的时候,CPU在干嘛?不是等待吗?
    2019-10-14
    1
  • 小先生
    请问老师,在什么场景下,I/O 设备会主设备发起请求?
    2019-10-07
  • Fstar
    我记得 Nginx 的静态服务器貌似也是零拷贝。市面上常见的web服务器的静态服务器应该都实现了零拷贝吧?

    作者回复: Fstar同学,

    你好,我不是一个Web服务器的专家,所以其他Web服务器我不太清楚。不过Nginx的确是可以通过配置sendfile的开关on/off来控制是不是zero copy的

    2019-10-02
  • 纵横四海1949
    从C盘复制数据到D盘是怎么个过程呢?

    作者回复: 看这个程序怎么写啊,可以走DMA也可以不走DMA。

    不走DMA就是要通过user space在内存里面复制中转。

    2019-09-04
  • 如果不是由硬盘而是要从程序到网卡,可以省略socket buffer这一步吗?

    作者回复: 袭同学,

    你好,什么叫做“程序到网卡”呢?其实从硬件的角度,只有内存、硬盘、网卡这些设备并没有“程序”这个东西。

    需要把软件代码和硬件设备分离开来想这个问题。

    2019-08-23
  • gigglesun
    "4. 如果我们要从硬盘上往内存里面加载数据,这个时候,硬盘就会向 DMAC 发起一个数据传输请求。这个请求并不是通过总线,而是通过一个额外的连线。"这个地方不太明白,硬盘怎么能发起数据传输请求,我的理解硬盘就是单一的存储设备,没有逻辑处理能力。请老师指点~
    2019-08-20
    1
  • 许童童
    老师讲得好啊,之前一直不是很理解DMA是什么原理,到底是怎么工作的,这篇文章,深入浅出,感谢老师。
    2019-08-19
    1
  • coder
    超算里面核与核之间的数据拷贝,一般会通过基于IB总线的RDMA来完成,可以避免过cpu内核的开销,希望徐老师能讲一下rDMA

    作者回复: coder同学,

    你好,超算里面的rDMA我还真没有了解过。等我抽空先自己学习一下。

    2019-08-19
  • 红泥小火炉
    对DMAC的长度配置时机有个疑问,一个DMAC下面可以挂多个设备吧,如果可以的话,不同设备的buffer长度是不同的,DMAC的长度配置做不到通用啊,难道是在每次传输前都需要配置一次?
    2019-08-19
    1
收起评论
21
返回
顶部