Linux内核AIO,开放系统调用

2024-02-15

为什么 Linux 内核 AIO 不支持异步“开放”系统调用? 因为“打开”可能会长时间阻塞文件系统,不是吗?


首先,这是一个非常好的、合理的问题;不幸的是,它可能会赶走比我更有知识的人。

AFAICT,没有good原因。您设法挖掘的讨论是相关的,但根本不令人满意(这也可能是您的结论)。尽管 Torvald 的观点在技术上是正确的,但他们显然忽略了房间里的大象——GUI 编程——以及我确信的许多其他用例。

  • 是的,网络服务器会受到网络延迟的限制。这应该是一个不关心所有其他 IO 的理由,这有点可疑,但我可以接受这一点。

  • 是的,许多服务器工作负载都能够使用 dentry/inode 缓存,但不是全部,并且总会有缺失。

  • 是的,“购买更多内存”的论点是有效的。我从来不认为这是一个好的论据。

  • 然后还有所有其他用例。对于许多人来说,包括 GUI 编程,我们有时或多次阻塞并不重要;重要的是,我们可以随时阻塞。我们永远不应该阻止。如果访问模式非常随机且时间间隔很远,那么购买更多 RAM 也无济于事——缺乏与辅助存储提供的容量一样多的内存。

    “无论如何都应该快”的想法也是错误的;始终考虑远程文件系统。

唯一引人注目的一点是:

简短而甜蜜:“aio_open()”基本上不应该是一个 问题。如果是,那么你设计错误了,或者你也在尝试 该死的很难单线程一切(并“隐藏”线程does只需将其称为“AIO”即可发生 - 简而言之)。

这里的重点正是为了避免线程化,所以这句话让我感到惊讶。仅列举其他论点这一事实就表明,这一论点太脆弱,无法独立存在。

在同一讨论中深入挖掘,您可以找到 Mikulas Patocka 的这篇文章:

您可以使用 FreeBSD 等内核线程来模拟异步 IO 一些商业 Unices 这样做,但你仍然需要尽可能多(可能 kernel)线程与您正在服务的请求一样多。

(...)

制作真正的异步 IO 需要重写所有文件系统 整个 VFS _from_scratch_。这不会发生。

http://lkml.iu.edu//hypermail/linux/kernel/0102.1/0074.html http://lkml.iu.edu//hypermail/linux/kernel/0102.1/0074.html

这听起来像是一个正确的解释,尽管显然不是一个好的解释。

请记住,这是一个旧线程,自那以后发生了很多变化,所以这个答案没有什么价值。然而,它提供了关于为什么假设的aio_open不可用历史地。另外,请理解许多内核讨论(或任何项目的任何内部讨论)通常期望所有参与者都从大量假设开始。因此,我完全有可能没有以正确的方式看待这个问题。

话虽如此,这一点很有趣(Stephen C. Tweedie):

啊,但即使是 VMS SYS$QIO 也是同步进行打开、分配的 IO 请求数据包,并将文件位置映射到磁盘块。仅有的 数据 IO 始终是异步的(Ben 的 Linux 异步 IO 内容提供了 那个也是)。

http://lkml.iu.edu//hypermail/linux/kernel/0102.1/0139.html http://lkml.iu.edu//hypermail/linux/kernel/0102.1/0139.html

为什么有趣?因为它强化了这样一个观念:许多不同的系统都没有实现open(和其他调用)异步。此外,aio_openPOSIX 没有指定,我找不到解释原因的讨论。 Windows 似乎也忽略了这个问题。

就好像这个概念固有的某些东西是错误的或困难的,但似乎没有人能很好地解释为什么会这样。

我的猜测是,这只是低优先级,而且一直都是。包括预先线程化或打开文件在内的解决方法被认为足以满足足够多的用例来提供功能,但这种方法永远是不合理的。

了解为什么 POSIX 没有定义这样的调用将会很有趣。不过,我预计会有一个“超出范围”的理由。

如果你想弄清真相,我怀疑你必须将讨论带到更合适的渠道,例如 LKML。

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

Linux内核AIO,开放系统调用 的相关文章

  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • Linux 上的 Pervasive ODBC 错误 [01000][unixODBC][驱动程序管理器]无法打开 lib '/usr/local/psql/lib/odbcci.so':找不到文件

    我正在尝试让 Pervasive v10 客户端 ODBC 在 Centos 6 上运行 据我所知 没有 64 位 ODBC 客户端 因此我必须使用 32 位客户端 我终于成功安装了它 但尝试使用时出现以下错误 isql v mydsn 0
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 使用os.execlp时,为什么`python`需要`python`作为argv[0]

    代码是这样的 os execlp python python child py other args this works os execlp python child py other args this doesn t work 我读过
  • 我什么时候应该编写 Linux 内核模块?

    有些人出于某种原因想要将 Linux 中的代码从用户空间移动到内核空间 很多时候 原因似乎是代码应该具有特别高的优先级 或者只是 内核空间更快 这对我来说似乎很奇怪 我什么时候应该考虑编写内核模块 有一套标准吗 我怎样才能激励将代码保存在
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https

