网络编程--高并发服务器

这里写目录标题

  • 引入
    • 场景
  • 多进程并发服务器
    • 二级目录
    • 二级目录
    • 二级目录
  • 多线程并发服务器
    • 二级目录
    • 二级目录
    • 二级目录
  • 多路IO转接服务器
    • 设计思路
      • 对比
      • 引入
    • select函数简介
      • 参数介绍
        • 第一个参数
        • 第234参数
        • 返回值
        • 对于第234参数的应用
        • 对于最后一个参数
        • 总结
      • 附加操作(附加四个函数)
      • select总结
      • select函数模型设计思路(用于服务端)
  • epoll进阶
    • 二级目录
    • 二级目录
    • 二级目录

引入

场景

在这里插入图片描述
现在我们有了服务端和客户端(上图均以终端代替)
我们从客户端连接上服务端,可以进行正常的运行,但是如果此时第二个客户端也连接上服务端的话,第二个客户端是无法正常运行的,因为目前我们只能处理单进程,一对一的服务提供,无法进行多个客户端同时连接,所以,就有了高并发服务器

多进程并发服务器

二级目录

二级目录

二级目录

多线程并发服务器

二级目录

二级目录

二级目录

多路IO转接服务器

设计思路

对比

在这里插入图片描述
首先如上图,我们可以看到,之前的多进程并发和多线程并发的设计思路是:
首先服务端会创建一个监听套接字 listen,即lfd,之后该套接字会一直处于阻塞监听状态,循环调用Accept函数,一旦发现有客户端连进来,就生成一个用于连接的cfd套接字,与客户端建立连接,之后lfd再次处于监听,一旦有其他客户端,就让服务端再创建一个用于连接的cfd套接字,去与客户端2连接,…
但是如果这样的话,服务端的压力会很大,服务端会一直处于阻塞监听,所以,我们就引入了多路IO转接服务器

引入

在这里插入图片描述
我们不再使用服务器阻塞监听了,假设我们的服务端是老板,他会雇一个秘书select(由内核实现,我们无需实现),负责监听客户端,首先服务端生成一个lfd监听套接字,然后交给select,select通过lfd来监听客户端,一旦有客户端发起连接请求,会先经过select,之后select接到连接请求之后,将连接请求报告给服务端,服务端只有接到select的通知,才会创建出一个cfd与请求的客户端建立连接,而且这时是确定有客户端要来连接,所以,不用阻塞,直接进行创建然后连接即可,之后把该cfd交给select来管理。
所以,如上图所示的例子的话,select有四个监听,一个负责监听是否有新的客户端来请求连接,其他三个负责监听接收客户端那边发来的信息,反馈给服务端,服务端再将处理完后的结果给到select,select再返回给客户端

这样的机制就叫做响应模式,客户端来请求,服务端才会进行连接,学名叫多路IO转接
而不同的秘书,有着不同的功能,除了select之外,还有俩秘书,分别是poll和epoll

select函数简介

在这里插入图片描述

参数介绍

第一个参数

在这里插入图片描述
首先,在上图左侧是一个文件描述符表,我们要知道,文件描述符是有编号的,他们会收录在文件描述符表中,首先0 1 2 是被占用的,所以,我们自己的文件描述符会从3开始,如上图所示例子的话,我们最大的文件描述符编号是6,但是我们要传入6+1,因为他的内部是一个for循环,循环所有的文件描述符,而循环条件是<,所以应该+1

第234参数

在这里插入图片描述
他们的类型都是文件描述符集合的指针,他们都是传入传出参数,即可以从参数传出内容至函数外(因为他们都是指针)
在这里插入图片描述
对于第二个参数,形参名字是readfds,从名字我们也能知道,他是负责读事件的,实际上,他是负责管理select监听哪几个套接字的读事件,他是一个文件描述符集合,实际上就是套接字集合,因为一个文件描述符对应一个套接字,如上图r,他的集合里是3 5 6,那说明他监听3号5号6号套接字的读事件(读是站在select的视角来说的,也就是select在读取内容(即客户端发送内容给select))。但是只是监听,是否真正发送读事件还是另一回事
如法炮制,第3、4个参数分别是,站在select的视角来说,监听哪些文件描述符的写事件、以及异常事件

返回值

在这里插入图片描述
因为第234都是传入传出参数,他们的返回值还是一个文件描述符集合,返回那些真正执行了对应事件的文件描述符集合(因为传入的只是监听集合,他们是否真正发生对应的事件并不要求)

select函数的返回值是这三个集合返回的文件描述符总数

对于第234参数的应用

