IO多路复用——select

仅一个线程、进程处理并发

IO多路转接(复用)之select

        跨平台适用linux,windows  底层:线性表

IO多路转接(复用)之poll

        适用linux  底层:线性表

IO多路转接(复用)之epoll

        适用linux  底层:红黑树(效率高)

多线程/多进程并发和IO多路转接的并发处理流程进行对比(服务器端):

多线程/多进程并发

  • 主线程/父进程:调用 accept()监测客户端连接请求
  • 如果没有新的客户端的连接请求,当前线程/进程会阻塞
  • 如果有新的客户端连接请求解除阻塞,建立连接
  • 子线程/子进程:和建立连接的客户端通信
  • 调用 read() / recv() 接收客户端发送的通信数据,如果没有通信数据,当前线程/进程会阻塞,数据到达之后阻塞自动解除
  • 调用 write() / send() 给客户端发送数据,如果写缓冲区已满,当前线程/进程会阻塞,否则将待发送数据写入写缓冲区中

IO多路转接并发

  • 使用IO多路转接函数委托内核检测服务器端所有的文件描述符(通信和监听两类),这个检测过程会导致进程/线程的阻塞,如果检测到已就绪的文件描述符阻塞解除,并将这些已就绪的文件描述符传出
  • 根据类型对传出的所有已就绪文件描述符进行判断,并做出不同的处理
  • 监听的文件描述符:和客户端建立连接
  • 此时调用accept()是不会导致程序阻塞的,因为监听的文件描述符是已就绪的(有新请求)
  • 通信的文件描述符:调用通信函数和已建立连接的客户端通信
  • 调用 read() / recv() 不会阻塞程序,因为通信的文件描述符是就绪的,读缓冲区内已有数据
  • 调用 write() / send() 不会阻塞程序,因为通信的文件描述符是就绪的,写缓冲区不满,可以往里面写数据

与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

select

 函数原型

#include<sys/select.h>
struct timeval {time_t      tv_sec;         /* seconds */suseconds_t tv_usec;        /* microseconds */
};int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds, struct timeval * timeout)

返回值:三个集合所有满足条件的文件描述符的个数

函数参数:

nfds:委托内核要检测检测的文件描述符中最大的一个 + 1

        线性表实现,这个值是循环结束的条件,不知道就写最大的1024

        在Window中这个参数是无效的,指定为-1即可

readfds: 文件描述符的集合,文件描述符对应的读缓冲区
writefds: 文件描述符的集合,文件描述符对应的写缓冲区
exceptfds:文件描述符的集合,文件描述符是否有异常状态

timeout:指定select函数检测的时长,用来强制解除select()函数的阻塞的
        NULL:函数检测不到就绪的文件描述符会一直阻塞。
        等待固定时长(秒):函数检测不到就绪的文件描述符,在指定时长之后强制解除阻塞,函数返回0
        0:不等待,函数不会阻塞。

初始化fd_set类型的参数
// 将文件描述符fd从set集合中删除 == 将fd对应的标志位设置为0        
void FD_CLR(int fd, fd_set *set);
// 判断文件描述符fd是否在set集合中 == 读一下fd对应的标志位到底是0还是1
int  FD_ISSET(int fd, fd_set *set);
// 将文件描述符fd添加到set集合中 == 将fd对应的标志位设置为1
void FD_SET(int fd, fd_set *set);
// 将set集合中, 所有文件文件描述符对应的标志位设置为0, 集合中没有添加任何文件描述符
void FD_ZERO(fd_set *set);

内核实现细节

在select()函数中第2、3、4个参数都是fd_set类型,它表示一个文件描述符的集合,类似于信号集 sigset_t,这个类型的数据有128个字节,也就是1024个标志位,和内核中文件描述符表中的文件描述符个数是一样的。

这块内存中的每一个bit 和 文件描述符表中的每一个文件描述符是一一对应的关系

