# IO编程

## 概念
IO在计算机中指Input/Output，也就是输入和输出。由于程序和运行时数据是在内存中驻留，由CPU这个超快的计算核心来执行，涉及到数据交换的地方，通常是磁盘、网络等，就需要IO接口。

## 异步和同步
1. 定义  
同步和异步关注的是消息通信机制  
同步: 在发出一个**调用**时，在没有得到结果之前，该**调用**就不返回。但是一旦调用返回，就得到返回值了。
换句话说，就是由**调用者**主动等待这个**调用**的结果。   
异步：**调用**在发出之后，这个调用就直接返回了，所以没有返回结果。换句话说，当一个异步过程调用发出后，调用者不会立刻得到结果。而是在**调用**发出后，**被调用者**通过状态、通知来通知调用者，或通过回调函数处理这个调用。 

2. 区别  
实际上同步与异步是针对应用程序与内核的交互而言的。同步过程中进程触发IO操作并等待或者轮询的去查看IO操作是否完成。异步过程中进程触发IO操作以后，直接返回，做自己的事情，IO交给内核来处理，完成后内核通知进程IO完成。

![](https://pic2.zhimg.com/80/v2-d5f8329edddb54dbbd2401a0bf7d782b_hd.jpg)


## 阻塞与非阻塞  
阻塞和非阻塞关注的是程序在等待调用结果（消息，返回值）时的状态。

简单理解为需要做一件事能不能立即得到返回应答，如果不能立即获得返回，需要等待，那就阻塞了，否则就可以理解为非阻塞。
![](https://pic4.zhimg.com/80/v2-0878098d60b4dd144caa3b1a3152d69b_hd.jpg)

## 参考资料
* [IO编程](https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431917590955542f9ac5f5c1479faf787ff2b028ab47000)