高性能服务器框架

服务器同时监听多个客户请求是通过 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.hqwc.cn/news/259344.html

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

相关文章

vue项目新增弹窗打开时:其中邮箱和密码被默认设置为当前登录的账号和密码

解决方法:就是在input的前后分别再添加一个input(注意截图顺序不能错{密码放前面、邮箱放后面})

Google刚发布AlphaCode 2,让我们码农多了个小伙伴一起干活

除了其Gemini生成式人工智能模型之外,谷歌今天早上发布了AlphaCode 2,这是谷歌DeepMind实验室大约一年前推出的代码生成AlphaCode的改进版本。 事实上,AlphaCode 2实际上由Gemini提供支持,或者至少是由Gemini的某个变体&#xff…

上个月暴涨34.6%后,SoundHound AI股票现在还能买入吗?

来源:猛兽财经 作者:猛兽财经 揭开SoundHound AI股价波动的原因 S&P Global Market Intelligence的数据显示,在摆脱了10月份的大幅下跌后,SoundHound AI的股价在11月份实现了34.6%的涨幅。 原因是该公司公布了稳健的第三季…

基于SSM的java衣服商城

基于SSM的java衣服商城 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型:Java EE项目 项目名称:基于SSM的美衣商城 项目架构:B/S架构 开发语言:Java语言 前端技术:Layui等 后端技术…

python-04(入门基础篇4——lists相关的部分语法)

python-04(入门基础篇4——lists相关的部分语法) 1. 前言1.1 python入门1.2 参考官网 2. 关于索引和切片3. 在列表追加元素3.1 支持拼接3.2 使用list.append() 方法在列表末尾添加新项 4. 列表是可变类型4.1 更改其中某元素内容4.2 使用切片更改列表大小…

深入了解对象与内置构造函数

1. 深入对象 1.1 创建对象的三种方式 1.2 构造函数 语法约定: 总结 构造函数可以快速创建多个对象大写字母开头的函数使用new关键字将对象实例化构造函数不需要返回值自动返回新的对象 new实例化的执行过程 创建空对象this指向对象执行代码,追加新…

云服务器Centos中安装Docker

云服务器Centos中安装Docker 1 简介DockerCentosCentos和Ubuntu区别 2 安装3 测试hello-world的镜像测试 1 简介 Docker Docker是一个开源的应用容器引擎,利用操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化。它支持将软件编译成…

【超详细教程】FL Studio 21中文破解版,让你的音乐制作更出彩啦!

嗨小仙女们!今天小助理要跟大家分享一个超赞的消息!你们知道吗,FL Studio 21中文破解版终于来啦! FL Studio 21是一款超级火爆的音乐制作软件,不仅功能强大,而且操作简单,适合各种水平的音乐制…

【C语言】操作符详解(一):进制转换,原码,反码,补码

目录 操作符分类 2进制和进制转换 2进制转10进制 10进制转2进制 2进制转8进制和16进制 2进制转8进制 2进制转16进制 原码、反码、补码 操作符分类 操作符中有一些操作符和二进制有关系,我们先铺垫一下二进制的和进制转换的知识。 2进制和进制转换 其实我们经…

vue2中使用jsplumb完成流程图

前言 之前的几个demo都是在vue3中写的,虽然可以直接拿去复用。 但是根据有些看客反馈,想用一个vue2版本的,毕竟很多人开发功能的时间都不是特别富裕。大多时候还是用现成的demo更好一些。 这里我就写一个简易版本的demo,可以实现绘制,并且删除连接线和节点等功能,篇幅也不大…

每天五分钟计算机视觉:稠密连接网络(DenseNet)

本文重点 在前面的课程中我们学习了残差网络ResNet,而DenseNet可以看成是ResNet的后续,我们看一下图就可以看出二者的主要区别了。 特点 DenseNet是一种卷积神经网络,它的特点是每一层都直接连接到所有后续层。这意味着,每一层都接收来自前一层的输出,并将其作为输入传递…

流程画布开发技术方案归档(G6)

🎨 在理想的最美好世界中,一切都是为最美好的目的而设。 —— 伏尔泰 如果可以实现记得点赞分享,谢谢老铁~ 一、技术选型 •从可维护性和可拓展性出发 •基本满足 1:链接: https://github.com/hukaibaihu/vue-org…