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

这里写目录标题

  • 引入
    • 场景
  • 多进程并发服务器
    • 二级目录
    • 二级目录
    • 二级目录
  • 多线程并发服务器
    • 二级目录
    • 二级目录
    • 二级目录
  • 多路IO转接服务器
    • 设计思路
      • 对比
      • 引入
    • select函数简介
      • 参数介绍
        • 第一个参数
        • 第234参数
        • 返回值
        • 对于第234参数的应用
        • 对于最后一个参数
        • 总结
  • 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。
因为底层是位图,所以我们肯定会做一些位操作,那么位操作也有对应的函数,如下图
在这里插入图片描述

对于最后一个参数

在这里插入图片描述

总结

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

epoll进阶

二级目录

二级目录

二级目录

一级目录

二级目录

二级目录

二级目录

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

跳绳计数,YOLOV8POSE

跳绳计数&#xff0c;YOLOV8POSE 通过计算腰部跟最初位置的上下波动&#xff0c;计算跳绳的次数

栈和队列(Java实现)

栈和队列&#xff08;Java实现&#xff09; 栈 栈(Stack)&#xff1a;栈是先进后出&#xff08;FILO, First In Last Out&#xff09;的数据结构。Java中实现栈有以下两种方式&#xff1a; stack类LinkedList实现&#xff08;继承了Deque接口&#xff09; &#xff08;1&am…

【C语言入门】浮点型数据在内存中的存储

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;C语言 个人主页&#xff1a;Celias blog~ 目录 ​编辑 引言 引例 一、浮点型在内存中的存储方式 1.1 …

Linux 时间系统调用

UNIX及LinuxQ的时间系统是由「新纪元时间」Epoch开始计算起。Epoch是指定为1970年1月1日凌晨零点零分零秒&#xff0c;格林威治时间。目前大部份的UNX系统都是用32位来记录时间&#xff0c;正值表示为1970以后&#xff0c;负值则表示1970年以前。 对于当前时间到Epoch 我们用两…

2024蓝桥杯每日一题(DFS)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;奶牛选美 试题二&#xff1a;树的重心 试题三&#xff1a;大臣的差旅费 试题四&#xff1a;扫雷 试题一&#xff1a;奶牛选美 【题目描述】 听说最近两斑点的奶牛最受欢迎&#xff0c;…

后端系统开发之——创建SpringBoot工程

原文地址&#xff1a;后端框架系统开发之——创建SpringBoot工程 - Pleasure的博客 下面是正文内容&#xff1a; 前言 现在的市场环境&#xff0c;如果你单单只是作为前端工程师或者是后端工程师&#xff0c;在开发Web应用的时候都需要去读取企业提供的接口文档。而当你前后端…

没想到打脸这么快,AI程序员已经出发了!

大家好啊&#xff0c;我是豆小匠。 先介绍一下本期的主角&#xff1a;Devin&#xff0c;世界上第一位AI程序员&#xff0c;由2023年11月成立的10人初创公司Cognition AI开发。 1. AI程序员已经能做到什么程度 3月13日&#xff0c;Cognition AI公司在X平台&#xff08;原推特&…

关于volatile与指令重排序的探讨

写在开头 在之前的学习我们了解到&#xff0c;为了充分利用缓存&#xff0c;提高程序的执行速度&#xff0c;编译器在底层执行的时候&#xff0c;会进行指令重排序的优化操作&#xff0c;但这种优化&#xff0c;在有些时候会带来 有序性 的问题。 那何为有序性呢&#xff1f;…

LeetCode Python - 57. 插入区间

目录 题目描述解法方法一&#xff1a;排序 区间合并方法二&#xff1a;一次遍历 运行结果方法一&#xff1a;排序 区间合并方法二&#xff1a;一次遍历 题目描述 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需…

MySQL语法分类 DQL(1)基础查询

//语法 select 字段列表 from 表名列表 where条件列表 group by分组字段 having 分组后的条件 order by排序 limit 分页限定为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),ma…

数据的响应式:实现动态数据驱动的技巧

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

rt-thread之通讯协议modbus软件包的使用记录(lwip+modbus组合)

前言 使用freemodbus软件包使用网口通讯(sallwip)ip地址使用dhcp动态获取 软件包 相关宏定义 /*-----------------------------------------NET 宏定义-------------------------------------------*/#define RT_USING_SAL #define SAL_INTERNET_CHECK /* Docking with prot…

App拉新必备!Xinstall渠道追踪,让每一分钱都花在刀刃上

在移动互联网时代&#xff0c;App已经成为人们日常生活中不可或缺的一部分。然而&#xff0c;对于App开发者来说&#xff0c;如何有效地进行拉新&#xff0c;提高用户留存率&#xff0c;一直是一个难题。而渠道追踪&#xff0c;作为App推广过程中的重要环节&#xff0c;往往被忽…

Prometheus + Grafana 监控解决方案介绍及部署

Prometheus Grafana 监控解决方案介绍 Prometheus&#xff08;普罗米修斯&#xff09;是一套开源的 监控&报警&时间序列 数据库 的组合&#xff0c;起始是由SoundCloud公司开发。 随着发展&#xff0c;越来越多公司和组织接受采用Prometheus&#xff0c;社区也十分活…

【Spark编程基础】RDD 编程初级实践(附源代码)

目录 一、实验目的二、实验平台三、实验内容1.spark-shell 交互式编程2.编写独立应用程序实现数据去重3.编写独立应用程序实现求平均值问题 一、实验目的 1、熟悉 Spark 的 RDD 基本操作及键值对操作&#xff1b; 2、熟悉使用 RDD 编程解决实际具体问题的方法 二、实验平台 …

【LabVIEW FPGA入门】浮点数类型支持

如今&#xff0c;使用浮点运算来设计嵌入式系统的需求变得越来越普遍。随着 FPGA 因其固有的大规模并行性而在浮点性能方面继续超越微处理器&#xff0c;这种情况正在加剧。线性代数和数字信号处理 (DSP) 等高级算法可以受益于浮点数据类型的高动态范围精度。LabVIEW FPGA 通过…

【Godot4自学手册】第二十五利用PointLight2D节点点缀夜晚灯光

夜晚来临了&#xff0c;少不了灯光的出现&#xff0c;今天就用PointLight2D节点来实现夜晚的忽闪忽闪灯光效果。 一、添加场景 1、添加PointLight2D场景 单击添加新节点按钮&#xff0c;在场景面板中选择其他节点&#xff0c;在弹出创建Node对话框中选择 PointLight2D&#…

Vue中使用Lodash

Vue中使用Lodash 前言安装Lodash引用方法vue中使用1、cloneDeep 深拷贝2、uniq 数组去重3、uniqWith 数组对象去重 isEqual 深度比对4、intersection 提取数组相同元素5、chunk 数组切分6、compact去除假值7、reject:根据条件删除指定的值8、find:查找结果的第一个值9、filter:…

基于sortablejs实现拖拽element-ui el-table表格行进行排序

可以用原生的dragstart、drag、dragend、dragover、drop、dragleave实现这个效果&#xff0c;但是有现成的轮子就不要重复造了&#xff0c;看效果&#xff1a; <template><el-table :class"$options.name" :data"tableData" ref"table"…

Android Kotlin知识汇总(一)编程语言

在 2019 年 Google I/O 大会上宣布今后将优先采用 Kotlin 进行 Android 开发。Kotlin 是一种富有表现力且简洁的编程语言&#xff0c;不仅可以减少常见代码错误&#xff0c;还可以轻松集成到现有应用中。如果您想构建 Android 应用&#xff0c;建议您从 Kotlin 开始着手&#x…