高性能服务器框架

news/2025/3/14 18:19:03/

服务器同时监听多个客户请求是通过 select 系统调用实现的;

1.1 服务器编程框架

IO 处理单元、逻辑单元、网络存储单元(可选)

请求队列是各单元之间通信方式的抽象;

1.2 IO 模型

(1)阻塞 IO:阻塞的文件描述符
非阻塞 IO:非阻塞的文件描述符

(2)针对阻塞 IO 执行的系统调用可能因无法立即完成而被操作系统挂起,可能被阻塞的包括 accept、send、recv、connect

(3)针对非阻塞 IO 执行的系统调用总是立即返回,即使事件没有发生;如果事件没有立即发送,返回 -1,此时需要根据 errno 来区分是出错还是事件未发生;

accept、send、recv而言,事件未发生时 errno 通常被设置为 EAGAIN 或 EWOULDBLOCK;对 connect,被设置为 EINPROGRESS;

要和其他 IO 通知机制一起使用,比如 IO 复用或 SIGIO 信号;

(4)异步IO:总是立即返回,真正的读写操作由内核完成,向应用程序通知的是 IO 完成事件;

同步 IO:用户代码自行执行 IO 操作,向应用程序通知的是 IO 就绪事件,之后应用调用 IO 读写;

1.3 事件处理模式

同步 IO 模型常用于实现 Reactor,异步 IO 模型用于实现 Proactor

1.3.1 Reactor

在这里插入图片描述

主线程负责插入就绪事件到请求队列中;
工作线程从请求队列中取出事件后,根据事件类型决定如何处理;

1.3.2 Proactor

将所有 IO 操作交给主线程和内核来处理,工作线程仅仅负责业务逻辑;
在这里插入图片描述
socket 上的读写事件是通过 aio_read / aio_write 向内核注册的,内核通过信号向应用程序报告 IO 完成事件;

1.3.3 模拟Proactor

在这里插入图片描述
主线程执行数据的读写操作;

1.4 并发模式

IO 处理单元和多个逻辑单元之间协调完成任务的方法;

1.4.1 半同步/半异步模式

(1)这里的同步是指程序完全按照代码序列顺序执行;

异步指程序的执行需要由系统事件驱动,如中断、信号等;

(2)同步线程用于处理客户逻辑,异步线程用于处理 IO 事件;

1.4.2 领导者/追随者模式

1.5 有限状态机

1.5.1 字符串处理函数
char* strpbrk(char *str1, char *str2)

判断 str1 中的字符是否在 str2 中出现,若出现,返回指针指向 str1 中第一个满足条件的位置,否则,返回 NULL;

*p++ --> (*p)++
// 用来比较参数s1 和s2 字符串,比较时会自动忽略大小写
// 返回值:若参数 s1 和 s2 字符串相同则返回0。
// s1 大于s2 长度则返回大于0 的值,s1 若小于s2 长度则返回小于 0 的值。
// 返回的绝对值为第一个不相等字符之间的差值(ASCII码之间的差值)
int strcasecmp (const char *s1, const char *s2);
//  返回 str1 中第一个不在字符串 str2 中出现的字符下标
size_t strspn(const char *str1, const char *str2);

http://www.ppmy.cn/news/1262434.html

相关文章

rust入门(rust教程、rust安装方法)

文章目录 Rust开发入门Rust的特性Rust的应用场景Rust安装——环境配置1. 安装rustup具体执行步骤 2. 验证安装 Rust的卸载基本语法变量与数据类型控制流函数 Rust的所有权系统错误处理实战:构建一个小项目创建新项目编写代码运行项目安装相关链接器运行 删除项目 Ru…

【华为OD题库-081】最长的元音子串长度-Java

题目 题目描述: 定义当一个字符串只有元音字母一(a,e,i,o,u,A,E,l,O,U)组成, 称为元音字符串,现给定一个字符串,请找出其中最长的元音字符串,并返回其长度,如果找不到请返回0, 字符串中任意一个连续字符组成…

Linux安全学习路标

1. 操作系统基础知识 首先,你需要建立坚实的操作系统基础知识,包括Linux文件系统和目录结构、Linux进程管理、权限管理等基本概念。 2. 网络和通信安全 学习关于网络和通信安全的基础知识,包括TCP/IP协议栈、网络攻击类型、防火墙配置、网…

Mysql日志binlog、redolog、undolog

Mysql有多种日志,承担着不同的功能。 BinLog高可用的基石 Binlog是Mysql的server层记录的日志,包含表结构和数据的变更。Binlog有两个常用的作用,一个是用作数据库恢复,通过数据库快照和binlog,我们可以把数据库恢复…

React中使用TypeScript代替prop-types

原文链接 公众号-React中使用TypeScript代替prop-types 个人公众号,呜呜呜,求各位大佬们关注下,本人的公众号主要写React 跟NodeJs的 ​关于prop-types 对于部分的同学,不大了解为什么我们的代码里面要用到prop-types这个库&a…

UE5 - 把ArchvizExplorer项目改造成自己的数字孪生项目 - 开发记要

参考: https://blog.csdn.net/qq_17523181/article/details/133853099 https://blog.csdn.net/qq_17523181/article/details/134455597 1. 安装项目 https://www.unrealengine.com/marketplace/zh-CN/product/archviz-explorer https://karldetroit.com/archviz-exp…

Go语言初始化数组的六种方式

介绍 在Go语言中,有多种方式可以初始化数组,本文将介绍初始化数组的六种方法。 方式1:指定数组大小并初始化 var array [3]int [3]int{1, 2, 3}指定数组的大小为3,并初始化为指定的值1, 2, 3。 方式2:根据初始化值…

使用 nnUNetv2 的一些踩坑记录(或许还会有继续更新

nnUNet 依然是最鲁棒的分割网络。今年初原作者更新了 nnUNet 的第二版即 nnUNetv2,题主近期试用的时候有一些踩坑的地方进行记录。 没有官方提供的预训练权重 官方文档在一个非常不起眼的角落提及了,v2版本尚无预训练权重可直接使用,有相关…