在这里插入图片描述
他们是文件描述符集合,实际上底层是一个位图,其中下标分别对应不同编号的文件描述符,而他的值只有0、1,所以对于传入readfds来说,只有3、5、6是1,其他都是0,而对于传出readfds来说,只有5、6是1。
因为底层是位图,所以我们肯定会做一些位操作,那么位操作也有对应的函数,如下图
在这里插入图片描述

对于最后一个参数

在这里插入图片描述

总结

在这里插入图片描述
在这里插入图片描述

附加操作(附加四个函数)

在这里插入图片描述
第一个函数:将某个文件描述符从集合中剔除
第二个函数:判断指定的fd文件描述符是否在集合中
第三个函数:将某个文件描述符加入到集合中
第四个函数:将集合对应的位图中所有的文件描述符对应的二进制位清0

select总结

在这里插入图片描述
在这里插入图片描述
对于该图,可以看到一般将第二个第三个参数设置为NULL,因为那两个不常用,之所以write不常用,是因为这里是指客户端与select函数之间的交互,一般select不会向客户端进行write操作(用到了再设置),所以,可以设置为NULL,这也是为什么select被叫做监听内核

而timeout参数,设置了监听时长、阻塞监听、非阻塞忙轮询,而我们之前介绍说select模型是一种响应式的服务器,那是因为对于服务器来说,是借助了select,实现了响应式,而针对于select自己来说,只能是那三个模式的一种。所以,我们所说的相应式,是针对服务器说的,而不是select。

select函数模型设计思路(用于服务端)

在这里插入图片描述
首先创建一个套接字,返回值为lfd,用于监听连接
之后绑定地址结构
设置监听上限
然后,接下来就要为select函数做准备工作了,创建两个监听集合,均为fd_set类型,之后将allset监听集合清空,然后将lfd加入到allset集合中。然后设置一个循环,?

epoll进阶

二级目录

二级目录

二级目录

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

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

相关文章

【SRE系列之docker容器】--dockerfile镜像优化

dockerfile镜像优化 1.1 镜像优化方法 系统镜像采用ubuntu或者alpine&#xff0c;会比centos少1G左右编写业务镜像时从官网拉取镜像&#xff0c;其余配置根据业务需求再配置编写dockerfile时把不用的安装包卸载或者删除尽量减少run命令的使用&#xff08;一个run命令&#xf…

牛客题霸-SQL入门篇(刷题记录二)

本文基于前段时间学习总结的 MySQL 相关的查询语法&#xff0c;在牛客网找了相应的 MySQL 题目进行练习&#xff0c;以便加强对于 MySQL 查询语法的理解和应用。 以下内容是牛客题霸-SQL入门篇剩余的第 21-39 道题目的 SQL 代码答案。 由于涉及到的数据库表较多&#xff0c;因…

链路聚合实验(华为)

思科设备参考&#xff1a;链路聚合实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 网络设备的链路聚合技术&#xff08;Link Aggregation&#xff09;是一种将多个物理链路捆绑在一起&#xff0c;形成一个逻辑链路的技术。这样做可以增加带宽、提高可靠性和实现负…

(五)OpenOFDM解码

解码 现在我们已经校正了残余 CFO&#xff0c;也校正了通道增益&#xff0c;下一步是将 FFT 输出映射到实际数据位。这是对数据包进行编码的逆过程。 解调&#xff1a;复数到位解交织&#xff1a;对每个 OFDM 符号内的比特进行混洗卷积解码&#xff1a;去除冗余并纠正潜在的位…

C语言学习笔记day8

一维数组冒泡排序法 1. 作用 将乱序的一维数组按照从小到大的顺序排列 2. 原理示意图 3. 代码 #include <stdio.h> #include <stdlib.h> #include <time.h>int main(void) {int a[5] {0};int len sizeof(a) / sizeof(a[0]);int i 0;int j 0;int tmp …

CSS案例-3.背景练习

效果1 用背景加入图标 效果2 将图片设为页面背景,图片主体在中间 效果3 鼠标放到导航栏上会变颜色 知识点 CSS背景 属性 描述 取值 background 复合属性 看独立属性 background-color 背景颜色 <color> background-image 背景图像 none | url background-repeat 背景…

vulhub中GIT-SHELL 沙盒绕过漏洞复现(CVE-2017-8386)

GIT-SHELL 沙盒绕过&#xff08;CVE-2017-8386&#xff09;导致任意文件读取、可能的任意命令执行漏洞。 测试环境 为了不和docker母机的ssh端口冲突&#xff0c;将容器的ssh端口设置成3322。本目录下我生成了一个id_rsa&#xff0c;这是ssh的私钥&#xff0c;连接的时候请指…

算法练习:前缀和

