> For the complete documentation index, see [llms.txt](https://yangsx95.gitbook.io/notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yangsx95.gitbook.io/notes/distributed/io.md).

# IO

## Linux下的IO的概念

TCP进行报文发送以及接收时，会经过一个缓冲区： ![](https://2351062869-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F7b2CdwBN9liniVJpfEAc%2Fuploads%2Fgit-blob-76d81b27fbee36773082827613d44b2c39ed5a08%2F20190304132512564_5422%20\(1\).png?alt=media) 当发送请求的数据大小大于TCP发送缓冲区的剩余空间时，这时就会**阻塞**，直到发送缓冲区的剩余大小足够存放数据。 当接收请求的数据大小大于TCP接收缓冲区的剩余空间时，这时就会**阻塞**，知道接收缓冲区的剩余大小足够存放数据。

**这就是BIO**。

为了解决这类问题，就出现了**NIO**，Non-Blocking IO 非阻塞IO。NIO在底层存在一个I/O调度线程，不断的扫描每个socket的缓冲区，当发现TCP缓冲区空间不足时，主动通知发送端/接收端，当缓冲区大小够的时候，主动通知发送端/接收端进行发送/接收。

* BIO（同步阻塞）：等待我的鸡蛋饼做好，然后拿走
* NIO（同步非阻塞）：付完钱后，告诉小哥一声，我等会儿过来拿
* AIO（异步非阻塞）：告诉小哥鸡蛋饼做好给我送到我家（外卖）
