From 9a1cc1c1a0f40ae32a134e1787470ced001181f7 Mon Sep 17 00:00:00 2001 From: kurt Date: Fri, 9 Sep 2022 17:34:34 +0800 Subject: [PATCH 1/4] Update design doc --- ...66\345\217\221\346\250\241\345\236\213.md" | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git "a/\345\271\266\345\217\221\346\250\241\345\236\213.md" "b/\345\271\266\345\217\221\346\250\241\345\236\213.md" index d64d3db..01b2ed0 100755 --- "a/\345\271\266\345\217\221\346\250\241\345\236\213.md" +++ "b/\345\271\266\345\217\221\346\250\241\345\236\213.md" @@ -31,14 +31,21 @@ epoll的触发模式在这里我选择了ET模式,muduo使用的是LT,这两 每个SubReactor持有一个定时器,用于处理超时请求和长时间不活跃的连接。muduo中介绍了时间轮的实现和用stl里set的实现,这里我的实现直接使用了stl里的priority_queue,底层是小根堆,并采用惰性删除的方式,时间的到来不会唤醒线程,而是每次循环的最后进行检查,如果超时了再删,因为这里对超时的要求并不会很高,如果此时线程忙,那么检查时间队列的间隔也会短,如果不忙,也给了超时请求更长的等待时间。 -## 核心结构 - -程序中的每一个类和结构体当然都必不可少,其中能体现并发模型和整体架构的,我认为是有两个: - -* Channel类:Channel是Reactor结构中的“事件”,它自始至终都属于一个EventLoop,负责一个文件描述符的IO事件,在Channel类中保存这IO事件的类型以及对应的回调函数,当IO事件发生时,最终会调用到Channel类中的回调函数。因此,程序中所有带有读写时间的对象都会和一个Channel关联,包括loop中的eventfd,listenfd,HttpData等。 -* EventLoop:One loop per thread意味着每个线程只能有一个EventLoop对象,EventLoop即是时间循环,每次从poller里拿活跃事件,并给到Channel里分发处理。EventLoop中的loop函数会在最底层(Thread)中被真正调用,开始无限的循环,直到某一轮的检查到退出状态后从底层一层一层的退出。 - -## Log +## 核心结构设计 + +程序中的每一个类和结构体当然都必不可少,其中能体现并发模型和整体架构的,我认为是有下面几个类: +#### Server类 + Server是http服务器的包装类,主要负责开启端口监听和启动事件主循环(Main Reactor),其中事件主循环会将新的客户端连接accept,并放入epoll监控的fd队列,交由后面EventLoop(Sub Reactor)来和客户端做socket读写通信(借助于Channel类) +#### Channel类 + Channel是Reactor结构中的“事件”,它自始至终都属于一个EventLoop,负责一个文件描述符的IO事件,在Channel类中保存这IO事件的类型以及对应的回调函数,当IO事件发生时,最终会调用到Channel类中的回调函数。因此,程序中所有带有读写事件的对象都会和一个Channel关联,包括loop中的eventfd,listenfd,HttpData等。 +#### EventLoop +One loop per thread意味着每个线程只能有一个EventLoop对象,EventLoop即是事件循环,每次从poller里拿活跃事件,并给到Channel里分发处理。EventLoop中的loop函数会在最底层(Thread)中被真正调用,开始无限的循环,直到某一轮的检查到退出状态后从底层一层一层的退出。 +#### HttpData类 + HttpData是用来读写socket数据,转换解析http 协议的数据,并做对应的业务处理,具体的read/write handler在事件主循环接受新连接时,在HttpData的构造函数中传入,具体见 + ``` + Server::handNewConn() + ``` +## 日志记录设计 Log的实现了学习了muduo,Log的实现分为前端和后端,前端往后端写,后端往磁盘写。为什么要这样区分前端和后端呢?因为只要涉及到IO,无论是网络IO还是磁盘IO,肯定是慢的,慢就会影响其它操作,必须让它快才行。 这里的Log前端是前面所述的IO线程,负责产生log,后端是Log线程,设计了多个缓冲区,负责收集前端产生的log,集中往磁盘写。这样,Log写到后端是没有障碍的,把慢的动作交给后端去做好了。 From 7214709f4c7d2996ce9bc973596e9ea41a63aeac Mon Sep 17 00:00:00 2001 From: dingweiqing Date: Mon, 31 Jul 2023 17:59:58 +0800 Subject: [PATCH 2/4] update --- datum/arch.png | Bin 0 -> 70281 bytes datum/web-arch-uml.png | Bin 0 -> 35198 bytes ...66\345\217\221\346\250\241\345\236\213.md" | 50 +++++++++++++++--- 3 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 datum/arch.png create mode 100644 datum/web-arch-uml.png diff --git a/datum/arch.png b/datum/arch.png new file mode 100644 index 0000000000000000000000000000000000000000..3d641cb6aea1c5be61cd0ce0569aa242256be51c GIT binary patch literal 70281 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

