Webserver项目解析

一.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):

workerThreadRun:pthread_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. 继续处理任务队列中的任务

三、总体流程

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/82491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【张兔兔送书第一期:考研必备书单】

考研书单必备 《数据结构与算法分析》《计算机网络:自顶向下方法》《现代操作系统》《深入理解计算机系统》《概率论基础教程(原书第10版》《线性代数(原书第10版)》《线性代数及其应用》赠书活动 八九月的朋友圈刮起了一股晒通知…

【架构篇】Supabase架构和功能介绍

Supabase是什么 Supabase将自己定位为Firebase的开源替代品,提供了一套工具来帮助开发者构建web或移动应用程序。Supabase是建立在Postgres之上的,Postgres是一个免费的开源数据库,被认为是世界上最稳定、最先进的数据库之一。Supabase对标F…

C++DAY10 结构体·结构体指针

结构体指针的作用&#xff1a; 通过指针访问结构体中的成员。 *利用操作符->可以通过结构体指针访问结构体属性。 #include<iostream> using namespace std; //1、创建结构体 struct student {string name;int age;int FS; };int main() {//2、创建结构体变量struc…

《Envoy 代理:云原生时代的流量管理》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

C# Onnx Yolov8 Detect Poker 扑克牌识别

效果 效果一般&#xff0c;可下载数据集自己训练 Demo下载 数据集下载

SaaS架构C/S检验科LIS系统源码: 检验申请、标本编号、联机采集

适用于医院检验科实际需要的LIS管理系统, 实现检验业务全流程的计算机管理。从检验申请、标本编号、联机采集、中文报告单的生成与打印、质控图的绘制和数据的检索与备份。通过将所有仪器自身提供的端口与科室LIS系统中的工作站点连接,实现与医院HIS系统的对接。 通过门诊医生和…

docker-compose使用

docker-compose docker的项目编排 一、安装docker-compose Rocky Linux Rocky Linux安装Docker Compose的步骤如下&#xff1a; 安装Docker。您可以使用以下命令安装Docker&#xff1a; sudo dnf install docker-ce docker-ce-cli containerd.io安装Docker Compose。您可以…

java项目之抗疫医疗用品销售平台ssm+jsp

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的抗疫医疗用品销售平台。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框…

今天的消费情况

1、今天消费1710元 意外险 住院--集中参保 校---******----服 1220 rmB lunch 240Rmb

腾讯mini项目-【指标监控服务重构】2023-07-30

今日已办 调研 CPU & Memory Cadivisor &#xff23;adivisor -> Prometheus -> (Grafana / SigNoz Web) google/cadvisor: Analyzes resource usage and performance characteristics of running containers. (github.com) services:cadvisor:image: gcr.io/ca…

linux 磁盘命令之du和df命令

du相关的命令: du -ah 显示所有目录或文件所占空间 du -KG 显示所有目录或文件所占空间 块大小K为单位 du -BM 显示所有目录或文件所占空间 块大小M为单位 du -BG 显示所有目录或文件所占空间 块大小G为单位du -sh [目录名] 返回该目录的大小 du -sm [文件夹] 返回该文…

Jtti:nodejs怎么更新MySQL数据库

要更新MySQL数据库&#xff0c;您可以使用Node.js中的mysql模块。以下是一个简单的示例代码&#xff0c;用于更新数据库中的数据&#xff1a; javascript const mysql require(mysql); // 创建连接 const connection mysql.createConnection({ host: localhost, user: your_m…

短信、邮箱验证码本地可以,部署到服务器接口却不能使用

应对公司双验证要求&#xff0c;对本系统做邮箱、短信验证码登录&#xff0c;本地开发正常发送&#xff0c;到服务器上部署却使用失败&#xff0c;已全部解决&#xff0c;记录坑。 一、nginx拦截 先打开你的服务器 nginx.conf 看看有没有做接口拦截。&#xff08;本地可能做Sp…

爬虫逆向实战(32)-某号店登录(RSA、补环境、混淆)

一、数据接口分析 主页地址&#xff1a;某号店 1、抓包 通过抓包可以发现登录接口是/publicPassport/login.do 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现&#xff0c;有三个加密参数&#xff1a;username、password、captchaTok…

70、Spring Data JPA 的 自定义查询(全手动,自己写完整 SQL 语句)

1、方法名关键字查询&#xff08;全自动&#xff0c;既不需要提供sql语句&#xff0c;也不需要提供方法体&#xff09; 2、Query查询&#xff08;半自动&#xff1a;提供 SQL 或 JPQL 查询&#xff09; 3、自定义查询&#xff08;全手动&#xff09; ★ 自定义查询&#xff08…

c++运算符重载

运算符重载 同类&#xff1a;对象1 运算符 对象2——c1 c2 调用运算符重载方法计算 基本使用 #include <iostream>class ComplexNumber { private:double real;double imaginary;public:ComplexNumber(double r, double i) : real(r), imaginary(i) {}// 运算符重载&am…

二叉树顺序结构及实现

&#x1f449;二叉树顺序结构及实现 1.二叉树的顺序结构2.堆的概念及结构3.堆的实现3.1堆向下调整算法3.2堆向上调整算法 4.堆的创建4.1堆创建方法14.1.1构建堆结构体4.1.2堆的初始化4.1.3堆数据添加向上调整4.1.4主函数内容 4.2堆的创建方法24.2.1堆数据添加向下调整 4.3堆数据…

Oracle两个日期都存在返回最小/最大的,如果只存在一个就返回存在的日期

Oracle函数 Oracle两个字段日期都存在返回最小的&#xff0c;如果只存在一个就返回存在的日期. 函数说明LEAST(value1, value2, …)最小值GREATEST(value1, value2, …)最大值COALESCE(value1, value2, …)返回第一个不是空值的参数

反转链表:从创建到反转,讲清链表

链表的节点数据结构&#xff1a; package cn.yaunsine.domain;/*** 链表节点数据结构*/ public class ListNode {/*** 元素值*/public int val;/*** 指向下一个节点的指针*/public ListNode next;public ListNode (int val) {this.val val;this.next null;} }创建链表&#…

CAN总线

can总线看起来和485电路很相似&#xff0c;485出来是AB 线&#xff0c;can出来 CAN_HIGH CAN_LOW 2.CAN总线特点 多主控制不像iic 只能一个主机&#xff0c;也没有地址的概念