IO复用进化史

2023-11-14

IO复用的历史和多进程一样长,Linux很早就提供了select系统调用,可以在一个进程内维护1024个连接,后来加入poll系统调用,poll做了一系列改进后解决了1024个连接的限制问题,可以维持任意数量的连接。但是selectpoll存在一个问题是,它们需要循环检测连接是否有事件。这样问题就来了,如果服务器有100w个连接,在某一时间只有一个连接是向服务器发送了数据,select/poll就需要做100w次循环,而其中只会有1次命中,剩下99w9999次都是无效的,白白浪费CPU时间片资源。

直到Linux2.6(2003年12月发布)内核开始提供新的epoll系统调用,可以维持无限数量的连接,而且无需轮询,这才真正解决了C10K问题。现在各种高并发异步IO的服务器程序都是基于epoll实现的,如Nginx、Node.js、Erlang、Golnag。像Node.js这样单进程单线程的程序,都可以维持超过100wTCP连接,这全部都要归功于epoll技术。

应为我们的80端口主进程最多只能生成1024个socket[socket其实就是连接],所以使用select模型,不管你生成多少子进程,再多的连接主进程都不能创建socket了,它只会把这1024 socket连接分配给子进程。

还有就是在select模型下,这些socket是在select调用前就有的,然后调用select监控socket,也就是select(socket),此时我们的进程是处于阻塞的,但是select一直在遍历,当发现某个socket有数据了,此时就通知进程,然后进程就发送系统调用,此时该进程就发送read系统调用来读数据。这个read也要遍历这些所有socket才能取得想要数据。

poll本质上和select没有区别,与select的区别的是他没有最大连接数的限制,原因是他是基于链表来存储的。如果它一个进程内维护100w个连接,那poll遍历也需要很多时间。然后它再通知进程有一个socket有消息了,那么这个进程也遍历100w个socket,此时也需要不少时间。

epoll和poll类似,不限制连接数,但是epoll模型不需要遍历,当某个socket有数据的时候,直接通知进程,然后进程直接去那个socket中取。这时进程也不用遍历了。

如果把上面的都理解为单进程单线程,那么其实就是这个线程处理上面的socket内容,每个socket其实就是一个请求,所以io复用能处理多请求

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IO复用进化史 的相关文章

  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • 为什么同一个curl命令在windows和linux下输出不同的东西?

    为什么同样的curl o file https www link com 命令输出不同的东西 例如 如果我运行命令curl o source txt https www youtube com playlist list PLIx6Fwnp
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4
  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • 从另一个 python 脚本获取返回信息

    我在 Linux 上 我有一个 python 脚本 我想从另一个 python 脚本调用它 我不想将其作为模块导入 为了一层安全性 现在为了学术练习 因为我想弄清楚这一点 我实际上想让一个脚本使用 os system 或另一个类似的函数 并

