玩转 ByteBuffer

为什么要讲 Buffer

首先为什么一个小小的 Buffer 我们需要单独拎出来聊?或者说,Buffer 具体是在哪些地方被用到的呢?

例如,我们从磁盘上读取一个文件,并不是直接就从磁盘加载到内存中,而是首先会将磁盘中的数据复制到内核缓冲区中,然后再将数据从内核缓冲区复制到用户缓冲区内,在图里看起来就是这样:

从磁盘读取文件

再比如,我们往磁盘上写文件,也不是直接将数据写到磁盘。而是将数据从用户缓冲区写到内核缓冲区,由操作系统择机将其刷入磁盘,图跟上面这个差不多,就不画了,自行理解。

再再比如,服务器接受客户端发过来的数据时,也不是直接到用户态的 Buffer 中。而是会先从网卡到内核态的 Buffer 中,再从内核态的 Buffer 中复制到用户态的 Buffer 中。

那为什么要这么麻烦呢?复制来复制去的,首先我们用排除法排除这样做是为了好玩。

继续阅读玩转 ByteBuffer

用户态和内核态的区别是啥

这篇文章的深度不会太深,重点就是了解一下用户态和内核态的区别就 OK 了。

先给不了解内核态、用户态的简单介绍一下,我们在什么时候会提到这两个概念。

例如我们的应用程序需要从磁盘读取某个文件的数据,此时并不是直接从磁盘加载到应用内存中,而是:

  • 先将数据从「磁盘」复制到「内核 Buffer」
  • 再将数据从「内核 Buffer」复制到「用户 Buffer」

以上就是用户态内核态的概念。首先我们给他下个定义,这两个是操作系统的运行级别

然后我们知道,我们写的程序,最终运行的时候实际都会被编译、解释成一条一条的 CPU 指令被 CPU 执行。

继续阅读用户态和内核态的区别是啥