一、概念理解
- IO:IO有内存IO、磁盘IO、网络IO,通常说的IO是指后两种。网络IO即为socket读取,socket在linux中被抽象为流,IO可以理解为对流的操作,对于一次IO访问(以read举例)当一个read操作发生时,它会经历两个阶段:
第一阶段:等待数据准备,数据从磁盘拷贝到内核空间。
第二阶段:将数据从内核空间拷贝到进程空间 。 - 阻塞和非阻塞:是函数/方法的实现方式,即在数据就绪之前是立刻返回还是等待。
- 同步和异步:同步就是当有多个任务或事件时,一个任务的执行会导致整个流程的暂时等待,没办法并发执行;异步就是当有多个任务或事件时,可以并发的执行。
二、五种IO模型
-
阻塞IO模型
传统的IO模型,即在读写数据过程中会发生阻塞现象。
用户线程发起一个IO(调用IO函数)请求时,内核会查看数据是否准备ok,如果没有准备就绪,线程就会一直等待,线程处于阻塞状态,用户线程交出cpu。直到数据准备完毕,内核将数据拷贝到用户内存,将结果返回到用户线程(IO函数返回成功),用户才解除阻塞状态。
如图:
(1)当调用recv()函数时,系统首先检查是否有准备好的数据,如果数据没有准备好,那么系统就处于等待状态;
(2)当数据准备好后