阻塞/非阻塞描述的是函数,指访问某个函数时,函数是否会立即返回,是否阻塞线程
异步/同步描述的是数据读写的方式,同步是指由用户的线程参与读写,异步是指内核线程发起读写,用户只需关注IO完成后的回调,不需要参与具体的IO之中。
阻塞:阻塞指函数调用结果返回之前,当前线程会被挂起,进入等待状态,函数只有在得到结果之后才会返回。
非阻塞:值在不能立刻得到结果之前,该函数也会立即返回,不会阻塞当前进程
同步IO:线程启动一个IO操作然后就进入等待状态,直到IO操作完成之后才醒来继续执行
异步IO:线程发送一个IO请求到内核,然后继续处理其他事情,内核完成IO请求后,将会通知线程IO操作完成了
如果IO请求需要大量的时间执行的话,异步文件IO方式可以显著提高效率,因为在线程等待的这段时间内,CPU将会调度其他线程进行执行,如果没有其他线程需要执行的话,这段时间将会浪费掉(可能会调度操作系统的零页线程)。如果IO请求操作很快,用异步IO方式反而还低效,还不如同步IO。
同步IO在同一时刻只允许一个IO操作,因此,对于同一个文件句柄的IO操作时序列化的,即使使用两个线程也不能同时对同一个文件句柄同时发出读写操作。异步IO(重叠IO)允许一个或多个线程同时发出IO请求。
网络IO的模型大致包括下面几种:
(1)同步模型(synchronous IO)
- 阻塞IO(bloking IO)
- 非阻塞IO(non-blocking IO)
- 多路复用IO(multiplexing IO)
- 信号驱动式IO(signal-driven IO)
(2)异步IO(asynchronous IO)
- 异步IO
阻塞IO模型:用户进程启动一个IO操作后就进入阻塞状态,直到数据被拷贝到用户进程空间,用户进程才解除阻塞状态,默认情况下,所有的套接字都是阻塞的
非阻塞IO模型:当所请求的IO操作没有完成时,进程不会阻塞,可以去做其他事情,但它会轮询(每隔一段时间去询问一次),以查看IO操作是否完成,直到数据被拷贝到用户进程空间