Mhgk*+nPO+&R}2g+I|dSC}rt@ljIyeXu_r< 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 )R&<%yRYm~ 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 literal 0 HcmV?d00001 diff --git "a/\345\271\266\345\217\221\346\250\241\345\236\213.md" "b/\345\271\266\345\217\221\346\250\241\345\236\213.md" index 01b2ed0..1954b36 100755 --- "a/\345\271\266\345\217\221\346\250\241\345\236\213.md" +++ "b/\345\271\266\345\217\221\346\250\241\345\236\213.md" @@ -15,6 +15,7 @@ 本程序使用的并发模型如下图所示: ![并发模型](https://github.com/linyacool/WebServer/blob/master/datum/model.png) +![并发模型](/datum/arch.png) MainReactor只有一个,负责响应client的连接请求,并建立连接,它使用一个NIO Selector。在建立连接后用Round Robin的方式分配给某个SubReactor,因为涉及到跨线程任务分配,需要加锁,这里的锁由某个特定线程中的loop创建,只会被该线程和主线程竞争。 @@ -32,19 +33,54 @@ epoll的触发模式在这里我选择了ET模式,muduo使用的是LT,这两 每个SubReactor持有一个定时器,用于处理超时请求和长时间不活跃的连接。muduo中介绍了时间轮的实现和用stl里set的实现,这里我的实现直接使用了stl里的priority_queue,底层是小根堆,并采用惰性删除的方式,时间的到来不会唤醒线程,而是每次循环的最后进行检查,如果超时了再删,因为这里对超时的要求并不会很高,如果此时线程忙,那么检查时间队列的间隔也会短,如果不忙,也给了超时请求更长的等待时间。 ## 核心结构设计 +![Web结构类图](/datum/web-arch-uml.png) 程序中的每一个类和结构体当然都必不可少,其中能体现并发模型和整体架构的,我认为是有下面几个类: #### Server类 - Server是http服务器的包装类,主要负责开启端口监听和启动事件主循环(Main Reactor),其中事件主循环会将新的客户端连接accept,并放入epoll监控的fd队列,交由后面EventLoop(Sub Reactor)来和客户端做socket读写通信(借助于Channel类) -#### Channel类 - Channel是Reactor结构中的“事件”,它自始至终都属于一个EventLoop,负责一个文件描述符的IO事件,在Channel类中保存这IO事件的类型以及对应的回调函数,当IO事件发生时,最终会调用到Channel类中的回调函数。因此,程序中所有带有读写事件的对象都会和一个Channel关联,包括loop中的eventfd,listenfd,HttpData等。 -#### EventLoop -One loop per thread意味着每个线程只能有一个EventLoop对象,EventLoop即是事件循环,每次从poller里拿活跃事件,并给到Channel里分发处理。EventLoop中的loop函数会在最底层(Thread)中被真正调用,开始无限的循环,直到某一轮的检查到退出状态后从底层一层一层的退出。 -#### HttpData类 - HttpData是用来读写socket数据,转换解析http 协议的数据,并做对应的业务处理,具体的read/write handler在事件主循环接受新连接时,在HttpData的构造函数中传入,具体见 +Server是http服务器的包装类,主要负责开启端口监听和启动事件主循环(Main Reactor). Sub Reactor是一个线程池,每个线程都是不断获取事件并处理。其中事件主循环会将新的客户端连接accept,并从sub reactor中选择一个新的线程,并放入这个线程监控的fd队列,由这个线程来处理后续的读写事件。 +#### EventLoopThreadPool 线程池 +这个类作用是管理线程 +#### EventLoopThread 实现了reactor的可运行实体 +这个类作用是将reactor实体化,变成机器中可运行的线程 +#### EventLoop 对应于反应堆理论模型中的reactor +**Poller** 事件获取器 +不断调用epoll_wait系统调用,获取新的active事件 +**Event Handler** 事件处理器 对于上一步poll出的事件,回调响应的处理接口,这一层是和业务处理和结合点 +总的来看,EventLoop即是事件循环,每次从poller里拿活跃事件,并给到Channel里分发处理。 +具体见代码 +``` +void EventLoop::loop() { + assert(!looping_); + assert(isInLoopThread()); + looping_ = true; + quit_ = false; + // LOG_TRACE << "EventLoop " << this << " start looping"; + std::vector ret; + while (!quit_) { + // cout << "doing" << endl; + ret.clear(); + //事件获取器 + ret = poller_->poll(); + eventHandling_ = true; + //事件处理器 + for (auto& it : ret) it->handleEvents(); + eventHandling_ = false; + doPendingFunctors(); + poller_->handleExpired(); + } + looping_ = false; +} +``` + +#### Epoll类 +提供操作epoll系统调用的工具类 +#### HttpData类 业务类的处理接口 +HttpData是用来读写socket数据,转换解析http 协议的数据,并做对应的业务处理,具体的read/write handler在事件主循环接受新连接时,在HttpData的构造函数中传入,具体见 ``` Server::handNewConn() ``` +#### Channel类 表示通信模型中的信道,向下对接网络通信的,向上对接业务层 + Channel是Reactor结构中的“事件”,它自始至终都属于一个EventLoop,负责一个文件描述符的IO事件,在Channel类中保存这IO事件的类型以及对应的回调函数,当IO事件发生时,最终会调用到Channel类中的回调函数。因此,程序中所有带有读写事件的对象都会和一个Channel关联,包括loop中的eventfd,listenfd,HttpData等。 ## 日志记录设计 Log的实现了学习了muduo,Log的实现分为前端和后端,前端往后端写,后端往磁盘写。为什么要这样区分前端和后端呢?因为只要涉及到IO,无论是网络IO还是磁盘IO,肯定是慢的,慢就会影响其它操作,必须让它快才行。 From 3b20e072da225946b920f93b1bd4442aaef7b423 Mon Sep 17 00:00:00 2001 From: dingweiqing Date: Mon, 31 Jul 2023 18:02:09 +0800 Subject: [PATCH 3/4] update doc --- "\345\271\266\345\217\221\346\250\241\345\236\213.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/\345\271\266\345\217\221\346\250\241\345\236\213.md" "b/\345\271\266\345\217\221\346\250\241\345\236\213.md" index 1954b36..d49e728 100755 --- "a/\345\271\266\345\217\221\346\250\241\345\236\213.md" +++ "b/\345\271\266\345\217\221\346\250\241\345\236\213.md" @@ -45,7 +45,8 @@ Server是http服务器的包装类,主要负责开启端口监听和启动事 #### EventLoop 对应于反应堆理论模型中的reactor **Poller** 事件获取器 不断调用epoll_wait系统调用,获取新的active事件 -**Event Handler** 事件处理器 对于上一步poll出的事件,回调响应的处理接口,这一层是和业务处理和结合点 +**Event Handler** 事件处理器 +对于上一步poll出的事件,回调响应的处理接口,这一层是和业务处理和结合点. 总的来看,EventLoop即是事件循环,每次从poller里拿活跃事件,并给到Channel里分发处理。 具体见代码 ``` From 247843e5cca13f4ec699e3e787c6be52e142db7f Mon Sep 17 00:00:00 2001 From: dingweiqing Date: Tue, 1 Aug 2023 09:59:48 +0800 Subject: [PATCH 4/4] update doc --- "\345\271\266\345\217\221\346\250\241\345\236\213.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/\345\271\266\345\217\221\346\250\241\345\236\213.md" "b/\345\271\266\345\217\221\346\250\241\345\236\213.md" index d49e728..d7be1e0 100755 --- "a/\345\271\266\345\217\221\346\250\241\345\236\213.md" +++ "b/\345\271\266\345\217\221\346\250\241\345\236\213.md" @@ -44,7 +44,7 @@ Server是http服务器的包装类,主要负责开启端口监听和启动事 这个类作用是将reactor实体化,变成机器中可运行的线程 #### EventLoop 对应于反应堆理论模型中的reactor **Poller** 事件获取器 -不断调用epoll_wait系统调用,获取新的active事件 +不断调用epoll_wait系统调用,获取新的active事件 **Event Handler** 事件处理器 对于上一步poll出的事件,回调响应的处理接口,这一层是和业务处理和结合点. 总的来看,EventLoop即是事件循环,每次从poller里拿活跃事件,并给到Channel里分发处理。 @@ -81,7 +81,7 @@ HttpData是用来读写socket数据,转换解析http 协议的数据,并做 Server::handNewConn() ``` #### Channel类 表示通信模型中的信道,向下对接网络通信的,向上对接业务层 - Channel是Reactor结构中的“事件”,它自始至终都属于一个EventLoop,负责一个文件描述符的IO事件,在Channel类中保存这IO事件的类型以及对应的回调函数,当IO事件发生时,最终会调用到Channel类中的回调函数。因此,程序中所有带有读写事件的对象都会和一个Channel关联,包括loop中的eventfd,listenfd,HttpData等。 +Channel是Reactor结构中的“事件”,它自始至终都属于一个EventLoop,负责一个文件描述符的IO事件,在Channel类中保存这IO事件的类型以及对应的回调函数,当IO事件发生时,最终会调用到Channel类中的回调函数。因此,程序中所有带有读写事件的对象都会和一个Channel关联,包括loop中的eventfd,listenfd,HttpData等。 ## 日志记录设计 Log的实现了学习了muduo,Log的实现分为前端和后端,前端往后端写,后端往磁盘写。为什么要这样区分前端和后端呢?因为只要涉及到IO,无论是网络IO还是磁盘IO,肯定是慢的,慢就会影响其它操作,必须让它快才行。