随机推荐

  • JSON 和 SOAP WCF 服务?

    我最近将 WCF SOAP 服务转换为 REST JSON 服务 正如回复中详细说明的here https stackoverflow com questions 10232509 can i generate a service refe
  • 如何在 NHibernate 中为页面过滤器执行 SELECT DISTINCT 等效操作?

    假设您正在使用 SQL 2005 并安装了 Northwind 数据库的副本 您正在使用带有员工 浏览 页面的 ASP NET 应用程序 在页面顶部有一个 标题 过滤器 您希望在下拉列表中显示这 5 个选项 ALL 销售副总裁销售代表销售经
  • jQuery Masonry 和 Ajax 获取附加项目导致图像重叠

    这里使用 Masonry 和 Ajax 在 Wordpress 中附加项目时存在另一个图像重叠问题 第一次附加更多项目时 图像会重叠 但是 重新加载页面时 图像不再重叠 经过一些研究后我意识到这与计算图像的高度有关 从 Masonry 网站
  • Mac 版与 Github 分开安装 Git

    我已经安装了 Mac 版的 Github 我意识到我需要进入命令行来做一些事情 Mac 版 Github 中有一个选项可以安装命令行 所有这一切似乎都是在 usr local bin 中创建一个名为 Github 的别名 该别名指向 Mac
  • 如何使用material-ui框架? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我打算使用 Material UI CSS 框架 http material ui com http material ui com
  • 如何在 ASP.Net 中发送状态代码 500 并仍然写入响应?

    我有一个 ASP Net 单文件 Web 服务 ashx文件包含一个IHttpHandler实现 需要能够返回错误作为响应500内部服务器错误状态代码 在 PHP 中这是一件相对简单的事情 header HTTP 1 1 500 Inter
  • 如何配置WCF向客户端推送实时数据?

    我需要将实时更新从服务器发送到客户端 我知道WCF一般都可以做到这一点 然而 silverlight 是一个挑剔的客户 有谁知道如何配置WCF将实时更新发送到Silverlight客户端 来自配置和演练的片段将不胜感激 使用 WCF 回调
  • Ag 网格,防止表格缩放到全宽

    我有一个表格 即使其内容较少 也可以缩放到所有可用宽度 演示 https plnkr co edit 6L8bTAwkEV6R6Be4M1Qm p preview https plnkr co edit 6L8bTAwkEV6R6Be4M1
  • 存储社会安全号码

    我目前工作的公司的人力资源部门要求我提供一个系统 用于在公司数据库中存储员工的社会安全号码 这样做的原因是为了简化工资单的完成 因为我们使用内部软件来处理员工时间表 但必须与第三方软件集成来实现我们的实际工资单系统 这是一家相对较小的公司
  • ASP.Net 身份提供商请求太多信息

    我的 asp net 身份工作正常 但是 当用户登录时 Google 会询问用户是否可以提供以下信息 查看您的电子邮件地址 查看您帐户的基本信息 问题是我什至不想要这些信息 我只是想要一种独特的方式来识别用户 它确实提供了 我不希望用户认为
  • ''hello'' ++ ''world'' 在 Haskell 中不起作用

    只是想澄清一下 这是我第一天编程 我意识到这个问题是多么愚蠢 D 1 为什么不起作用 ghci gt hello world
  • 如何从泛型定义和泛型参数获取泛型类型?

    在 C 中 如何从泛型定义和泛型参数构造泛型类型 例如 var genericDefinition typeof List var genericArgument typeof string How can I get the Type i
  • kubernetes 事件时间表

    我希望能够在时间轴上看到 kube 集群发生的所有各种事情 包括何时发现节点已死亡 何时添加新节点 何时崩溃以及何时重新启动 到目前为止我们发现的最好的是kubectl get event但这似乎有一些限制 它不会回溯那么远 我不确定它回溯
  • Python中的凯撒密码:删除列表中的空格

    我正在从事凯撒密码项目 我获取用户的输入 将其转换为列表 删除空格 然后对字母进行加密 我的问题是 如何将这些空格重新添加到最终的加密消息中 这是我到目前为止所取得的成就 假装单词 消息 alphabet a b c d e f g h i
  • 如何修复 Subversion «!»地位

    Subversion 手册指出 物品丢失 例如您搬家或 没有使用 svn 就删除了它 这 也表明一个目录是 不完整 结账或更新 被打断 但正如 Subversion 经常出现的情况一样 没有说明如何解决该问题 通常 我会使用我信任的Fix
  • 是否有 OAuth2 与 WebFlux 的工作示例

    我正在尝试将 OAuth2 添加到 WebFlux 但找不到任何工作示例 为了实现自己的授权服务器 我使用这样的代码 EnableAuthorizationServer Configuration public class ServerAu
  • Facebook SDK:FBLoginView 重新授权发布流

    使用 FBLoginView 时调用 initWithReadPermission 后 我遇到重新授权发布流的问题 我尝试在委托函数内部调用 我可以在其中获取用户信息 在下一个对话框请求发布流权限后 应用程序向我抛出一个异常 com fac
  • SharePoint 初学者用户教程有什么好处? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 好吧 我的任务是为一个政府内部网站创建一个 wss v3 0 网站 但内部 SharePoint 经验很少 尽管这是一个 IT 部门 所以
  • 如何提取一些单元测试来分离gradle测试任务?

    假设我想将 Robolectric 测试与普通单元测试分开 并将它们作为单独的 gradle 任务运行 是否可以 我已经设法从单元测试中排除不需要的测试 android testOptions unitTests all exclude p
  • Linux内核AIO,开放系统调用

    为什么 Linux 内核 AIO 不支持异步 开放 系统调用 因为 打开 可能会长时间阻塞文件系统 不是吗 首先 这是一个非常好的 合理的问题 不幸的是 它可能会赶走比我更有知识的人 AFAICT 没有good原因 您设法挖掘的讨论是相关的