首先,将要检测的集合在内核中做了一份拷贝,内核基于拷贝的集合进行检测

下图fd_set中存储了要委托内核检测读缓冲区的文件描述符集合。

  • 如果集合中的标志位为0代表不检测这个文件描述符状态

如果集合中的标志位为1代表检测这个文件描述符状态

内核在遍历这个读集合的过程中,如果被检测的文件描述符对应的读缓冲区中没有数据,内核将修改这个文件描述符在读集合fd_set中对应的标志位,改为0,如果有数据那么这个标志位的值不变,还是1。然后将结果更新到送检的读集合:

select处理服务器并发操作

基本流程

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

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

相关文章

Perl的文本艺术:精通格式化输入输出

Perl的文本艺术&#xff1a;精通格式化输入输出 Perl以其在文本处理方面的卓越能力而闻名&#xff0c;其中格式化输入输出是Perl的强大特性之一。格式化提供了一种灵活的方式来定义输入和输出数据的布局和外观。本文将详细介绍Perl中的格式化输入输出的使用&#xff0c;并提供…

Ecovadis评估方案

在当今全球供应链日益复杂且环保意识日益增强的背景下&#xff0c;EcoVadis评估方案作为一种领先的可持续发展评估工具&#xff0c;正逐步成为企业衡量其社会责任与环境绩效的重要标尺。EcoVadis通过一套全面而细致的评价体系&#xff0c;帮助企业识别其在可持续发展方面的优势…

pdf自动生成书签

PDF 自动生成书签&#xff0c;使用软件【PDF补丁丁】 软件官网&#xff1a; https://www.cnblogs.com/pdfpatcher/Github&#xff1a;https://github.com/wmjordan/PDFPatcher参考视频内容&#xff1a;使用PDFPatcher自动生成PDF书签 直接从软件官网下载压缩包&#xff0c;运…

【日常记录】【JS】JS中查询参数处理工具URLSearchParams

文章目录 1. 引言2. URLSearchParams2.1 URLSearchParams 的构造函数2.2 append() 方法2.3 delete() 方法2.4 entries() 方法2.5 forEach() 方法2.6 get() 方法2.7 getAll() 方法2.8 has() 方法2.9 keys() 方法2.10 set() 方法2.11 toString() 方法2.12 values() 方法 参考链接…

百度搜索X唐朝诡事录跨界联动影视智能体,集追剧探案于一体!

想必这几天大家都已经被 #唐朝诡事录好看#、#唐朝诡事录你真的火了# 刷屏了&#xff0c;时隔两年&#xff0c;霸榜热门大剧《唐朝诡事录之西行》终于火热回归啦&#xff01; 一文一武双男主设定只为专心攻破悬案&#xff0c;正反派全都智商在线&#xff0c;是一部不可多得的良…

PaliGemma:A versatile 3B VLM for transfer

1.model 1.1 Architecture 图像分辨率为固定的正方形,224,448,896,这导致每种模型都有固定数量的图像token,256,1024,4096。图像在最前面,无需特殊的位置标记,BOS标记文本的开始,\n作为SEP token,不出现在前缀中,单独对SEP进行标记,以避免它与前缀的结束或后缀的…

web自动化3-常用鼠标+键盘事件

# 鼠标右键 from selenium.webdriver import ActionChains # 鼠标右键操作模拟chehui driver.find_element(By.XPATH, //*[text()"我是小海呀2"]) rightClick ActionChains(driver) # 实例化ActionChains类 time.sleep(2) rightClick.context_click(chehui).perf…

Navicat图形化管理工具安装教程

1、Navicat简介 Navicat 是一套快速、可靠的数据库管理工具&#xff0c;专为简化数据库的管理及降低系统管理成本而开发。它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat使用直觉化的图形用户界面&#xff0c;让用户能够安全简单的方式创建、组织、访问并共用信…

SpringBoot集成Nacos服务注册发现

