对于网络IO的理解

网络IO理解

首先服务端将本机地址和端口bind在listensock上,再用listen()去将listensock套接字设置为listen状态,然后调用accept,进入阻塞状态。如果此时有客户端请求连接,就是第一次握手的开始。

客户端会先调用connect来申请连接:

connect调用时是发送SYN,然后服务端返回SYN+ACK,然后客户端的connect返回,发送最后一个ACK,服务端接收到以后accept返回,开始进行read。

在这里插入图片描述

这里的过程,服务端会被阻塞两次,一次是accept,一次是后续的read。

read具体的读取过程就是从sock读取数据到内核缓冲区(网络设备->内核缓冲区),然后read将数据从内核缓冲区拷贝到用户缓冲区(内核缓冲区->用户缓冲区):

在这里插入图片描述

对阻塞IO的理解

这个就是经典的阻塞IO,那么此时就要从read解决问题。

这里要明确一个问题,就绪事件是在数据从网卡拷贝到内核缓冲区以后就产生了,也就是说内核缓冲区有数据了就是就绪事件了。

在这里插入图片描述

对select的理解

如果有多个客户端连接,每个客户端对应一个线程去按部就班处理是不理想的方式。我们可以想到的是把这些fd放在一个容器,然后用一个线程不停地遍历,然后对于有就绪事件的fd进行处理。

对poll的理解

poll相对于select其实就是没有了文件描述符数量的限制,

对epoll的理解

epoll解决了三个问题:

  1. select 调用需要传入 fd 数组,需要拷贝一份到内核,高并发场景下这样的拷贝消耗的资源是惊人的。(可优化为不复制)
  2. select 在内核层仍然是通过遍历的方式检查文件描述符的就绪状态,是个同步过程,只不过无系统调用切换上下文的开销。(内核层可优化为异步事件通知)
  3. select 仅仅返回可读文件描述符的个数,具体哪个可读还是要用户自己遍历。(可优化为只返回给用户就绪的文件描述符,无需用户做无效的遍历)

优化为:

  1. 内核中保存一份文件描述符集合,无需用户每次都重新传入,只需告诉内核修改的部分即可。
  2. 内核不再通过轮询的方式找到就绪的文件描述符,而是通过异步 IO 事件唤醒。
  3. 内核仅会将有 IO 事件的文件描述符返回给用户,用户也无需遍历整个文件描述符集合。

多路复用快的原因在于,操作系统提供了这样的系统调用,使得原来的 while 循环里多次系统调用,变成了一次系统调用 + 内核层遍历这些文件描述符。

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

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

相关文章

BUUCTF crypto做题记录(13)新手向

一、[MRCTF2020]vigenere 这是一道维吉尼亚密码,但由于不知道密钥,所以我们需要采用爆破的方式。Vigenere Solver | guballa.de 答案:flag{vigenere_crypto_crack_man} 二、[MRCTF2020]keyboard 之前做过一个类似的题目,用九宫格…

C#入门详解_05_C#语言基本元素概览,初识类型、变量与方法,算法简介

本篇对C#语言基本元素概览,初识类型、变量与方法,算法进行简介。 文章目录 1. 构成C#语言的基本元素1.1 关键字(Keyword)1.2 操作符(Operartor)/运算符1.3 标识符(ldentifier )1.3.1 什么是合法的标识符1.4 标点符号1.5 文本(字面值 )1.6 注释与空白2. 初识类型、变量和方法…

97 spring 中的泛型类型注入

前言 呵呵 同样是 最近同事碰到的一个问题 他不太懂 英语, 看到的说明是 缺少一个 RedisTemplate 的实例, 但是找到了一个 RedisTemplate 的实例 呵呵 和我这里 spring 版本似乎是不太一样, 错误信息 有一些差异 以下环境基于 jdk8 spring-5.0.4-RELEASE 测试用例 BeanCon…

day50(vueJS)TypeScript(概念、优势、静态与动态类型、类型约束以及类型注解)

TypeScript介绍 概念优势静态类型与动态类型类型约束 / 类型注解常规类型非常规类型数组类型对象类型万能类型函数类型使用reactive和ref的类型约束父对子传值时的类型约束 概念 它是 JavaScript 的一个超集,支持 ECMAScript 6 标准,由微软公司开发的自由…

MySQL 新增用户及权限分配

场景: 给MySQL新增一个用户,并且该用户登陆后只能查看和操作有权限的数据库 1、创建用户user_luka, 密码pw123456,%表示所有主机,或者用户连接 MySQL 时所用主机IP,如果在创建的过程中,只给出了用户名&am…

高效备考一级数据分析师考试《CDA Level I 实操训练营》3月30日开课!

曾经报名了考试,买了教程辅导书,却因为各种原因没有坚持学习,这样的经历可能让你感到沮丧和失望。但是,失败并不代表终结,而是迈向成功的必经之路。为了帮助大家能够快速学习考试相关知识,特别为CDA LEVEL …

transformer--解码器

在编码器中实现了编码器的各种组件,其实解码器中使用的也是这些组件,如下图: 解码器组成部分: 由N个解码器层堆叠而成每个解码器层由三个子层连接结构组成第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接第二个子层连…

