目录
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模式的问题:
l
poll
利用链表解决了
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