《网络编程实战》学习笔记 Day9

news2025/1/11 8:12:47

系列文章目录

这是本周期内系列打卡文章的所有文章的目录

  • 《Go 并发数据结构和算法实践》学习笔记 Day 1
  • 《Go 并发数据结构和算法实践》学习笔记 Day 2
  • 《说透芯片》学习笔记 Day 3
  • 《深入浅出计算机组成原理》学习笔记 Day 4
  • 《编程高手必学的内存知识》学习笔记 Day 5
  • NUMA内存知识 学习笔记 Day6
  • 《C++并发编程》 学习笔记 Day7
  • 《职场求生攻略》学习笔记 Day8

文章目录

  • 系列文章目录
  • 前言
  • 一、select I/O多路复用模型是什么?(What)
  • 二、select 内核是如何实现的?(Why)
  • 三、如何使用select,demo实验show me the code?(How)
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

学习内容:https://time.geekbang.org/column/article/138948
与知识建立主客体之间的联系:
其实我之前对高性能网络编程接触的少,除了计算机网络基础课TCP协议(三次握手、四次分手)、应用程序对Socket编程+多线程编程的实践理解外,没有真实需求推动,深究的就更少了。八股文背了,可能当时有些概念,过后又忘了。

但随着中间件的设计,团队有时在高并发改造场景,会谈到“poll”类比该I/O多路复用模型。这次真发现了这个网络编程实践专栏高性能篇,将阻塞/非阻塞/异步、I/O多路复用(select、poll、epoll)、多进程/多线程编程模型,三个维度循序渐进的组合起来,一步步揭开、对比、明晰,初看3篇文章概念+实践,和后续目录安排,方觉大快朵颐。


提示:以下是本篇文章正文内容,下面案例可供参考

一、select I/O多路复用模型是什么?(What)

问题场景:
I/O多路复用最初设计解决的场景是:标准输入、套接字等都看做I/O的一路。多路复用的意思是在任何一路有“事件”发生的情况下,通知应用程序去处理相应的I/O事件。而在没有I/O事件触发时,应用程序进程是挂起(阻塞,时间片调度执行其他进程),还是继续做其他事情(在剩余的时间片内)这就是I/O阻塞、非阻塞的维度了。

select之所以大名鼎鼎,可能跟golang通过协程实现高效的I/O多路复用有关。其关键字:select的使用和传播,让该I/O多路复用大名鼎鼎。

从专栏几篇文章看下来,要理解I/O多路复用,除了有开发者应用进程的视角,得理解到要从操作系统内核这个角度看(在序列图中,表示出这个实体)。从而,对比select、poll、epoll多种I/O多路复用模型。

使用select函数,通知内核挂起进程,当一个或多个I/O事件发生后,控制权返还给应用程序,由应用程序进行I/O事件的处理。

草图
在这里插入图片描述

二、select 内核是如何实现的?(Why)

select 函数调用传递给内核的数据结构,概念上是:文件描述符的集合 fd_set
在实现上,是通过INT型的bit位表示集合中的元素,因而也受实现的限制,select支持的I/O多路复用有1024的限制。


int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);

返回:若有就绪描述符则为其数目,若超时则为0,若出错则为-1

在这里插入图片描述
这块我没翻内核源码,之后补上 TODO。

集合数据结构fd_set *readset, fd_set *writeset, fd_set *exceptset传递给内核,其实也暗示了内核的实现,内核根据I/O事件给读文件描述符、写文件描述符、异常文件描述符集合填充数据。

三、如何使用select,demo实验show me the code?(How)

demo:
详见:https://gitee.com/jahentao/experiments/pulls/1/files

调用select函数,传参。
操作宏:

  • FD_ISSET对向量进行检测,判断出对应套接字的元素 a[fd]是 0 还是 1

根据readmask返会的文件描述符判断那一路I/O可读,进而返回控制权处理。


