五种IO模型

IO:可以理解为将数据从外设到内存,从内存到外设的转移.
IO通常分为两步:①等待数据准备好(可能大部分的时间都是在等待数据准备就绪的过程)②将数据进行拷贝.
所以提升IO效率:尽量减少等待数据的时间.
下面就是常见的5中IO模型.
- 阻塞IO:在内核数据准备好之前,其系统调用函数会一直等待.(注意:所有的套接字,默认都是阻塞方式)阻塞IO中,调用者在等,也会亲自去调用.(同步IO)
如下图所示:
五种IO模型
- 非阻塞IO:如果内核还未将数据准备好,系统调用就会立即返回,然后每过一段时间就会查询数据是否准备好.直到数据准备好并且被读取,就会结束等待.在等待的过程中可能会做其它事情.调用者在等,也会亲自去调用.同步IO
非阻塞的两种方法:①调用非阻塞的借口.②设置为非阻塞.
如下图所示:(非阻塞的轮训方案,对于内核的开销较大,因为需要一直去询问数据是否已经就绪)
五种IO模型
- 信号驱动IO:当数据准备好后,会出发一个信号(SIGIO)给内核.说明数据已经准备好,就可以对数据进行操作了.调用者在等,也会亲自去调用.(同步IO)
五种IO模型
- IO多路转接:同时等待多个文件描述符的就绪状态,只要有一个文件描述符准备就绪,就会被调用.调用者在等,也会亲自去调用.(同步IO)
五种IO模型
- 异步IO:不是调用者在等,调用者也不关心等待的结果,只是在数据拷贝完成时去通知应用程序,这里会结合信号进行实现.如下图所示:
五种IO模型

同步通信与异步通信

  • 同步:
    调用者在没有得到结果之前是不会返回的,一旦收到结果就会立即返回.即调用者会主动等待调用的结果.
  • 异步:
    调用者在调用后就会立即返回,并没有返回结果.而后被调用者得到结果后会通知调用者来处理.
    线程中的同步与异步:
    为了完成某种任务而建立的多个线程,而多个线程会协调它们的工作次序在等待,传递消息时的制约关系,例如:访问临界资源.
    阻塞与非阻塞(关注的是程序在等待调用结果时的状态):
  • 阻塞调用在没有得到结果前,当前线程就会挂起等待直到有结果产生.
  • 非阻塞指即使没有结果也不会挂起阻塞该线程.