- 什么是IO?
简略来说就是输入输出
- 网络IO经验步骤
- 用户在获取网络资源是在进入网卡,通过网络七层模型将申请交给nginx用户过程
- 用户过程无奈间接获取磁盘上的资源,会将申请获取什么资源翻译并转发给内核,内核驱动磁盘寻道找到文件(最耗时间的环节)
- 文件同样也不能间接交给用户过程,首先磁盘将文件放至内核缓冲区,而后内核告知用户过程申请的资源后果已筹备好(耗时比拟短)
- 内核缓冲区将文件拷贝一份至用户过程缓冲区,用户过程拿到文件 构建响应报文,通过http回传给用户
总结:
IO总共要经验两个阶段
1.磁盘读取数据,将数据拷贝至内核缓冲区
2.将内核缓冲区数据拷贝至用户过程缓冲区
- 网络IO模型品种
同步阻塞
比方你要去实现这样一件事件,把水烧开,灌入暖瓶
当初给你一口一般的锅,你也不晓得水什么时候能够烧开,你决定守在旁边期待水开。
这个时候的你是什么也做不了的,是不是感觉很浪费时间
当水开了就须要你把水灌入暖瓶,你还是做不了其余的事件
同步非阻塞
比方还是烧一锅开水,你还是不晓得水什么时候会开,你抉择了另外一个策略,去忙其它的事件然而要时不时看下谁开没开
改良了什么呢?
你能够在空挡工夫忙其它的事件
减少了什么麻烦呢?
- 你得时不时的确认水开没开(就意味着得不停的调用cpu,占用cpu资源)
- 可能你上一次刚看的时候水没开,等你刚看完水开了,那就得等下一次查看的时候能力发现,减少了提早,等你晓得了水开了,本人去把水灌好
Linuxc/c++服务器开发高阶视频学习材料+qun720209036获取
更多视频内容包含C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,P2P,K8S,Docker,TCP/IP,协程,DPDK多个高级知识点分享。
异步阻塞
这个就比拟二了
如果给你一个智能热水壶,水开了会主动的揭示你的,然而你还是要傻傻的等
齐全没有利用好智能热水壶的劣势(不做解释)
同步异步:关注的是音讯的告诉机制
阻塞非阻塞:关注的是在收到后果之前调用者的状态是期待还是忙本人的事件
IO多路复用
还拿烧水的例子
不要你来管水开没开,间接交给一个代理,如果代理名叫select,select在那帮你监控水开没开,捎带他还会看饭有没有煮好,你把所有的事件都交代给它,能够去忙本人的事件了在饭还没熟,水还没开的时候select就处于一个期待的状态,如果这个时候水开了select会水开了的后果写到一个小黑板你能够看到并晓得水开了,不须要你去查看水开没开,接下来由你将烧开的水灌进暖瓶(用户过程前半部分不阻塞,后半部份阻塞)
select、poll、epoll的区别
无论是select、poll、epoll都能够面对多个用户过程的申请,它相当于一个代理人,收集很多用户过程的申请,他帮你从磁盘上获取数据,复制到内核中,那么这个数据筹备没筹备好它的实现机制是不一样的
告诉形式:假如有一个用户数据筹备好了,那么还有很多用户数据还没有筹备好,那么如何告诉?
select和poll是遍历扫描,效率低下
epoll采纳回调机制,epoll会被动告诉,效率更高(nginx反对)
信号驱动IO
举例:比方咱们的智能热水壶我么设定好烧水当前,会给你一个反馈后果为设定胜利,而后你就能够去忙其余的事件了,等到水烧开了会发给你一条短息,这个时候你再回去把水灌入暖瓶
告诉机制: 程度触发:屡次告诉 边缘触发:只告诉一次