一.网络io模型
tars服务端的网络io模型是用epoll(边缘触发)做io多路复用 + 非阻塞socket,即Reactor。
如果把线程也纳入考量,那么
- 有多个网络线程,每个网络线程都有自己的epoll实例,即每个网络线程一个Reactor
- 多线程与io:很关键的一点,每个socket fd的read,write,close都只由同一个网络线程操作;这样做的好处很明显,避免了很多竞争条件
- 由于每个fd只由一个网络线程处理,所以网络线程中不能出现耗时比较久的操作(例如长时间的阻塞),否则将阻塞该线程其他的fd事件
总结起来,每个网络线程都是一个基于epoll的循环:
另外,tars还将epoll监听的文件描述符划分为几种类型:
enum
{
ET_LISTEN = 1, //socket listening
ET_CLOSE =