买域名送网站,网站SEM优化如何做,wordpress 搜索 分类,济南哪里做网站好一.webserver的组成部分
Buffer类
用于存储需要读写的数据
Channel类
存储文件描述符和相应的事件#xff0c;当发生事件时#xff0c;调用对应的回调函数
ChannelMap类
Channel数组#xff0c;用于保存一系列的Channel
Dispatcher
监听器#xff0c;可以设置为epo…一.webserver的组成部分
Buffer类
用于存储需要读写的数据
Channel类
存储文件描述符和相应的事件当发生事件时调用对应的回调函数
ChannelMap类
Channel数组用于保存一系列的Channel
Dispatcher
监听器可以设置为epoll类型/select类型/poll类型。
HttpRequest
保存请求状态的类。保存请求行协议版本号等一系列相关信息。
HttpResponse
设置返回响应的相关状态
ThreadPool
线程池保存正在运行或者阻塞的线程
TcpConnection
保存建立的连接还有一系列进行消息传递的相关参数
二.调用流程
1.启动Httpserver服务器
1.初始化TcpServer tcpServerInit
{
listenerInit 绑定设置监听
eventLoopInit 创建事件循环(主线程)
threadPoolInit 创建线程池
}启动httpserver服务器
2.调用tcpServerRun(server)方法
2.1启动线程池
threadPoolRun(server-threadPool)采用for循环创建线程workerThreadInit
并且对创建的线程运行workerThreadRun
workerThreadRunpthread_create创建子线程的同时绑定调用函数subThreadRunningsubThreadRunning:eventLoopRun:启动子线程的反应堆模型循环进行事件处理调用dispatch进行检测如果实现的是EpollDispatcher类则运行的是epoll_wait方法如果检测到了调用fd对应的channel的相应事件的回调函数eventLoopProcessTask 处理任务队列2.2封装监听的套接字
channelInit
添加任务到任务队列
eventLoopAddTask
3.启动反应堆模型
1. 检测有无就绪的事件, 并处理 调用dispatch进行检测如果实现的是EpollDispatcher类则运行的是epoll_wait方法如果检测到了调用eventAtivate传入参数有文件描述符和对应发生的事件eventAtivate根据fd从channelmap取出channel调用发生事件对应的回调函数。
如果是主反应堆处理的是对绑定的端口的监听如果监听到有事件发生调用acceptConnection回调函数和客户端建立连接从线程池中取出一个子线程的反应堆实例, 去处理这个cfd将cfd放到 TcpConnection中处理然后调用eventLoopAddTask把这个任务加到子线程的任务队列。
如果是子反应堆反应堆一直循环调用以下函数dispatch用于调用多分复用eventLoopProcessTask处理任务队列当任务队列存在任务时候根据任务不同类型调用相应的函数。
如果循环检查到任务队列有读请求对接收到的httprequest进行解析读取接收后调用 eventLoopAddTask(conn-evLoop, conn-channel, DELETE);往任务队列添加删除任务。
如果循环检查到任务队列有写请求直接开始发送数据。dispatcher-dispatch(evLoop, 2); // 超时时长 2seventLoopProcessTask(evLoop);add任务 eventLoopAdd函数把对应的channel加入到对应线程的eventLoop的channelMap一般是子线程然后加入到epoll树中监听。
remove任务 eventLoopRemove函数:把对应的channel从对应线程的eventLoop的channelMap一般是子线程移除从epoll树中移除监听。
modify任务 eventLoopModify函数把对应的channel的文件描述符修改在epoll树中的监听事件。
2. 继续处理任务队列中的任务
三、总体流程