Skip to content

Commit 9a1cc1c

Browse files
committed
Update design doc
1 parent 7e18602 commit 9a1cc1c

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

并发模型.md

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,21 @@ epoll的触发模式在这里我选择了ET模式,muduo使用的是LT,这两
3131

3232
每个SubReactor持有一个定时器,用于处理超时请求和长时间不活跃的连接。muduo中介绍了时间轮的实现和用stl里set的实现,这里我的实现直接使用了stl里的priority_queue,底层是小根堆,并采用惰性删除的方式,时间的到来不会唤醒线程,而是每次循环的最后进行检查,如果超时了再删,因为这里对超时的要求并不会很高,如果此时线程忙,那么检查时间队列的间隔也会短,如果不忙,也给了超时请求更长的等待时间。
3333

34-
## 核心结构
35-
36-
程序中的每一个类和结构体当然都必不可少,其中能体现并发模型和整体架构的,我认为是有两个:
37-
38-
* Channel类:Channel是Reactor结构中的“事件”,它自始至终都属于一个EventLoop,负责一个文件描述符的IO事件,在Channel类中保存这IO事件的类型以及对应的回调函数,当IO事件发生时,最终会调用到Channel类中的回调函数。因此,程序中所有带有读写时间的对象都会和一个Channel关联,包括loop中的eventfd,listenfd,HttpData等。
39-
* EventLoop:One loop per thread意味着每个线程只能有一个EventLoop对象,EventLoop即是时间循环,每次从poller里拿活跃事件,并给到Channel里分发处理。EventLoop中的loop函数会在最底层(Thread)中被真正调用,开始无限的循环,直到某一轮的检查到退出状态后从底层一层一层的退出。
40-
41-
## Log
34+
## 核心结构设计
35+
36+
程序中的每一个类和结构体当然都必不可少,其中能体现并发模型和整体架构的,我认为是有下面几个类:
37+
#### Server类
38+
Server是http服务器的包装类,主要负责开启端口监听和启动事件主循环(Main Reactor),其中事件主循环会将新的客户端连接accept,并放入epoll监控的fd队列,交由后面EventLoop(Sub Reactor)来和客户端做socket读写通信(借助于Channel类)
39+
#### Channel类
40+
Channel是Reactor结构中的“事件”,它自始至终都属于一个EventLoop,负责一个文件描述符的IO事件,在Channel类中保存这IO事件的类型以及对应的回调函数,当IO事件发生时,最终会调用到Channel类中的回调函数。因此,程序中所有带有读写事件的对象都会和一个Channel关联,包括loop中的eventfd,listenfd,HttpData等。
41+
#### EventLoop
42+
One loop per thread意味着每个线程只能有一个EventLoop对象,EventLoop即是事件循环,每次从poller里拿活跃事件,并给到Channel里分发处理。EventLoop中的loop函数会在最底层(Thread)中被真正调用,开始无限的循环,直到某一轮的检查到退出状态后从底层一层一层的退出。
43+
#### HttpData类
44+
HttpData是用来读写socket数据,转换解析http 协议的数据,并做对应的业务处理,具体的read/write handler在事件主循环接受新连接时,在HttpData的构造函数中传入,具体见
45+
```
46+
Server::handNewConn()
47+
```
48+
## 日志记录设计
4249
Log的实现了学习了muduo,Log的实现分为前端和后端,前端往后端写,后端往磁盘写。为什么要这样区分前端和后端呢?因为只要涉及到IO,无论是网络IO还是磁盘IO,肯定是慢的,慢就会影响其它操作,必须让它快才行。
4350

4451
这里的Log前端是前面所述的IO线程,负责产生log,后端是Log线程,设计了多个缓冲区,负责收集前端产生的log,集中往磁盘写。这样,Log写到后端是没有障碍的,把慢的动作交给后端去做好了。

0 commit comments

Comments
 (0)