I/O模型浅析总结

参考:
 
 
一般而言,一次I/O分为两个阶段:
一是,“等待数据”,内核等待数据从磁盘加载到内核内存;
二是,“等待复制完成”,数据从内核内存复制到进程内存;
 
阻塞:进程发起I/O调用,未完成之前,当前进程会被挂起。
非阻塞:进程发起I/O调用,被调用函数完成之前不会阻塞当前进程而是立即返回。
注意:以上是针对于调用者如何被处理的角度。
 
同步:进程发起一个过程调用(功能、函数)后,在没得到结果之前,该调用将不会返回。
异步:进程发起一个过程调用,即便调用者不能立即得到结果,但调用却会返回,返回一个未完成状态,当调用完成后, 内核会自行通知调用者已经OK。
注意:以上是针对于被调用者如何响应请求者的调用。
 
内存映射:mmap(解决I/O第二阶段的内核内存数据复制到进程内存的等待过程)
 
I/O模型:
 
同步
同步阻塞:I/O两个阶段均阻塞
同步非阻塞:I/O一阶段非阻塞(盲等待),二阶段阻塞
I/O复用  select()、poll():I/O两阶段均阻塞,但是该模型能同时响应多个I/O请求
 
异步
事件驱动 epoll() 、wqueue():I/O一阶段非阻塞,二阶段阻塞
      边缘触发(一次通知)
      水平触发(多次通知)
AIO(异步非阻塞):I/O两阶段均非阻塞
 
SystemV:poll()、epoll()
BSD:select()、wqueue()
 
Nginx支持事件驱动epoll、边缘触发以及mmap机制。
 
 

猜你喜欢

转载自www.cnblogs.com/wplvqj/p/10537249.html