HarmonyOS4.0入门学习需要学习哪些知识点呢?

HarmonyOS4.0入门学习需要学习哪些知识点?我们需要学习以下知识点,看看你都会吗? 01、HarmonyOS介绍 开发环境搭建 DevEco详解 目录介绍介绍 代码分析 02、HarmonyOS模拟器调试、真机调试 03、ArkTS页面布局 数据类型 条件判断 数组ForEach循环遍历 Lis…

小巧且强大,一键批量操作谁不爱?

软件简介: 软件【下载地址】获取方式见文末。注:推荐使用,更贴合此安装方法! 两款Office批量打印工具展现了优秀的人性化设计:其界面清晰、操作简便。这些工具支持Word、Excel、PPT等多种文档格式进行批量打印&#…

VMware虚拟机安装linux教程

CentOS7下载 下载 (centos.org)https://www.centos.org/download/新建虚拟机 选择自定义安装 这里要注意兼容性,如果是VMware12创建的虚拟机复制到VM11、10或者更低的版本会出现一不兼容的现象。如果是用VMware10创建的虚拟机在VMware12中打开则不会出现兼容性问题…

洛谷: P1754 球迷购票问题

思路: 记忆化搜索。和洛谷上那道括号匹配的题几乎是一样的。 x是当前剩余50的数量&#xff0c;y是剩余100的数量。 纯暴力三个点超时&#xff0c;所以每次DFS完了&#xff0c;把当前找到的方式数量记录下来&#xff0c;不再重复的去DFS。 代码: #include <bits/stdc.h&g…

vue中使用echarts实现人体动态图

最近一直处于开发大屏的项目&#xff0c;在开发中遇到了一个小知识点&#xff0c;在大屏中如何实现人体动态图。然后看了下echarts官方文档&#xff0c;根据文档中的示例调整出来自己想要的效果。 根据文档上发现 series 中 type 类型设置为 象形柱形图&#xff0c;象形柱图是…

SpringCloud之Nacos入门与实战系列

目录 一、Nacos介绍 1.1、配置中心和注册中心的概念 1.2 Nacos 优点 二、Nacos的使用 2.1 以单机模式启动Nacos 2.2 Nacos部署方式介绍 2.3 配置数据源 2.4 开启控制台权限登录 三、配置中心的使用 3.1 创建配置信息 3.2 SpringBoot使用配置中心 四、注册中心的使用 4…

android 使用协程CoroutineScope 实现定时器

满足延迟执行、立即执行&#xff0c;每次任务间隔时长&#xff0c;总时长的任务 使用1 class TimeViewModel:Viewmodel(){//测试延迟5秒开始执行任务&#xff0c;然后每隔1秒执行1次&#xff0c;总执行时间60秒fun testTime(){var startTime System.currentTimeMillis()log(…

图书推荐|Word文稿之美

让你的文档从平凡到出众&#xff01; 本书内容 《Word文稿之美》是一本全面介绍Word排版技巧和应用的实用指南。从初步认识数字排版到高效利用模板、图文配置和表格与图表的排版技巧&#xff0c;再到快速修正错误和保护文件&#xff0c;全面系统地讲解数字排版的技术和能力&…

基于Docker部署本地ChatGPT环境

基于Docker部署本地ChatGPT环境 一、拉取镜像 docker pull pengzhile/pandora二、运行镜像 docker run -e PANDORA_CLOUDcloud -e PANDORA_SERVER0.0.0.0:8899 -p 8899:8899 -d pengzhile/pandora三、查看容器是否启动成功 docker ps四、登录 http://IP:8899 这里有两种方…

ssm+springboot音乐播放器网站mybatis+jsp

测试流程 &#xff08;1&#xff09; 登录系统、填写用户名、密码选择角色&#xff0c;主要内容&#xff1a;进行权限控制。 &#xff08;2&#xff09; 用户查看音乐信息、音乐资讯功能&#xff0c;主要是测试系统实用性、方便性。 &#xff08;3&#xff09; 信息修…

你喜欢在那种迷宫中探索呢?

迷宫中的探索者&#xff1a;程序员的多元职业赛道 在信息时代的洪流中&#xff0c;程序员们就像是勇敢的探险家&#xff0c;穿梭于由代码构建的迷宫之中。这座迷宫中&#xff0c;既有前端的绚烂花园&#xff0c;也有后端的深邃洞穴&#xff0c;更有数据科学的神秘密室。每个程…

Maven能解决什么问题?为什么要用?

如果没有maven&#xff0c;我们在开发一个应用的时候&#xff0c;需要自己先确定要引入哪些第三方的jar包&#xff0c;并且要去找到这些jar包&#xff0c;把他们导入到项目中&#xff0c;而且最痛苦的时候各个jar包之间的兼容性和冲突的问题。 jar包弄好了之后&#xff0c;我们…

mysql 8 修改账号密码

一 进入Mysql bin目录 cmd 运行&#xff08;跳过密码&#xff09;&#xff0c;运行完不要关闭 mysqld --console --skip-grant-tables --shared-memory 二 新打开一个cmd mysql bin 目录下登录&#xff0c;密码输入时&#xff0c;直接回车 mysql -uroot -p 三 修改密码 m…