目录 1. 一维前缀和2. 二维前缀和3. 寻找数组中心下标4. 除自身以外数组的乘积5. !和为k的子数字6. !和可被k整除的子数组7. !连续数组8. 矩阵区域和 1. 一维前缀和 题目信息&#xff1a; 题目链接&#xff1a; 一维前缀和思路&#xff1a;求前缀和数组&#xff0c;sum dp[r] …

性能分析调优模型

性能测试除了为获取性能指标外&#xff0c;更多是为了发现性能瓶颈和性能问题&#xff0c;然后针对性能问题和性能瓶颈进行分析和调优。在当今互联网高速发展的时代&#xff0c;结合传统软件系统模型以及互联网网站特征&#xff0c;性能调优的模型可以归纳总结为如图1-5-1所示的…

多线程服务器适用场合

前提 进程”指的是fork(2)系统调用的产物 线程”指的是pthread_create()的产物,因此是宝贵的那种原生线程。而且Pthreads是NPTL的,每个线程由clone(2)产生,对应一个内核的task_struct。 Pthreads是一组线程操作的标准&#xff0c;NPTL是 Native POSIX Thread Library 的缩写&…

【Quixel Mixer】简单介绍

一、下载 官网下载地址&#xff1a;Quixel Mixer - All-in-one texturing & material creation tool 下载好之后双击exe来安装 等待安装完成 下载后打开&#xff0c;新建一个工程和Mix 二、界面介绍 我们先将软件界面分为如下3个部分 1号区域为菜单栏 2号区域介绍 2号…

单头注意力机制(ScaledDotProductAttention) python实现

输入是query和 key-value&#xff0c;注意力机制首先计算query与每个key的关联性&#xff08;compatibility&#xff09;&#xff0c;每个关联性作为每个value的权重&#xff08;weight&#xff09;&#xff0c;各个权重与value的乘积相加得到输出。 import torch import tor…

深入浅出理解 AI 生图模型

目录 引言 一、Stable Diffusion原理 首先 随后 最后 二、DDPM模型 1 资料 2 原理 扩散过程 反向过程 3 公式结论 三、优缺点 优点&#xff1a; 缺点&#xff1a; 四、改进与完事 LDM代表作 原理概括 Latent Space&#xff08;潜空间&#xff09; 五、总结 引…

MC0204 世界警察

世界警察小码哥来谈判了&#xff0c;恐怖分子在银行挟持了 n 个人质&#xff0c;每个人质都所属一个国家&#xff0c;第 i 个人质所属的国家为 ci​&#xff0c;人质排成了一排&#xff0c;位置都是固定的。经过商讨&#xff0c;恐怖分子允许小码哥可以带走任意一段连续区间内的…

关于大根堆,set重载运算符

题目描述 \,\,\,\,\,\,\,\,\,\,制定合理的日程能够帮助利用好时间进行加训&#xff0c;加训和加训。 \,\,\,\,\,\,\,\,\,\,新学期开始了&#xff0c;应该好好学习了&#xff01;凌晨两点整&#xff0c;加睡失败的你在为新一天的各项重要事件制定闹钟。 \,\,\,\,\,\,\,\,\,\, \,…

【SpringBoot】请求与响应参数 IoC与DI 总结

文章目录 ① —— 请求 ——一、简单参数 RequestParam1.1 参数与形参 命名相同1.2 参数与形参 命名不同 二、实体参数2.1 简单实体对象2.2 复杂实体对象 三、数组集合参数3.1 数组3.2 集合 RequestParam 四、日期参数 DateTimeFormat五、JSON参数 RequestBody六、路径参数 Pat…

docker镜像管理基础-3

文章目录 镜像的概念docker镜像层docker存储驱动AUFSOverlayFSDeviceMapper docker registrydocker镜像的制作Docker Hubdocker镜像的获取镜像的生成基于容器制作镜像 镜像的导入与导出 镜像的概念 镜像可以理解为应用程序的集装箱&#xff0c;而docker用来装卸集装箱。 docke…

代码+视频,R语言使用BOOT重抽样获取cox回归方程C-index(C指数)可信区间

bootstrap自采样目前广泛应用与统计学中&#xff0c;其原理很简单就是通过自身原始数据抽取一定量的样本&#xff08;也就是取子集&#xff09;&#xff0c;通过对抽取的样本进行统计学分析&#xff0c;然后继续重新抽取样本进行分析&#xff0c;不断的重复这一过程N&#xff0…

Android的三种动画详解(帧动画,View动画,属性动画)

Android的三种动画详解&#xff08;帧动画、View动画、属性动画&#xff09;_android动画效果大全-CSDN博客 1、帧动画 缺点是&#xff1a;占用内存较高&#xff0c;播放的是一帧一帧的图片&#xff0c;很少使用。 顺序播放预先定义的图片&#xff0c;类似于播放视频。 步骤…