【计算机网络 - 基础问题】每日 3 题(五十四)

news2024/11/27 22:35:21

✍个人博客:https://blog.csdn.net/Newin2020?type=blog
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
📝推荐参考地址:https://www.xiaolincoding.com/(这个大佬的专栏非常有用!)

160. SO_LINGER 选项

#include<sys/socket.h>
struct linger
{
    int l_onoff;        //开启(非0)还是关闭(0)该选项
    int l_linger;       //滞留时间
};

根据 linger 结构体中两个成员变量的不同值,close 系统调用可能产生如下 3 种行为之一:

  • l_onoff 等于 0 (关闭):此时 SO_LINGER 选项不起作用,close 用默认行为来关闭 socket。
  • l_onoff 不为 0 (开启),l_linger 等于 0:此时 close 系统调用立即返回,TCP 模块将丢弃被关闭的 socket 对应的 TCP 发送缓冲区中残留的数据,同时给对方发送一个复位报文段(RST)。因此,这种情况给服务器提供了异常终止一个连接的方法。
  • l_onoff 不为 0 (开启),l_linger 大于 0:此时 close 的行为取决于两个条件:一是被关闭的 socket 对应的 TCP 发送缓冲区是否还有残留的数据;二是该 socket 是阻塞的,还是非阻塞的。对于阻塞的 socket,close 将等待一段长为 l_linger 的时间,直到 TCP 模块发送完所有残留数据并得到对方的确认。如果这段时间内 TCP 模块没有发送完残留数据并得到对方的确认,那么 close 系统调用将返回 -1 并设置 errno 为 EWOULDBLOCK。如果 socket 是非阻塞的,close 将立即返回,此时我们需要根据其返回值和 errno 来判断残留数据是否已经发送完毕。

161. 什么是 I/O 多路复用?

最基础的 TCP 的 Socket 编程,它是阻塞 I/O 模型,基本上只能一对一通信,那为了服务更多的客户端,我们需要改进网络 I/O 模型。

比较传统的方式是使用多进程/线程模型,每来一个客户端连接,就分配一个进程/线程,然后后续的读写都在对应的进程/线程,这种方式处理 100 个客户端没问题,但是当客户端增大到 10000 个时,10000 个进程/线程的调度、上下文切换以及它们占用的内存,都会成为瓶颈。

阻塞等待

在这里插入图片描述

BIO模型

在这里插入图片描述

非阻塞,忙轮询

在这里插入图片描述

NIO 模型

在这里插入图片描述

162. I/O 多路复用的 API

为了解决上面这个问题,就出现了 I/O 的多路复用,可以只在一个进程里处理多个文件的 I/O,Linux 下有三种提供 I/O 多路复用的 API,分别是:select、poll、epoll。

select 实现多路复用的方式是,将已连接的 Socket 都放到一个文件描述符集合,然后调用 select 函数将文件描述符集合拷贝到内核里,让内核来检查是否有网络事件产生,检查的方式很粗暴,就是通过遍历文件描述符集合的方式,当检查到有事件产生后,将此 Socket 标记为可读或可写, 接着再把整个文件描述符集合拷贝回用户态里,然后用户态还需要再通过遍历的方法找到可读或可写的 Socket,然后再对其处理。

所以,对于 select 这种方式,需要进行 2 次「遍历」文件描述符集合,一次是在内核态里,一个次是在用户态里 ,而且还会发生 2 次「拷贝」文件描述符集合,先从用户空间传入内核空间,由内核修改后,再传出到用户空间中。

select 使用固定长度的 BitsMap,表示文件描述符集合,而且所支持的文件描述符的个数是有限制的,在 Linux 系统中,由内核中的 FD_SETSIZE 限制, 默认最大值为 1024,只能监听 0 ~ 1023 的文件描述符。

poll 不再用 BitsMap 来存储所关注的文件描述符,取而代之用动态数组,以链表形式来组织,突破了 select 的文件描述符个数限制,当然还会受到系统文件描述符限制。

但是 poll 和 select 并没有太大的本质区别,都是使用「线性结构」存储进程关注的 Socket 集合,因此都需要遍历文件描述符集合来找到可读或可写的 Socket,时间复杂度为 O(n),而且也需要在用户态与内核态之间拷贝文件描述符集合,这种方式随着并发数上来,性能的损耗会呈指数级增长。

epoll 通过两个方面解决了 select/poll 的问题。

在这里插入图片描述

1、epoll 在内核里使用「红黑树」来关注进程所有待检测的 Socket,红黑树是个高效的数据结构,增删改一般时间复杂度是 O(logn),通过对这棵黑红树的管理,不需要像 select/poll 在每次操作时都传入整个 Socket 集合,减少了内核和用户空间大量的数据拷贝和内存分配。

2、epoll 使用事件驱动的机制,内核里维护了一个「链表」来记录就绪事件,只将有事件发生的 Socket 集合传递给应用程序,不需要像 select/poll 那样轮询扫描整个集合(包含有和无事件的 Socket ),大大提高了检测的效率。

