主要内容:IO(Buffer/PageCache、Kafka/IO/SSD原理)、线程与进程

知乎上有趣的回答

  • 线程本质就是堆栈,当一段程序在执行,能代表它的是他的过去和现在。”过去” 在堆栈中,”现在” 则是 CPU 的所有寄存器,如果我们要挂起一个线程,我们把寄存器也保存到堆栈中,我们就具有它的所有状态,可以随时恢复它。这是线程。

    当我们切换线程的时候,同时切换它的地址空间(通过修改 MMU 即可),则我们认为发生了进程切换。所以进程的本质是地址空间,我们可以认为地址空间决定了进程是否发生切换。

    作者:in nek

  • 知乎上看到过一句话:OS 不是运行着的代码,而是一堆躺在内存里等着被调用的代码。

    放在这里就是 “我用你提供的锤子砸了个钉子”,而不是 “你去帮我砸个钉子”。

    作者:锦鲤

  • 现在的大数据的工具基本都是顺序读写硬盘的。必要的随机访问还得放在内存里啊。

    感觉就是返璞归真,70 年代全是批处理,归并排序,顺序读写。压根也没内存可用就是了

    作者:Long Han

  • 使用 BufferedXXXStream 默认缓冲区大小是 8K。读的时候会一直填满缓冲区(或者文件读取完毕),写的时候也是等缓冲区满了之后(或者执行 flush 操作)才将内容送入内核缓冲区。效率高的原因就是避免了每读一个字节都要陷入操作系统内核(这是个耗时的操作)。

    【CSDN】java flush () 函数的作用

阅读

  • 为什么 Kafka 那么快

    这篇文章很好的介绍了Kafka的原理:顺序写入(末尾添加)、mmap、zero copy、通过 offset(偏移量)发送文件

  • 程序员需要知道的 SSD 基本原理

    SSD 中一般有多个 NAND Flash,每个 NAND Flash 包含多个 Block,每个 Block 包含多个 Page。由于 NAND 的特性,其存取都必须以 page 为单位,即每次读写至少是一个 page,通常地,每个 page 的大小为 4k 或者 8k。另外,NAND 还有一个特性是,其只能是读或写单个 page,但不能覆盖写如某个 page,必须先要清空里面的内容,再写入。由于清空内容的电压较高,必须是以 block 为单位。因此,没有空闲的 page 时,必须要找到没有有效内容的 block,先擦写,然后再选择空闲的 page 写入。

  • 探索 CPU 的缓存架构,及引申到缓存系统的设计

    CPU缓存架构与现代分布式缓存架构对比:我们认为,CPU 的寄存器和 CPU 周期同步其实也可以理解为是运算单元一部分,而 L1 缓存,则可认为是分布式节点中的本地内存,L2 和 L3 缓存则可以认为是共用的 Redis 这样的通用缓存,内存则可以认为是数据库与 Elasticsearch 这些真正的数据源。

  • Buffer 与 Page Cache

      total used free buffers cached
    Mem 物理内存总量 已分配内存 未分配内存 可用数量 可用数量
    buffers/cache / 已使用内存 剩余内存    
    Swap(交换分区) 总量 已使用 未使用    

    在 Linux 的内存管理中,这里的 buffer 指 Linux 内存的 Buffer cache。这里的 cache 指 Linux 内存中的 Page cache。

    Page cache 主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有 read/write 操作的时候。事实上 page cache 也负责了大部分的块设备文件的缓存工作。