阻塞/非阻塞描述的是函数,指访问某个函数时,函数是否会立即返回,是否阻塞线程

异步/同步描述的是数据读写的方式,同步是指由用户的线程参与读写,异步是指内核线程发起读写,用户只需关注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操作是否完成,直到数据被拷贝到用户进程空间