int s = socket(AF_INET, SOCK_STREAM, 0);
bind(s, ...);
listen(s, ...)

int epfd = epoll_create(...);
epoll_ctl(epfd, ...); //将所有需要监听的socket添加到epfd中

while(1) {
    int n = epoll_wait(...);
    for(接收到数据的socket){
        //处理
    }
}

而且,epoll 支持边缘触发和水平触发的方式,而 select/poll 只支持水平触发,一般而言,边缘触发的方式会比水平触发的效率高。

简单总结一下:

  1. select:
    1. select 使用一个包含所有文件描述符的位图数据结构(通常是 fd_set)。这个位图的大小通常由 FD_SETSIZE 宏定义决定,这个宏的默认值是 1024。
    2. 当调用 select 时,内核会遍历位图中的每个文件描述符,检查是否有可读、可写、或异常事件。这个遍历是线性的,因此性能受到文件描述符数量的限制。
    3. select 是水平触发,它会一直通知应用程序,直到所有就绪事件被处理。
  2. poll:
    1. poll 使用一个存放在用户态的数组来注册文件描述符。数组中的每个元素都包含了文件描述符和等待的事件。
    2. 当调用 poll 时,内核会遍历这个数组,检查每个文件描述符是否有就绪事件。和 select 一样,这个遍历也是线性的,因此性能受到文件描述符数量的限制。
  3. epoll:
    1. epoll 使用一个事件表(event table)来注册文件描述符,事件表是内核空间的数据结构。
    2. 当调用 epoll_create 时,内核会创建一个事件表,并返回一个文件描述符,应用程序可以使用这个文件描述符来操作事件表。
    3. epoll 使用事件通知机制。当文件描述符就绪时,内核会将这个事件添加到事件表中,然后将一个就绪队列中的事件通知应用程序。
    4. 应用程序可以调用 epoll_wait 来等待事件就绪,并获得就绪的事件列表,这个操作是阻塞的,直到有事件就绪。
    5. epoll 可以使用水平触发或边缘触发模式。在边缘触发模式下,只有在状态发生变化时才会通知应用程序。

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

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

相关文章

Spring事务的七种传播行为

Spring事务的七种传播行为 1.事务的传播行为是什么&#xff1f;2.具体传播行为2.1 REQUIRED &#xff0c;默认&#xff0c;存在事务则加入该事务&#xff0c;不存在则新建一个事务2.2 REQUIRES_NEW&#xff0c;每次新开启事务&#xff0c;新老事务相互独立2.3 NESTED&#xff0…

ArcGIS无插件加载(无偏移)在线天地图高清影像与街道地图指南

在地理信息系统&#xff08;GIS&#xff09;的应用中&#xff0c;加载高清影像与街道地图对于地图制图、影像查阅、空间数据分析等工作至关重要。天地图作为官方出品的地图服务&#xff0c;以其标准的数据、较快的影像更新速度等特点受到广泛欢迎。以下是如何在ArcGIS中无插件加…

创建项目模版

一 Vite创建Vue3项目 1.1.创建Vue3项目 1.1.1.运行创建项目命令 # 使用 npm npm create vitelatest 1.1.2、填写项目名称 1.1.3、选择前端框架 1.1.4、选择语法类型 1.1.5、按提示运行代码 1.1.6浏览器问 localhost:5173 预览 1.2项目结构 1.2.1vite.config.ts 1.2.2 pac…

【股票】——1-50篇,第一本

一、背景 偶然间在朋友圈看到了雪球花甲老头的公众号&#xff0c;里面的宏观观点和微观观点讲的都太好了&#xff1b;因为作者有那样的经历&#xff0c;所以才能写出来那样的内容&#xff1b;关于股市的&#xff0c;总共500篇&#xff0c;自己也计划系统性的看一看&#xff1b;…

MissingSemester-版本控制系统Git

title: Git的底层及基础使用 date: 2024-05-16 12:00:00 categories: MissingSemester tags: 版本控制系统Git 版本控制系统Git 什么是Git ​ 版本控制系统 (VCSs) 是一类用于追踪源代码&#xff08;或其他文件、文件夹&#xff09;改动的工具。顾名思义&#xff0c;这些工具…

2024年第九期 | CCF ODC《开源战略动态月报》

点击蓝字 关注我们 CCF Opensource Development Committee 导 读 2024年第九期CCF ODC《开源战略动态月报》共摘选33篇文章&#xff0c;分为8个版块&#xff1a;ODC专栏、开源政策、理论观点、产业动态、技术项目、开源组织与机构、开源报告通讯会议以及RISC-V专栏&#xff0c;…

Webserver(1)Linux开发环境搭建

