目录
1、 1用户空间和内核态空间;
1、 2网络模型-阻塞IO;
1、 3网络模型-非阻塞IO;
1、 4网络模型-IO多路复用;
总结:
编辑
1、 5网络模型-信号驱动IO;
1、 6网络模型-异步IO;
1、 7同步和异步划分;
1、 8Redis网络模型;
1.1 用户空间和内核态空间
1.2 网络模型-阻塞IO
在《UNIX网络编程》一书中,总结归纳了5种IO模型:
- 阻塞IO(Blocking IO)
- 非阻塞IO(Nonblocking IO)
- IO多路复用(IO Multiplexing)
- 信号驱动IO(Signal Driven IO)
- 异步IO(Asynchronous IO)
用程序想要去读取数据,他是无法直接去读取磁盘数据的,他需要先到内核里边去等待内核操作硬件拿到数据,这个过程就是1,是需要等待的,等到内核从磁盘上把数据加载出来之后,再把这个数据写给用户的缓存区,这个过程是2,如果是阻塞IO,那么整个过程中,用户从发起读请求开始,一直到读取到数据,都是一个阻塞状态。
1.3 网络模型-非阻塞IO
1.4 网络模型-IO多路复用
总结:
select模式存在的三个问题:
l能监听的 FD 最大不超过 1024
l每次 select 都需要把所有要监听的 FD 都拷贝到内核空间
l每次都要遍历所有 FD 来判断就绪状态
poll模式的问题:
lpoll 利用链表解决了 select 中监听 FD 上限的问题,但依然要遍历所有 FD ,如果监听较多,性能会下降
epoll模式中如何解决这些问题的?
*基于 epoll 实例中的红黑树保存要监听的 FD ,理论上无上限,而且增删改查效率都非常高
*每个 FD 只需要执行一次 epoll_ctl 添加到红黑树,以后每次 epol_wait 无需传递任何参数,无需重复拷贝 FD 到内核空间
*利用 ep_poll_callback 机制来监听 FD 状态,无需遍历所有 FD ,因此性能不会随监听的 FD 数量增多而下降
1.5 网络模型-信号驱动IO
1.6 网络模型-异步IO
1.7 同步和异步划分
1.8 Redis网络模型
参考文献:
黑马程序员Redis入门到实战教程,深度透析redis底层原理+redis分布式锁+企业解决方案+黑马点评实战项目_哔哩哔哩_bilibili
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: