muduo 补充

muduo简要梳理

       每个处理线程最大有一个EventLoop(启动后进入loop循环-1 监听select事件,2 处理select事件)。
       其他IO线程可以通过runInLoop()转移到当前的EventLoop线程,从而保证多线程安全策略。

TCP新建连接

muduo 补充_第1张图片

TCP断开连接

muduo 补充_第2张图片

公开接口
Buffer:数据读写,
InetAddress:封装IPv4
EventLoop:事件循环(Reactor),每个线程只能有一个EventLoop实体,负责IO和定时器时间分配。
EventLoopThread:启动一个线程,在其中运行EventLoop::loop()
TcpConnection:网络库最核心最复杂的类,封装一次TCP连接,
TcpClient:网络客户端,发起连接重试功能
TcpServer:网络服务端,接收客户端连接
上述类中,TcpConnection生命周期由shared_ptr管理(即用户和库共同控制),Buffer生命周期由TcpConnection控制
其余生命周期由用户控制。

内部接口
Channel:selectable IO channel,负责注册与响应IO事件,处理IO事件。每个Channel对象只负责一个文件描述符(fd)的IO事件分发,但他不拥有这个fd。
是Acceptor、Connector、EventLoop、TimerQueue、TcpConnection的成员,生命周期由后者控制。
Socket:RAII,封装了一个file descriptor,并在析构时关闭fd,是Acceptor、TcpConnection的成员,生命期由后者控制。
SocketsOps:封装各类Sockets系统调用。
Pooler:PollPooler/EPollPooler的基类,是 EventLoop 的成员,只供EventLoop在IO线程调用,因此无需加锁,生命期由后者控制。
PollPooler/EPollPooler--只负责IO多路分发,不负责事件的分发(channel)
Connector:发起TCP连接,是TcpClient的成员,生命期由后者控制。
Acceptor:接受TCP连接,是TcpServer的成员,生命期由后者控制。
TimerQueue:用Timefd实现定时,是是EventLoop的成员,生命期由后者控制。
EventLoopThreadPool:用于创建IO线程池,用于把TcpConnection分配到某个EventLoop线程上,是TcpServer的成员,生命期由后者控制。

1 服务端半关闭机制
1  shutdown仅仅shutdownWrite,state为kConnected->kDisconnecting.
2  此时客户端会收到字节0,按正常逻辑客户端会关闭连接(潜在风险,如果客户端未关闭,则服务端一直处于半关闭状态,消耗系统资源)
3  服务端会收到字节为0的消息,此时再完全关闭handleClose,state为kDisconnecting->kConnected。并在loop中移除channel。

3 Buffer设计

muduo 补充_第3张图片
 

内部使用  std::vector buffer_ ,易于使用,方便管理,是一块连续内存,初始默认1024B。
包含readIndex,writeIndex元素,分别指向读位置与写位置(读位置结尾),将内存分为三部分(prependable,readable,writable)
扩容:Buffer自适应大小,每写一次数据,writeIndex向后滑动相应位置,每读一次数据,readIndex向后滑动响应位置。
当writable到达最尾部时有数据写入,先检测readIndex前空闲容量是否够用,如果够用则将readIndex,writeIndex同时向前滑动,否则扩大vector容量。

你可能感兴趣的:(C++,网络,网络,tcp/ip)