int main(int argc, char **argv) {
    if (argc != 2) {
        error(1, 0, "usage: select01 <IPaddress>");
    }
    int socket_fd = tcp_client(argv[1], SERV_PORT);

    char recv_line[MAXLINE], send_line[MAXLINE];
    int n;

    fd_set readmask;
    fd_set allreads;
    FD_ZERO(&allreads);
    FD_SET(0, &allreads);
    FD_SET(socket_fd, &allreads);

    for (;;) {
        readmask = allreads;
        int rc = select(socket_fd + 1, &readmask, NULL, NULL, NULL);

        if (rc <= 0) {
            error(1, errno, "select failed");
        }

        if (FD_ISSET(socket_fd, &readmask)) {
            n = read(socket_fd, recv_line, MAXLINE);
            if (n < 0) {
                error(1, errno, "read error");
            } else if (n == 0) {
                error(1, 0, "server terminated \n");
            }
            recv_line[n] = 0;
            fputs(recv_line, stdout);
            fputs("\n", stdout);
        }

        if (FD_ISSET(STDIN_FILENO, &readmask)) {
            if (fgets(send_line, MAXLINE, stdin) != NULL) {
                int i = strlen(send_line);
                if (send_line[i - 1] == '\n') {
                    send_line[i - 1] = 0;
                }

                printf("now sending %s\n", send_line);
                size_t rt = write(socket_fd, send_line, strlen(send_line));
                if (rt < 0) {
                    error(1, errno, "write failed ");
                }
                printf("send bytes: %zu \n", rt);
            }
        }
    }

}

我想进一步在GEM5/QEMU仿真中,进行I/O多路复用实验的性能工程对比。


总结

提示:这里对文章进行总结:

今天的学习,我了解了select 函数的使用。select 函数提供了最基本的 I/O 多路复用方法,在使用 select 时,我们需要建立两个重要的认识:

  • 描述符基数是当前最大描述符 +1;
  • 每次 select 调用完成之后,记得要重置待测试集合。

内容来源:
极客时间:20 | 大名⿍⿍的select:看我如何同时感知多个I/O事件

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

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

相关文章

【论文翻译】Non-local Neural Networks

摘要 卷积运算和循环运算都是每次处理一个局部邻域的构建块。在本文中&#xff0c;我们将非局部操作作为一组用于捕获长期依赖关系的构建块。受计算机视觉中经典的非局部均值方法[4]的启发&#xff0c;我们的非局部运算将一个位置的响应计算为所有位置特征的加权和。这个构建块…

「自控原理」5.2 频域稳定判据、频域分析

本节介绍奈奎斯特稳定判据、对数稳定判据&#xff0c;并引入稳定裕度 本节介绍频率特性法分析系统性能 本节介绍通过开环频率特性得到闭环频率特性的方法 文章目录频域稳定判据奈奎斯特稳定判据ZP−2NZP-2NZP−2N奈奎斯特稳定判据的推导对数稳定判据容易判断出错的情况临界稳定…

第九层(4):STL之duque类

文章目录前情回顾deque类deque类的功能deque和vector的区别deque容器的内部图deque类内的构造函数deque类内的赋值操作deque类内的大小操作deque类内的插入操作deque类内的删除操作deque类内的单个访问下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一…

设计模式 - 创建型模式_原型模式

文章目录创建型模式概述Case场景模拟⼯程Bad ImplBetter Impl &#xff08;原型模式重构代码&#xff09;创建型模式 创建型模式提供创建对象的机制&#xff0c; 能够提升已有代码的灵活性和可复⽤性。 类型实现要点工厂方法定义⼀个创建对象的接⼝&#xff0c;让其⼦类⾃⼰决…

AcWing蓝桥杯AB组辅导课08、数论

文章目录前言一、数论例题例题1&#xff1a;AcWing 1246. 等差数列&#xff08;最大公约数&#xff0c;第十届蓝桥杯省赛CB第7题&#xff09;分析题解&#xff1a;最大公约数例题2&#xff1a;AcWing 1295. X的因子链&#xff08;算数基本定理、欧拉筛选&#xff0c;多重集合排…

打工人必知必会(四)——股票期权属于劳动争议吗

目录 参考 一、核心概览 二、 注意 三、更多案例 参考 案例评析:股票期权纠纷是否属于劳动争议 股票期权&#xff08;限制性股票&#xff09;相关劳动争议问题 北上广深杭案例 一、核心概览 二、 注意 结合双方股权激励协议的签署背景、目的等因素来综合考量并作出相对准…

【数据结构】8.1 排序概述

文章目录排序的基本概念排序方法的分类存储结构排序的基本概念 什么是排序&#xff1f; 排序&#xff1a;将一组杂乱无章的数据按照一定规律顺次排列起来。 即&#xff0c;讲无序序列排成一个有序序列&#xff08;有小到大或由大到小&#xff09;的运算。 如果参加排序的数据…

MicroPython开发ESP8266——环境搭建

MicroPython开发ESP8266——环境搭建0.前言一、固件烧写1.使用乐鑫官方的烧写工具2.使用python中的esptool工具烧写3.使用uPyCraft烧写4.测试二、IDE工具安装1.windows环境搭建2.Linux环境搭建3.测试1&#xff09;软件设置2&#xff09;测试程序3&#xff09;烧录0.前言 最近刷…

NLP 语种检测 API 数据接口

NLP 语种检测 API 数据接口 180 语言检测&#xff0c;语种全称与缩写&#xff0c;返回置信度。 1. 产品功能 基于 NLP 分析文本的语种支持 180 多语种检测&#xff1b;语种缩写遵循 ISO 639-1 标准&#xff1b;包含检测到的语种置信度&#xff1b;毫秒级响应性能&#xff1b;…

Java 代码ccflow 代码分析

流程属性目录概述需求&#xff1a;设计思路实现思路分析1。代码流程参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. ha…

Linux中详解编译原理每一步

引言&#xff1a; 时间过的飞快&#xff0c;可以看出我们已经开始学习Linux了&#xff0c;但是我们学习Linux过程中&#xff0c;依然会涉及到很多的以前的知识&#xff0c;比如编译原理&#xff0c;我们的代码如何从一个源文件逐步变成一个可执行文件&#xff0c;当初我记得我…

流批一体计算引擎-8-[Flink]的Table API连接器

参考官方文档Table API连接器 1 Table API连接器概述 Flink的Table API和SQL程序可以连接到其他外部系统&#xff0c;用于读取和写入批处理表和流式表。source表提供对存储在外部系统&#xff08;如数据库、键值存储、消息队列或文件系统&#xff09;中的数据的访问。sink表将…

Sentienl学习笔记

PS&#xff1a;本文为作者学习黑马程序员Springcould视频笔记实际技术参考价值不大&#xff0c;文章将持续更新。 文章目录一. 什么是Sentienl1. 介绍2. 与Hystrix对比3. 主要特性二. Sentienl安装配置1. 下载安装包2. 启动三. Sentienl的使用1. Sentienl的整合2. 簇点链路四. …

每日学术速递1.27

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 前沿推介&#xff1a; ICLR 2023 ICLR 全称为国际学习表征会议&#xff08;International Conference on Learning Representations&#xff09;&#xff0c;今年将举办的是第 11 届&#xff0c;预计将于 5 月 1 日至 5 …

Redis实现附近商铺 | 黑马点评

一、GEO数据结构 1、入门 GEO是Geolocation的缩写&#xff0c;代表地理坐标。redis3.2中加入对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。 常见命令&#xff1a; GEOADD&#xff1a;添加一个地理空间信息&#xff0c;包含&…

springcloud3 Sentinel的服务熔断操作

一 服务熔断 1.1 服务熔断 Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时&#xff08;调用超时或者异常比例升高&#xff09;&#xff0c;对这个资源的调用进行限制&#xff0c;让请求快速失败&#xff0c;避免影响到其他资源进而导致级联错误。 当资源被降级后&…

07_linux中断控制

裸机开发要点 通用中断控制器(GIC) 中断类型、硬件中断号、分发器和cpu接口单元 中断向量表 一级查表、二级查表 中断处理流程 进入irq模式、保护现场、获取硬件中断编号、执行中断处理函数、还原现场 设备树构造 分为 gic中断控制器设备树节点 其他外设中断控制器节点 需要…

大数据相关组件

一、 HDFSHDFS是hadoop的核心组件&#xff0c;HDFS上的文件被分成块进行存储&#xff0c;默认块的大小是64M&#xff0c;块是文件存储处理的逻辑单元。HDFS是Master和Slave的结构。分NameNode、SecondaryNameNode、DataNode这几个角色。NameNode&#xff1a;是Master节点&#…

springcloud3 Sentinel的搭建以及案例操作

一 sentinel的概念 1.1 sentinel Sentinel是分布式系统流量控制的哨兵&#xff0c;阿里开源的一套服务容错的综合性解决方案。 主要用来处理&#xff1a; 服务降级 服务熔断 超时处理 流量控制 sentinel 的使用可以分为两个部分: 核心库&#xff08;Java 客户端&#…

基于nodejs+vue的留学服务管理平台的设计与开发

目 录 摘 要 I Abstract I 第一章 绪论 1 1.1系统开发的背景 1 1.2系统开发的意义 1 1.3本文研究内容 2 第二章 系统开发技术 3 第三章 系统分析 6 3.1用户需求分析 6 3.1.1 老师用户 6 3.1.2 学生用户 6 3.1.3 管理员用户 6 3.2 系统…