随机推荐

  • 用Unity3D和VuforiaSDK简单做AR应用(实战)

    一 首先来到https developer vuforia com downloads sdk 这里有高通给予的很多开发包 当然也有很多的学习资源 接下来说重点 下载vuforia unity mobile android ios 4 2
  • HJ33 整数与IP地址间的转换

    Powered by NEFU AB IN Link 文章目录 HJ33 整数与IP地址间的转换 题意 思路 代码 HJ33 整数与IP地址间的转换 题意 原理 ip地址的每段可以看成是一个0 255的整数 把每段拆分成一个二进制形式组合起
  • JAVA:@Builder注解深层特性(笔记)

    JAVA 记录 Builder的特性 Builder原理 在构造方法A上引用时 相当于建造一个构造器G 构造器G只可以构造A方法参数列表里的字段 在类上引用时 相当于给这个类一个全参构造方法 然后给这个全参构造方法加上 Builder注解
  • Docker Compose 配置文件 docker-compose.yml 详解

    Docker Compose配置文件是Docker Compose的核心 用于定义服务 网络和数据卷 格式为YAML 默认路径为 docker compose yml 可以使用 yml或 yaml扩展名 目前Compose配置文件格式的最新
  • Conformal lec learning7: abort points

    在conformal lec 检查等价性的过程中 遇到abort points 是比较头疼的 可以通过以下方式避免
  • 使用split.js库实现网页布局分割

    前言 在开发网页应用程序时 经常需要将页面的布局分割成多个区域 使得用户可以同时查看不同的内容 split js是一个简单易用的JavaScript库 可以帮助我们实现灵活的网页布局分割 以及可拖动和调整大小的分割器 引入split js库
  • Java与Scala的转换

    一 java Map 转为 scala collection immutable Map public static
  • PyQt5,PyQt-tools安装与Qt designer,pyuic,qrcToPy的配置

    一 PyQt5 PyQt tools的安装 PyQt5的安装 可以在pycharm里安装PyQt5 PyQt tools和PyQt Designer库 或者在命令行里用pip命令安装 安装完成测试一下 from PyQt5 Qt impor
  • 坚持了139天,剪辑视频拿到12w,手把手教会你如何去操作

    如果你能熬得了夜 吃得了苦 大家也可以来跟我一起做视频剪辑 把我的方法拿去认真操作 相信你也可以做到 也想要通过做自媒体赚取一份收入 却没有方向的小伙伴们可以给大周点赞并扣 8 大周会把整理好的新手指南分享给你们 接下来就分享具体的操作方法
  • sql查看和更新某个表的某个字段

    学了一点sql新知识 给某个表的某个字段添加一个新的值 查看表里某个字段的值 SELECT FROM TableFields WHERE TableFieldID 表名 字段名 更新字段的存储 UPDATE TableFields SET
  • upf+vcs仿真

    要做upf vcs的联合仿真的话 首先需要写好upf文件 其中有两个方面 1 需要修改makefile 1 tb文件改为 sv模式 2 在makefile中注意修改了 sv需要在加上 sverilog 3 加上 vcs upf lt 路径
  • FIND_IN_SET

    FIND IN SET str strlist str 要查询的字符串 strlist 字段名 参数以 分隔 如 1 2 6 8 查询字段 strlist 中包含 str 的结果 返回结果为null或记录 假如字符串str在由N个子链组成的
  • 【NLP】3 种强大的长文本摘要方法和实例

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Python 全栈系列220 Tornado的服务搭建

    说明 想法变的真快 本来是没打算用Tornado的 主要是想节约时间 但是现在看来不用还是不行 目前用gevent flask部署的时候 启动多核的worker似乎存在问题 另外 有很多内部基础的数据服务 其实并不需要flask的各种组件
  • stata解决内生性问题--样本选择

    目录 简单介绍 1 内生性 2 为什么要解决内生性问题 3 内生性问题产生的原因 4 例子 代码 简洁版 代码 详细分析版 结果 简单介绍 1 内生性 x与误差项有相关关系 2 为什么要解决内生性问题 内生性会破坏参数估计的 一致性 参数估
  • 沁恒ch32V208处理器开发(四)串口通信

    目录 串口资源 资源配置 同步模式 单线半双工模式 中断 DMA 串口的初始化 串口通信的实现 串口资源 资源配置 CH32V208 系列 是基于 RISC V 指令架构设计的 32 位 RISC 内核 MCU 根据封装的不同 可用的USA
  • 永磁同步电机的矢量控制策略(十四)一一一位置环的仿真

    14 永磁同步电机的矢量控制策略 十四 14 1 永磁同步电机的三闭环矢量控制 之前的博客文章中所述的双闭环矢量控制系统 电流环属于内环 其作用是使电机电流跟随给定电流 速度环输出 的变化 对系统响应的快速性与准确性有着重要影响 转速环属于
  • git提交代码报 vue-cli-service lint found some errors. Please fix them and try committing again

    原因 问过度娘在提交代码的时候 它会在提交代码前运行做代码风格检查 如果代码不符合相应规则 则报错 解决 直接把pre commit文件删除 进入项目 git文件夹 hooks 删除 如何你的项目文件夹下没有找到 git文件夹 检查一下看看
  • java sheet 设置名称_Java 实现 给Excel模板赋值(直接打开表格赋值或者用自定义了名称的单元格(一块区域)赋值)...

    1 需求 直接打开表格填充数据到模板后的效果可能出现表格重叠的问题 用自定义名称填充数据到模板后表格互不影响 Excel自身有一个 定义名称 的功能 1 可以给任意的单元格定义一个名称 比如定义某个单元格的名称为 testA1 如何给这个名
  • IO复用进化史

    IO复用的历史和多进程一样长 Linux很早就提供了select系统调用 可以在一个进程内维护1024个连接 后来加入poll系统调用 poll做了一系列改进后解决了1024个连接的限制问题 可以维持任意数量的连接 但是select和pol