目录 配置软件虚拟机中安装ubuntu安装ubuntu18的操作系统 安装VM tools安装XshellVscode远程连接到虚拟机 配置软件 VMwareVScodeg安装ubuntu 18.04.iso 或者镜像版本 XShellXFTP 虚拟机中安装ubuntu 安装ubuntu18的操作系统 开启虚拟机 选择中文简体 安装VM tools 打开v…

V2X介绍

文章目录 什么是V2XV2X的发展史早期的DSRC后起之秀C-V2XC-V2X 和DSRC 两者的对比 什么是V2X 所谓V2X&#xff0c;与流行的B2B、B2C如出一辙&#xff0c;意为vehicle to everything&#xff0c;即车对外界的信息交换。车联网通过整合全球定位系统&#xff08;GPS&#xff09;导…

Java基础-注解机制详解

文章目录 注解基础Java内置注解内置注解- Override内置注解 - Deprecated内置注解 - SuppressWarnings 元注解元注解 - Target元注解 - Retention & RetentionTarget元注解 - Documented元注解 - Inherited 注解与反射接口自定义注解 深入理解注解Java8提供了哪些新的注解&…

如何高效集成聚水潭数据至MySQL-技术案例解析

如何高效集成聚水潭数据至MySQL-技术案例解析 聚水潭数据集成到MySQL的技术案例分享 在本次技术案例中&#xff0c;我们将探讨如何通过轻易云数据集成平台&#xff0c;将聚水潭的店铺信息高效地集成到MySQL数据库中。具体方案为“聚水潭-店铺信息查询-->BI崛起-店铺信息表”…

NewStarCTF 2023 公开赛道 Web week1-week2

目录 week1 泄漏的秘密 Begin of Upload Begin of HTTP ErrorFlask ​Begin of PHP R!C!E! EasyLogin ​week2 游戏高手 include 0。0 ez_sql ​Unserialize&#xff1f; Upload again! R!!C!!E!! week1 泄漏的秘密 使用ctf-scan.py&#xff08;https://gith…

随身 WiFi 通过 USB 连接路由器共享网络 扩展网络覆盖范围

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 之前几期随身 WiFi 的玩法都是关于骁龙 410 板子的随身 WiFi&#xff0c;可以刷 Debian 之后作为小型家庭服务器&#xff0c;跑跑 Docker&#xff0c;当当打印服务器什么的。而今天介绍的玩法用的是正儿八…

LockBit多版本简单对比

LockBit家族介绍 LockBit是一种非常知名且活跃的勒索软件家族&#xff0c;自2019年首次被发现以来&#xff0c;已经经历了多个版本的演变。它以其高效的加密速度和自动化攻击能力而闻名&#xff0c;对各类组织构成了严重威胁。 发展时间线如下&#xff1a; 时间 事件 2019年…

linux之网络子系统-路由子系统(3)路由表

一、路由表 linux 路由子系统代码量虽说不是很多&#xff0c;但是难度还是有的&#xff0c;最近在分析路由子系统这一块&#xff0c;对它的框架有了基本的了解。 路由子系统可以划分为三个部分&#xff1a;路由缓存、路由策略、路由表。前两个部分已经分析完&#xff0c;这里…

解决Vmware自动调整分辨率的问题

打开菜单&#xff1a;虚拟机→设置→硬件→显示器→显示缩放比例→勾选拉伸模式 Virtual Machine

【Linux】————磁盘与文件系统

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux 创作时间 &#xff1a;2024年10月17日 一、磁盘的物理结构 磁盘的物理结构如图所示&#xff1a; 其中具体的物理存储结构如下&#xff1a; 磁盘中存储的基本单位为扇区&#xff0c;一个扇区的大小一般为512字…

【python爬虫实战】爬取全年天气数据并做数据可视化分析!附源码

由于篇幅限制&#xff0c;无法展示完整代码&#xff0c;需要的朋友可在下方获取&#xff01;100%免费。 一、主题式网络爬虫设计方案 1. 主题式网络爬虫名称&#xff1a;天气预报爬取数据与可视化数据 2. 主题式网络爬虫爬取的内容与数据特征分析&#xff1a; - 爬取内容&am…

【软件工程】软件工程入门

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;软件开发必练内功_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

多模态大语言模型(MLLM)-Blip3/xGen-MM

论文链接&#xff1a;https://www.arxiv.org/abs/2408.08872 代码链接&#xff1a;https://github.com/salesforce/LAVIS/tree/xgen-mm 本次解读xGen-MM (BLIP-3): A Family of Open Large Multimodal Models 可以看作是 [1] Blip: Bootstrapping language-image pre-training…

uniapp:uni.createSelectorQuery函数结合vue的watch函数使用实例

提醒 本文实例是使用uniapp进行开发演示的。 一、需求场景 在开发详情页面时&#xff0c;不同产品描述文案不同&#xff0c;有的文案比较长&#xff0c;需求上要求描述文案最多展示4行文案&#xff0c;少于4行文案&#xff0c;全部显示&#xff0c;此UI高度自动适配&#xff0c…