| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,12 +1,17 @@ | |||
| 1 | - :heart:JavaMap项目同时托管在 Github 和 Gitee(码云): | ||
| 2 | - - Github: [https://github.com/smileArchitect/JavaMap](https://github.com/smileArchitect/JavaMap) | ||
| 3 | - - Gitee(码云) [https://gitee.com/smileArchitect/JavaMap](https://gitee.com/smileArchitect/JavaMap) | ||
| 4 | - | ||
| 5 | - 麻烦大家点击右上角给 **JavaMap** 项目Star一下,也欢迎大家提 Issue 和PR~ 开源有你的贡献,爱你们 ! | ||
| 1 | + # 很啰嗦的前言 | ||
| 2 | + :heart:麻烦大家点击右上角给 `Github JavaMap` 项目点一个 `Star`,开源有你的贡献,爱你 ! | ||
| 6 | 3 | ||
| 7 | 4 | :heart:由于国内访问 Github 速度比较慢,图片可能无法刷新出来,建议大家在线阅读: | |
| 8 | - [http://smilearchitect.gitee.io/javamap/](http://smilearchitect.gitee.io/javamap/),内容与Github同源。 | ||
| 5 | + [http://smilearchitect.gitee.io/javamap/](http://smilearchitect.gitee.io/javamap/),内容与`Github`同源。已经是在线阅读可以不用重复点了。 | ||
| 6 | + | ||
| 7 | + 如果你想成为项目的 `contributor`欢迎你提 `PR`,对文章内容有任何问题你也可以提交 `Issue`。 | ||
| 8 | + `JavaMap`项目源码托管地址: | ||
| 9 | + | ||
| 10 | + - 【优先】Github: [https://github.com/smileArchitect/JavaMap](https://github.com/smileArchitect/JavaMap) | ||
| 11 | + - Gitee(码云) [https://gitee.com/smileArchitect/JavaMap](https://gitee.com/smileArchitect/JavaMap) | ||
| 9 | 12 | ||
| 13 | + > 人生终极问题: | ||
| 14 | + > | ||
| 10 | 15 | > :one:**JavaMap**项目可以干什么?[戳这里给你介绍](#关于JavaMap开源项目) | |
| 11 | 16 | > :two:我是谁? [戳这里勾搭我](#关于我) | |
| 12 | 17 | > | |
@@ -28,6 +33,8 @@ | |||
| 28 | 33 | # Java知识地图(JavaMap) | |
| 29 | 34 | `努力完善中` | |
| 30 | 35 | ||
| 36 | + 知识地图就是你前进的`灯塔`,有了它你知道目标在哪里,也知道差距在哪里,路漫漫其修远兮希望你能早日通关~ | ||
| 37 | + | ||
| 31 | 38 | <div align="center"> | |
| 32 | 39 | <img width="" src="https://cdn.jsdelivr.net/gh/SmileLionCoder/assets@main/202010/20201111225410.png"></img> | |
| 33 | 40 | </div> | |
@@ -146,10 +153,11 @@ | |||
| 146 | 153 | 公众号比Github早一到两天更新,如果大家想要实时关注我更新的文章以及分享的干货,可以关注我的公众号,扫描二维码或者微信搜:爱笑的架构师 | |
| 147 | 154 | ||
| 148 | 155 | <div align="center"> | |
| 149 | - <img width="200px" src="https://cdn.jsdelivr.net/gh/SmileLionCoder/assets@main/202010/20201110224936.jpg"></img> | ||
| 156 | + <img width="200px" src="https://cdn.jsdelivr.net/gh/smileArchitect/assets@main/202012/20201205221844.png"></img> | ||
| 150 | 157 | </div> | |
| 158 | + | ||
| 151 | 159 | 或者你仅仅想找雷架咨询问题、交流、聊天,扫描二维码,备注:github | |
| 152 | 160 | ||
| 153 | 161 | <div align="center"> | |
| 154 | - <img width="200px" src="https://cdn.jsdelivr.net/gh/SmileLionCoder/assets@main/202010/20201110230459.jpeg"></img> | ||
| 162 | + <img width="200px" src="https://cdn.jsdelivr.net/gh/smileArchitect/assets@main/202012/20201205222851.png"></img> | ||
| 155 | 163 | </div> | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -19,13 +19,13 @@ | |||
| 19 | 19 | ||
| 20 | 20 | 先用一张思维导图直接告诉你答案: | |
| 21 | 21 | ||
| 22 | -  | ||
| 22 | + <img src="https://cdn.jsdelivr.net/gh/smileArchitect/assets@main/202012/20201205225401.png" alt="图片" style="zoom: 50%;" /> | ||
| 23 | 23 | ||
| 24 | 24 | ## 顺序读写磁盘 | |
| 25 | 25 | ||
| 26 | 26 | 生产者写入数据和消费者读取数据都是**顺序读写**的,先来一张图直观感受一下顺序读写和随机读写的速度: | |
| 27 | 27 | ||
| 28 | -  | ||
| 28 | + <img src="https://cdn.jsdelivr.net/gh/smileArchitect/assets@main/202012/20201205225450.png" alt="图片" style="zoom: 33%;" /> | ||
| 29 | 29 | ||
| 30 | 30 | 从图中可以看出传统硬盘或者SSD的顺序读写甚至超过了内存的随机读写,当然与内存的顺序读写对比差距还是很大。 | |
| 31 | 31 | ||
@@ -37,15 +37,15 @@ | |||
| 37 | 37 | ||
| 38 | 38 | **磁头**:磁头切换磁道读写数据时是通过机械设备实现的,一般速度较慢;而磁头切换盘面读写数据是通过电子设备实现的,一般速度较快,因此磁头一般是先读写完柱面后才开始寻道的(不用切换磁道),这样磁盘读写效率更快。 | |
| 39 | 39 | ||
| 40 | -  | ||
| 40 | + <img src="https://cdn.jsdelivr.net/gh/smileArchitect/assets@main/202012/20201205225538.png" alt="图片" style="zoom:50%;" /> | ||
| 41 | 41 | ||
| 42 | 42 | **磁道**:磁道就是以中间轴为圆心的圆环,一个盘面有多个磁道,磁道之间有间隙,磁道也就是磁盘存储数据的介质。磁道上布有一层磁介质,通过磁头可以使磁介质的极性转换为数据信号,即磁盘的读,磁盘写刚好与之相反。 | |
| 43 | 43 | ||
| 44 | 44 | **柱面**:磁盘中不同盘面中半径相同的磁道组成的,也就是说柱面总数 = 某个盘面的磁道数。 | |
| 45 | 45 | ||
| 46 | 46 | **扇区:**单个磁道就是多个弧形扇区组成的,盘面上的每个磁道拥有的扇区数量是相等。扇区是最小存储单元,一般扇区大小为512bytes。 | |
| 47 | 47 | ||
| 48 | -  | ||
| 48 | + <img src="https://cdn.jsdelivr.net/gh/smileArchitect/assets@main/202012/20201205225609.png" alt="图片" style="zoom:50%;" /> | ||
| 49 | 49 | ||
| 50 | 50 | 如果系统每次只读取一个扇区,那恐怕效率太低了,所以出现了block(块)的概念。文件读取的最小单位是block,根据不同操作系统一个block一般由多个扇区组成。 | |
| 51 | 51 | ||
@@ -61,19 +61,19 @@ | |||
| 61 | 61 | ||
| 62 | 62 | Kafka 写入数据是顺序的,下面每一个Partition 都可以当做一个文件,每次接收到新数据后Kafka会把数据插入到文件末尾,虚框部分代表文件尾。 | |
| 63 | 63 | ||
| 64 | -  | ||
| 64 | +  | ||
| 65 | 65 | ||
| 66 | 66 | 这种方法有一个问题就是删除数据不方便,所以 Kafka 一般会把所有的数据都保留下来,每个消费者(Consumer)对每个Topic都有一个 offset 用来记录读取进度或者叫坐标。 | |
| 67 | 67 | ||
| 68 | -  | ||
| 68 | +  | ||
| 69 | 69 | ||
| 70 | 70 | ## Memory Mapped Files(MMAP) | |
| 71 | 71 | ||
| 72 | 72 | 在文章开头我们看到硬盘的顺序读写基本能与内存随机读写速度媲美,但是与内存顺序读写相比还是太慢了,那 Kafka 如果有追求想进一步提升效率怎么办?可以使用现代操作系统分页存储来充分利用内存提高I/O效率,这也是下面要介绍的 MMAP 技术。 | |
| 73 | 73 | ||
| 74 | 74 | **MMAP**也就是**内存映射文件**,在64位操作系统中一般可以表示 20G 的数据文件,它的工作原理是直接利用操作系统的 Page 来实现文件到物理内存的直接映射,完成映射之后对物理内存的操作会被同步到硬盘上。 | |
| 75 | 75 | ||
| 76 | -  | ||
| 76 | +  | ||
| 77 | 77 | ||
| 78 | 78 | 通过**MMAP**技术进程可以像读写硬盘一样读写内存(逻辑内存),不必关心内存的大小,因为有虚拟内存兜底。这种方式可以获取很大的I/O提升,省去了用户空间到内核空间复制的开销。 | |
| 79 | 79 | ||
@@ -99,7 +99,7 @@ Kafka 另外一个黑技术就是使用了零拷贝,要想深刻理解零拷 | |||
| 99 | 99 | ||
| 100 | 100 | 如果不使用零拷贝技术,消费者(consumer)从Kafka消费数据,Kafka从磁盘读数据然后发送到网络上去,数据一共发生了四次传输的过程。其中两次是 DMA 的传输,另外两次,则是通过 CPU 控制的传输。 | |
| 101 | 101 | ||
| 102 | -  | ||
| 102 | + <img src="https://cdn.jsdelivr.net/gh/smileArchitect/assets@main/202012/20201205225749.png" alt="图片" style="zoom:50%;" /> | ||
| 103 | 103 | ||
| 104 | 104 | **第一次传输**:从硬盘上将数据读到操作系统内核的缓冲区里,这个传输是通过 DMA 搬运的。 | |
| 105 | 105 | ||
@@ -111,7 +111,7 @@ Kafka 另外一个黑技术就是使用了零拷贝,要想深刻理解零拷 | |||
| 111 | 111 | ||
| 112 | 112 | 实际上在kafka中只进行了两次数据传输,如下图: | |
| 113 | 113 | ||
| 114 | -  | ||
| 114 | +  | ||
| 115 | 115 | ||
| 116 | 116 | **第一次传输**:通过 DMA从硬盘直接读到操作系统内核的读缓冲区里面。 | |
| 117 | 117 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments