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

news2024/10/7 14:32:04

这里写目录标题

  • 引入
    • 场景
  • 多进程并发服务器
    • 二级目录
    • 二级目录
    • 二级目录
  • 多线程并发服务器
    • 二级目录
    • 二级目录
    • 二级目录
  • 多路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.coloradmin.cn/o/1525580.html

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

相关文章

一招搞定:教你用苹果手机截取滚屏网页

打开Safari浏览器&#xff0c;进入需要截取的网页。 点击屏幕底部的分享按钮&#xff0c;即中间有一个向上箭头的矩形图标。 在弹出的分享菜单中&#xff0c;向左滑动找到“截屏”选项&#xff0c;点击后选择“整页”。 系统会自动将网页保存为PDF文件&#xff0c;并自动打开…

【Redis知识点总结】(五)——Redis实现分布式锁

Redis知识点总结&#xff08;五&#xff09;——Redis实现分布式锁 setnxsetnx expiresetnx expire lua脚本set nx exset nx ex 随机值set nx ex 随机值 lua脚本set ex nx 随机值 lua脚本 锁续期RedissonRedLock 在Redis的众多应用场景中&#xff0c;分布式锁是Redis比…

Ypay源支付2.8.8免授权聚合免签系统

本帖最后由 renleixiaoxu 于 2024-3-15 09:46 编辑 产品介绍 XPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。采用全新轻量化的界面UI&#xff0c;让您可以更加方便快捷地解决 知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的Thin…

算法练习:前缀和

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

预应力锚杆测力计安装埋设

锚杆测力计用于观测预应力锚杆预应力的形成与变化。当前&#xff0c;预应力锚杆广泛地应用于岩土工程的锚固结构中&#xff0c;通过安装测力计观测锚杆&#xff0c;可以了解锚固力的形成与变化&#xff0c;从而保证监测工程的质量与安全。测力计的安装包括安装测力计和观测锚杆…

【LeetCode热题100】 226. 翻转二叉树(二叉树)

一.题目要求 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;…

餐饮店引流活动方案与最佳营销方案揭秘

想开实体店或正在创业的朋友们&#xff0c;大家好&#xff01;我是一名资深的实体店创业者&#xff0c;本人经营鲜奶吧5年时间&#xff0c;做的是社区店&#xff0c;今天我将分享一些餐饮店引流活动和营销方案的干货&#xff0c;希望能给大家带来一些启发和帮助。 一、引流活动…

【人工智能】英文学习材料02(每日一句)

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; 目录 Supervised Learning&#xff08;监督学习&#xff09; Unsupervised Learning&#xff08;无监督学习 &#xff09; Semi-supervised Learning&#…

【视频图像取证篇】模糊图像增强技术之色彩空间类滤波器场景应用小结

【视频图像取证篇】模糊图像增强技术之色彩空间类滤波器场景应用小结 模糊图像增强技术之色彩空间HSI滤波器—【蘇小沐】 &#xff08;一&#xff09;色彩空间滤波器 1、HSI滤波器 HSI&#xff08;色调、饱和度和强度&#xff09;滤镜用于将彩色图像转换为 HSI 图像。这意味…

当贝X5 Ultra坚果N1S Ultra哪个好?2024年旗舰投影仪哪家强

家用投影仪在目前年轻用户新家装修的娱乐选择上&#xff0c;有着越来越大的占比。不过虽然投影仪的体验已经逐渐弯道超越传统电视&#xff0c;画面和沉浸感已经抹去了曾经的一些小问题&#xff1b;但仍然有很多雷区和选购的迷惑&#xff0c;以致于在同价位往往陷入不知道哪款更…

展厅设计提高人气的妙招

1、清晰的标识 展厅门口的标识是消费者第一眼能了解到的信息&#xff0c;所以一定要做到简单清楚&#xff0c;在开设专卖店时&#xff0c;就要将标识做到清晰醒目&#xff0c;方便客户寻找。 2、舒适的灯光 灯光是展厅装修中最为重要的一部分&#xff0c;灯光太亮会让人感觉不舒…

基于spring boot的钢材销售管理系统的设计与实现

钢材销售管理系统 摘 要 本系统为用户而设计制作钢材销售管理系统&#xff0c;旨在实现钢材销售智能化、现代化管理。本钢材销售管理自动化系统的开发和研制的最终目的是将钢材销售的运作模式从手工记录数据转变为网络信息查询管理&#xff0c;从而为现代管理人员的使用提供更…

【Docker】使用Docker部署IT运维管理平台CAT

作者怀揣着一个美好的愿景&#xff0c;旨在提升管理效率、推动开源项目的蓬勃发展。 来一杯咖啡与茶&#xff0c;为 IT 运维从业者减轻管理负担&#xff0c;提升管理效率&#xff0c;从繁重无序的工作中解压出来&#xff0c;利用剩余时间多喝一杯休息一下。 这是一个专为 IT 运…

亮点抢先看!4月16-17日,百度Create大会开设“AI公开课”,大咖带你打造赚钱工具

3月16日&#xff0c;2024百度Create AI开发者大会正式开放售票&#xff0c;嘉宾套票定价399元。据悉&#xff0c;本次大会以“创造未来&#xff08;Create the Future&#xff09;”为主题&#xff0c;设有20深度论坛、超30节AI公开课、3000平AI互动体验区和AI音乐节等精彩环节…

AJAX-Promise

Promise 基本使用 定义&#xff1a;Promise对象用于表示一个异步操作的最终完成&#xff08;或失败&#xff09;及其结果值 好处&#xff1a; 1.逻辑更清晰 2.了解axios函数内部运作机制 3.能解决回调函数的问题 // 1.创建Promise对象 const p new Promise((resolve,reject…

【Web】浅聊Hessian反序列化之Resin的打法——远程类加载

目录 前言 原理分析 XString&#xff1a;触发恶意类toString QName的设计理念&#xff1f; 远程恶意类加载Context&#xff1a;ContinuationContext QName&#xff1a;恶意toString利用 hash相等构造 EXP 前言 精神状态有点糟糕&#xff0c;随便学一下吧 首先明确一个…

现代化的轻量级Redis桌面客户端Tiny RDM

​欢迎光临我的博客查看最新文章: https://river106.cn 1、简介 Tiny RDM&#xff08;全称&#xff1a;Tiny Redis Desktop Manager&#xff09;是一个界面现代化的轻量级Redis桌面客户端&#xff0c;支持Linux、Mac和Windows。它专为开发和运维人员设计&#xff0c;使得与Red…

2.shell中的echo命令

目录 概述实践shell结果 结束 概述 echo 命令详解 实践 shell #!/bin/bash # 输出一些变量或打印一些字符串 # 加双引号&#xff0c;空格是会保留的 echo "hello , world" # 不加&#xff0c;不会保留 echo hello , worldvar11 "a b c d&…

基于spring boot实现接口管理平台

数据库结构 /* Navicat MySQL Data TransferSource Server : localhost_3306 Source Server Version : 50724 Source Host : localhost:3306 Source Database : interfaceTarget Server Type : MYSQL Target Server Version : 50724 File Encoding…

Java毕业设计-基于SpringBoot的CSGO赛事管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、参赛战队功能模块4、合作方功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于Spring…