I/O:指的是计算机的input和output
Linux 的 I/O
-
磁盘I/O
-
网络I/O : 一切皆文件,本质为对socket文件的读写
磁盘 I/O
-
进程向内核发起系统调用,请求磁盘上的某个资源比如是html文件或者图片,
-
然后内核通过相应的驱动程序将目标文件加载到内核的内存空间,
-
加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间。
网络 I/O
网络通信就是网络协议栈到用户空间进程的IO就是网络IO
-
1.用户发送http请求报文到达web服务器网卡
-
2.网卡将收到的请求报文复制到内核空间
-
3.内核空间再把请求复制到用户空间的应用程序
-
4.应用程序分析请求并把请求发送给内核
-
5-6.内核将磁盘上的文件加载到内核空间,
-
7.内核空间将数据复制到用户空间
-
8.用户空间封装响应报文发送给内核空间
-
9.内核空间再通过网卡将响应报文发送出去。
I/O 模型
I/O 模型相关概念:
同步和异步:
关注的是消息的通知机制(调用者和被调用者之间的消息通知关系)
同步:sync
被调用者不提供事件的处理结果。需要调用者主动讯问
A安排B干一件事,B干完了A不问,B就不说
异步:async
被调用者通过状态通知机制主动告诉被调用者自己的状态。
A安排B干一件事,B干完了A不问,B也要主动说。
阻塞和非阻塞:
阻塞:blocking
结果返回前,干不了别的的事。
A找B干活,B没做完之前,A不能做别的事。
非阻塞:noblocking
A找B干活,B没做完,A就去做别的事。
网络 I/O 模型
阻塞型、非阻塞型、复用型、信号驱动型、异步
阻塞型(同步阻塞):
进程向内核请求数据,如果内核没准备好数据,就会去磁盘找数据,找到数据后再给进程。
程序向内核发送I/O请求后一直等待内核响应,如果内核处理请求的IO操作不能立即返回,则进程将一直等待并不再接受新的请求
非阻塞型 I/O 模型:
用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据 到达后,才真正读取到数据,继续执行
问题:
即 “轮询”机制会大量消耗CPU资源
多路复用 I/O 型:
通过一个代理程序,用户将这些请求交给代理程序,代理程序集中用户的请求后,统一交给系统内核处理,用户只需要等待代理程序返回结果就行。
三种代理程序:select,poll,epoll
优点:可以基于一个阻塞对象,同时在多个描述符上等待就绪,而不是使用多个线程
缺点:当连接数较少时效率相比多线程+阻塞 I/O 模型效率较低,可能延迟更大,因为单个连接处
理需要2次系统调用,占用时间会有增加
信号驱动式 I/O 模型:
用户进程不轮询,也不傻等着内核准备数据。让内核在数据就绪时(内核空间数据准备好了,准备拷到用户空间的内存中),发送信号通知进程
优点:此模型的优势在于等待数据报到达期间进程不被阻塞。用户主程序可以继续执行,只要等待来自信号处理函数的通知。
缺点:信号 I/O 在大量 IO 操作时可能会因为信号队列溢出导致没法通知
异步 I/O 模型:
异步I/O 与 信号驱动I/O最大区别在于:
信号驱动是内核通知用户进程何时开始一个I/O操作,
而异步I/O是由内核通知用户进程I/O操作何时完成数据的准备(内核空间数据准备好了,也将数据拷贝到用户进程了),两者有本质区别,相当于不用去饭店场吃饭,直接点个外卖,把等待上菜的时间也给省了
标签:请求,模型,阻塞,用户,内核,Linux,进程,调用者 From: https://www.cnblogs.com/heyongshen/p/16845703.html