单缓冲区;多个插座; Linux 下的单个系统调用

2023-12-05

Linux 是否有任何本机内核工具可以将提供的缓冲区发送()到一组套接字?一种向量 I/O,除了套接字句柄而不是缓冲区。

目标是减少在某些情况下涉及的 u/k 转换的数量,例如,您需要向 n 个客户端广播一些状态更新,这需要迭代每个套接字并发送。

一项限制是必须支持 TCP 套接字(不受我的控制)


答案是否定的,linux和posix系统都没有你想要的调用。我担心您不会获得任何优势,因为每个数据流都将遵循不同的路径,这使得在内核中复制缓冲区而不是在用户空间中复制缓冲区。不在用户到内核中进行复制并不一定意味着在内核模式下进行更好。

不管怎样,在Linux中你可以实现这种mwrite(或msend)系统调用,因为你有源代码。但恐怕你除了头痛之外什么也得不到。此实现的唯一方法是某种转移时复制方法,但我认为您不会获得任何优势。

最后,一旦你完成了第一个write(2)调用时,下一次必须再次交换用户缓冲区的概率太低,使得缓冲区的第二个和下一个副本的开销非常低,因为页面将全部位于核心内存中。您需要一个非常高负载的系统才能在系统调用之间交换用户缓冲区。

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

单缓冲区;多个插座; Linux 下的单个系统调用 的相关文章

  • Linux 上共享内存的生命周期是多长

    我正在使用 ftok shmget shmat shmdt 函数在 Linux 上创建 写入和读取共享段 如果我写入一个程序中的段 然后退出 然后稍后从另一个程序中读取该段 我会惊讶地发现数据仍然存在 我预计当共享一个段的最后一个进程执行
  • 如何优化打印两个整数中较大者和较小者之间的差异?

    可能是最简单的问题 输入由一系列 2 32 的无符号整数对组成 因此要求使用 64 位整数 对于每一对 任务是打印出较大整数和较小整数之间的差异 根据 最快的解决方案运行时间低于 0 01 秒 然而 我解决这个问题的所有尝试通常都在 0 0
  • Cmake 错误未定义对“pthread_create”的引用

    我对 cmake FindThreads 进行了测试 这是我的源代码test cpp和CMakeLists txt include
  • C++向量数组运算符计算成本高?

    我一直都知道 C 的丰富抽象会带来一定的计算开销 但我的印象是 一旦应用了正确的编译器优化 这种开销几乎可以忽略不计 我很好奇这种开销到底有多大 所以我编写了一个简单的测试来确定这一点 该测试是一个模板化函数 它接受一个容器变量 为容器中的
  • 我应该如何从非 root Debian Linux 守护进程登录?

    我正在编写一个新的守护进程 它将托管在 Debian Linux 上 我发现 var log 具有仅 root 写入权限 因此我的守护进程无法在那里写入日志文件 但是 如果它写入那里 它似乎将获得自动日志轮转 并且也按照用户期望的方式工作
  • C 中每 N 个元素中出现次数最多的元素

    我有一个大小为 0 8388608 的大数组 A 其中包含 相对较小 的整数 A i 0 131072 我想找到每个 N 32 个元素中最常出现的元素 什么会更快 A 创建一个大小为131072的关联数组B 迭代32个元素 递增B A i
  • Python select() 行为很奇怪

    我在理解 select select 的行为时遇到一些困难 请考虑以下 Python 程序 def str to hex s def dig n if n gt 9 return chr 65 10 n else return chr 48
  • 调用 close() 后大文件没有立即刷新到磁盘?

    我正在使用 python 脚本创建大文件 超过1GB 实际上有 8 个 在创建它们之后 我必须创建将使用这些文件的进程 该脚本如下所示 This is more complex function but it basically does
  • 使用 sysfs 的 Linux 用户空间 GPIO 中断

    我想使用 sysfs 在用户空间上使用 GPIO 中断 我使用这些命令 root at91 gpio109 gt echo 109 gt export root at91 gpio109 gt cd gpio109 root at91 gp
  • 如何在多行而不是单行输出上打印 Linux 组名称

    我尝试过 getent group 命令 id Gn user 和一些 sed 组合 但我认为我无法实现 因此向其他程序员伸出援手 我希望能够打印此 groups abc123输出 abc123 devops 构建测试设计 预期输出 gro
  • 强制 shell 在 SunGrid 引擎中使用 conda 变量中的 python [重复]

    这个问题在这里已经有答案了 我正在尝试在 SunGrid 引擎中执行 python 文件 并且从 anaconda3 环境变量中执行它 我的代码很简单 from future import print function import url
  • 我应该测试是否等于 1 还是不等于 0?

    前几天我在这里编码 写了几个 if 语句 其中的整数总是要么0 or 1 实际上充当bools 我问自己 当检测结果呈阳性时 哪个更好 测试int 1 or int 0 例如 给定一个 intn 如果我想测试是否是true 我应该使用n 1
  • 动态_cast的性能?

    在阅读问题之前 这个问题不是关于它有多大用处dynamic cast 这只是关于它的性能 我最近开发了一个设计 其中dynamic cast被大量使用 与同事讨论时 几乎每个人都这么说dynamic cast不应该使用 因为它的性能很差 这
  • 在 C 和 python 中实现 sendall() 和 recvall()

    我目前正在尝试在用 C 编写的服务器中实现 sendall 函数 并在用 python 编写的相应客户端上实现 receiveall 函数 当服务器和客户端都用相同的语言编写时 即都用 c 或都用 python 编写 我可以让服务器和客户端
  • WHERE 子句或 ON 子句中的 INNER JOIN 条件?

    我今天输错了一个查询 但它仍然有效并给出了预期的结果 我的意思是运行这个查询 SELECT e id FROM employees e JOIN users u ON u email e email WHERE u id 139840 但我
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • Microsoft SQL 数据库的 WebSocket 侦听器

    我目前正在开发一个项目 该项目必须使用 WebSockets 作为将数据传输到客户端的方式 基础设施看起来像这样 客户端 gt Web 服务器 gt Microsoft SQL 数据库 我想最理想的情况应该是这样的 客户端打开一个到服务器的
  • Java 可变 BigInteger 类

    我正在使用 BigIntegers 进行计算 该计算使用一个调用 multiply 大约 1000 亿次的循环 并且从 BigInteger 创建新对象使其非常慢 我希望有人编写或找到了 MutableBigInteger 类 我在 jav

随机推荐