参考文档 springboot集成nacos服务注册发现中心_nacos-discovery-spring-boot-starter-CSDN博客 依赖 <dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-discovery-spring-boot-starter</artifactId><version>0.2.8&l…

Python爬虫技术 第16节 XPath

XPath是一种在XML文档中查找信息的语言&#xff0c;尽管XML和HTML在语法上有区别&#xff0c;但XPath同样适用于HTML文档的解析&#xff0c;尤其是在使用如lxml这样的库时。XPath提供了一种强大的方法来定位和提取XML/HTML文档中的元素和属性。 XPath基础 XPath表达式由路径表…

如何检查代理IP地址是否被占用

使用代理IP时&#xff0c;有时候会发现IP仍然不可用&#xff0c;可能是因为已经被其他用户或者网络占用了。为了检测代理IP是否被占用&#xff0c;我们可以采用一些方法进行验证测试&#xff0c;以保证代理IP的有效性和稳定性。 1.ARP缓存方法 ARP缓存法是一种简单有效的检测代…

Cesium 实现点击获取实体的 ID 值

文章目录 需求分析需求 点击球体上加载的实体,获取该实体的 ID 值 分析 var handler = new Cesium.ScreenSpaceEventHandler(this.map.scene.canvas); // 创建鼠标事件handler const that = this handler.setInputAction(</

Tinygrad,llama3,Reward Model

目录 Tinygrad 与其他框架的比较 llama3 Reward Model Tinygrad 是一个轻量级的深度学习框架,由George Hotz(也被称为geohot)开发。以下是对Tinygrad的详细介绍: 与其他框架的比较 与PyTorch、TensorFlow等更全面的深度学习框架相比,Tinygrad在功能上可能有所限制,…

Unity UGUI 之 事件接口

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本&#xff0c;请注意分别 1.什么是事件接口&…

【github】使用KeepassXC 解决github Enable two-factor authentication (2FA) 第二因子认证

下载 https://github.com/keepassxreboot/keepassxc/releases/download/2.7.9/KeePassXC-2.7.9-Win64.msi 代理地址 https://dgithub.xyz/keepassxreboot/keepassxc/releases/download/2.7.9/KeePassXC-2.7.9-Win64.msi 由于该软件不允许截图&#xff0c;以下操作参考官网 …

JavaScript模拟滑动手势

双击回到顶部 左滑动 右滑动 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Gesture…

力扣高频SQL 50题(基础版)第八题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第八题1581. 进店却未进行过交易的顾客题目说明思路分析实现过程准备数据&#xff1a;实现方式&#xff1a;结果截图&#xff1a;总结&#xff1a; 力扣高频SQL 50题&#xff08;基础版&#xff09;第八题 1581. 进店…

.NET Core 发展历程和版本迭代

.NET Core的发展历程和版本迭代可以归纳如下&#xff1a; 目录 一、起源与发展&#xff08;2010-2016&#xff09; 二、成熟与优化&#xff08;2017-2019&#xff09; 三、整合与统一&#xff08;2020至今&#xff09; 四、版本特性简述 五、版本更新迭代的功能区别 .NET…

jenkins删除历史构建记录

1、 登录jenkins&#xff0c;进入【Manage Jenkins】-【Script Console】&#xff0c;输入&#xff1a; def jobName "Test" //删除的项目名称 def maxNumber 60 // 保留的最小编号&#xff0c;意味着小于该编号的构建都将被删除 Jenkins.instance.getItemByFullN…

mybatis 多数据源 TDataSource required a single bean, but 2 were found

情况说明&#xff1a; 项目中本来就有一个数据源了&#xff0c;运行的好好的后来又合并了另一个项目&#xff0c;另一个项目也配置了数据源。 于是出现了如下错误&#xff1a; mybatis 多数据源 TDataSource required a single bean, but 2 were found 解决方法&#xff1a…