- 网络编程关注的问题
- 连接建立
- 连接断开
- 消息到达
- 消息发送
- 网络io职责
- 操作io
- 读写缓冲区
再次回顾用户空间和内核空间,并回忆中级调度
// 默认情况下,fd 是阻塞的,设置非阻塞的方法如下; // F_GETFL 关键字 int flag = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flag | O_NONBLOCK);
- 检测io
- reactor
io多路复用
- 用来检测IO
- 非阻塞 io
- 只用来操作IO
- reactor 是异步事件吗?
- 是,它里面 针对io 的处理是 异步回调的方式。
- reactor为什么搭非阻塞io? (由三方面讨论)
- 多线程环境
- 将一个listenfd放到多个epoll去处理
2.边缘触发下
- 读事件触发时,read在一次事件循环中把read buffer读空
select bug
1:01:00
man select
是不是i0多路复用一定要搭配非阻塞0?
- redis
- 环境
- key-value
- 多种 数据结构
- 内存数据库
- 命令处理是单线程的。
为什么? 1:21:20
- 并不是整体是单线程,
- 为什么要使用 单reactor
- redis 怎么处理的 reactor
- redis 针对 reactor 做了哪些优化
- memcached
nginx
同步IO
操作IO
1.accept 函数的 作用:
操作什么?
检测什么?
2.连接的断开
1.主动
- close
- 关闭双方
- 清理资源
- shutdown
- 关闭单方面
2.被动
- read = 0;读端关闭
- write = -1 && errno = EPIPE;写端关闭 (EPIPE 代表写端关闭,这个在哪里说明/定义 的?)
- 引出服务器的半关闭状态。 联系上文的shutdown 分析。
3.连接到达
- read
- 操作什么?
- 检测什么?
4.消息发送
- write
- 操作什么?
- 检测什么?
检测IO
- 链接建立时候,主动连接时,怎么监听写事件? 谁来监听? 谁来写? 写什么饿?给谁写?
- IO多路复用时,是怎么检测的?过程是怎么样的? 怎么和握手流程结合?
- epoll 38:00
- 是一种系统调用方式,实现的是IO 多路复用
- epoll IO多路复用,是没有阻塞、非阻塞之说。
- 如何证明: epoll_wait()函数, 最后一个参数 timeOut 的填值,-1 时阻塞, 44:00
- 由 connect 这个 IO函数,的检测 方式, 扩展 epoll 、select、poll 的检测方式这两种大类型的不同?
- errnumber
- 检测详细的事件,检测模糊的事件。
- 惊群:
- 边缘触发:
水平触发:
服务器高级架构体系:https://xxetb.xet.tech/s/4DEnTI