当前位置: 首页 > article >正文

webtinyserver讲解

---------
能帮到你的话,就给个赞吧 😘
********

服务器分析与设计

服务器的工作

要分析,首先得知道服务器都干什么。

服务器所需工作:

  1. 检测套接字有无io
  2. 进行io
  3. 业务处理 
class Server {
private:

public:
	void run();

};

void Server::run() {

	//1.检测套接字有无io    //检测套接字集合,返回有io的套接字集合withIoSocks
	epoll / poll / select(socks, timeout);		//无须知道epoll/poll/select是什么,只须知道它们是检测套接字io一种方法即可
												

	for (oneIoSock = withIoSocks.begin(); oneIoSock != withIoSocks.begin(); oneIoSock++) {
		//2.进行io        //一个io
		io(oneIoSock);
		//3.业务处理      //处理一个业务  
		businessProcess(oneBusiness);
	}
}

//入口线程
int main() {


	Server server();

	server.run();

}

但是很明显,上述代码有严重的效率问题。

  1. businessProcess必须等io执行完

也就是依赖或者叫同步,但不重要,重要的是我们明显不想这样做

可以解耦的关键?

操作的依赖到底是数据还是操作

两个场景,饭堂与快递柜

饭堂喊号:

顾客的身份是相对饭而言。饭是7 你也是7

处理http请求

1.解析

2.根据url和请求体做相应的处理

3.生成响应

4.注册监听

定时器

使用信号实现定时器

进程与信号

进程可以向系统注册一些进程需要处理的信号。这样,当注册的信号发生时,系统会中断进程,进程执行信号处理函数。

多线程时,系统将会随机发送一个信号给线程。

信号并发时,暂写

sigaction结构体

默认用sa_handler,若sa_flags设置SA_SIGINFO,则用sa_sigaction。

sa_mask:线程执行信号处理时,屏蔽sa_mask中的信号(不会再被中断)。待执行完后,再处理屏蔽间发生的信号。若某信号屏蔽间发生多次,也只处理一次。

定时信号-alarm

alarm(n);n秒后向进程发送定时信号SIGALRM

信号处理流程-统一处理

信号处理函数是随机一个线程执行的,如果想统一由主线程处理,则可以通过管道和epoll实现。

线程接收信号并不做处理,而是将信号发送给主线程,主线程再做处理。

具体的

主线程循环触发定时信号,信号处理函数并不做处理,而是通过管道pipe[0]发送给pipe[1],而pipe[1]是添加到epoll中的,所以,主线程可以通过epoll统一监听处理。

定时器设计

定时器并非是倒计时,而是正计时。例如倒计时5秒,并不是5减到0,而是当前时刻往后加5秒,例如当前1秒,倒计时5秒,则截止时间为6秒。然后再检查当前时间是否>6秒,大于则超出倒计时,小于则未超出。当然检查并非每时每刻都检查,而是隔一段时间一检查。例如5秒,可以隔一秒一检查。也就是alarm(1)。

定时器可以说就一个东西,截止时间。

然而我们要一次检查所有定时器,也就是容器的设计,要快速地筛出超时定时器。

webtinyserver中用的是升序链表。

简单概括

循环触发alarm(n),然后检查定时器是否超时。

由此可见,定时器设计本身和alarm无关系,而alarm的作用也仅是检查的频率。

待解决问题:

并发模型缺点-半同步半反应堆:

  1. 双缓冲对列
  2. 工作线程少

3.定时器优化

4.数据库连接封装

5.优化整体代码

开发问题:

1.epoll et/le 与 套接字 阻塞非阻塞关系

2.生产者消费者-条件变量模型

3.请求对列存函数对象

4.解析失败时怎么做

5.epoll监听一次后还要重新注册才能再监听吗

参考:

解耦、削峰、异步的理解_异步削峰解耦_咯噔哟的博客-CSDN博客


http://www.kler.cn/a/578745.html

相关文章:

  • pytorch retain_grad vs requires_grad
  • 电路研究9.3.1——合宙Air780EP中的AT开发指南:TCP 使用 SSL 示例
  • 关于VScode终端无法识别外部命令
  • mysql安装(演示为mac安装流程)
  • 使用 Python 批量提取 PDF 书签:一款实用工具的实现
  • Hadoop集群搭建(一)安装jdk
  • Nacos高频面试题10个
  • 深度学习与数据挖掘题库:401-500题精讲
  • 技术领域,有许多优秀的博客和网站
  • 基于PaddleNLP使用DeepSeek-R1搭建智能体
  • 【Linux篇】:Linux常用工具全解析--探索高效的工具宝藏
  • 生活反思公园散步与小雨遇记
  • Opencv之掩码实现答题卡识别及正确率判断
  • 《从零开始构建视频同步字幕播放软件》
  • React:Redux
  • Deeplabv3+改进1:添加CBAM注意力机制|有效涨点
  • 大道至简:道法自然的应用秘诀
  • Python实例:PyMuPDF实现PDF翻译,英文翻译为中文,并按段落创建中文PDF
  • 整理一下arcGis desktop版本软件, 从入门到精通需要学习的知识点
  • 苦瓜书盘官网,免费pdf/mobi电子书下载网站