- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
为什么 Linux 内核 AIO 不支持异步“打开”系统调用?因为 'open' 会在文件系统上阻塞很长时间,不是吗?
最佳答案
首先,这是一个非常好的合理问题; downvote 是不幸的,它可能把比我更有知识的人赶走了。
AFAICT,没有好的理由。您设法挖掘的讨论是相关的,但根本不令人满意(这可能也是您的结论)。尽管 Torvald 的观点在技术上是正确的,但他们显然忽视了房间里的大象——GUI 编程——以及我确信的许多其他用例。
是的,网络服务器会受到网络延迟的限制。这应该是不关心所有其他 IO 的理由,这有点可疑,但我可以接受。
是的,许多服务器工作负载将能够使用 dentry/inode 缓存,但不是全部,而且总会有遗漏。
是的,“购买更多 RAM”的说法有效。我从来没有发现这是一个很好的论点。
然后是所有其他用例。对于许多人来说,包括 GUI 编程,我们有时或经常阻塞并不重要;我们永远不应该阻止。如果访问模式非常随机且时间间隔很远,那么购买更多 RAM 也无济于事——除非拥有与辅助存储提供的容量一样大的容量。
“反正要快”的想法也是错误的;始终考虑远程文件系统。
唯一引人注目的一点是:
Short and sweet: "aio_open()" is basically never supposed to be an issue. If it is, you've misdesigned something, or you're trying too damn hard to single-thread everything (and "hiding" the threading that does happen by just calling it "AIO" instead - lying to yourself, in short).
这里的重点恰恰是为了避免线程,所以这句话让我很惊讶。甚至列举了其他论点这一事实在我看来表明,这个论点太脆弱了,无法独立存在。
在同一个讨论中深入挖掘,您可以找到 Mikulas Patocka 的这篇帖子:
You can emulate asynchronous IO with kernel threads like FreeBSD and some commercial Unices do, but you still need as many (possibly kernel) threads as many requests you are servicing.
(...)
Making real async IO would require to rewrite all filesystems and whole VFS _from_scratch_. It won't happen.
http://lkml.iu.edu//hypermail/linux/kernel/0102.1/0074.html
这听起来像是一个正确的解释,但显然不是一个好的解释。
请记住,这是一个旧线程,此后发生了很多变化,因此这个答案的值(value)很小。但是,它提供了关于为什么假设的 aio_open
历史上 不可用的见解。此外,要了解许多内核讨论(或与此相关的任何项目的任何内部讨论)通常期望所有参与者都从大量假设开始。因此,我完全有可能没有以正确的方式看待这个问题。
话虽如此,这一点很有趣(Stephen C. Tweedie):
Ahh, but even VMS SYS$QIO is synchronous at doing opens, allocation of the IO request packets, and mapping file location to disk blocks. Only the data IO is ever async (and Ben's async IO stuff for Linux provides that too).
http://lkml.iu.edu//hypermail/linux/kernel/0102.1/0139.html
为什么有趣?因为它强化了这样一种观念,即许多不同的系统不会异步实现 open
(和其他调用)。此外,aio_open
不是由 POSIX 指定的,我找不到解释原因的讨论。 Windows 似乎也忽略了这个问题。
就好像这个概念中有一些内在的东西是错误的或困难的,除了似乎没有人能很好地说明为什么最终会这样。
我的猜测是这只是低优先级,而且一直都是。包括线程化或预先打开文件在内的变通办法对于足够多的用例来说应该是足够的,这些用例可以提供功能,但永远不会被证明是合理的。
了解为什么 POSIX 没有定义这样的调用会很有趣。不过,我希望有一个“超出范围”的理由。
如果你想弄个水落石出,我想你必须把讨论带到更合适的 channel ,比如 LKML。
关于Linux内核AIO,开启系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22780822/
总的来说,我对 Linux 内核和操作系统非常感兴趣。我想知道的是,内核的文件类型或扩展名是什么?它显然没有 .exe 或 .out 扩展名,因为它们用于安装在操作系统上的应用程序。 内核只是一个二进
我需要为 Raspbian Linux 内核添加一个自己的系统调用。现在我在搜索了大约 2 天以找到解决方案后陷入困境。 要加一个系统调用,我基本上是按照大纲来的( http://elinux.org
对于一个学术项目,我希望将源文件 (myfile.c) 添加到 kernel/目录,与exit.c相同的目录和 fork.c .构建系统似乎不会自动获取新文件,因为我在 myfile.c 中定义的函数
浏览器排行榜 浏览器市占率排行榜全球榜 。 浏览器市占率排行榜中国榜 -快科技 。 如果按照浏览器内核来看, Chromium 内核的市场占有率无疑是最大的,一家独大
给定一个进程或线程的任务结构,迭代属于同一进程的所有其他线程的习惯用法是什么? 最佳答案 Linux 不区分进程(任务)和线程。库调用 fork() 和 pthread_create() 使用相同的系
我正在用c(不是linux。完全从头开始)从头开始制作一个内核,但我遇到了一些问题。我有这个代码: #include "timer.h" int ms = 0; void timer_handler(
我正在从头开始制作一个 C 内核,我实际上只是从网站上复制了这段代码,因为我的代码无法工作,所以我很困惑。 void kmain(void) { const char *str = "my f
我不确定,如果我完全理解上述差异,所以我想自己解释一下,你可以打断我,只要我有错:“内核是创建内核线程的初始代码段。内核线程是由内核管理的进程。用户线程是进程的一部分。如果你有一个单线程进程,那么整个
看一下struct file 定义from this code Linux 内核版本 2.6.18。 我正在尝试比较代码中的两个 struct file 变量,并确定它们是否指的是同一个文件。该结构中
我试图在 Linux 启动时使嵌入式设备中的 LED 闪烁。基本上,LED 闪烁表明 Linux 正在启动。为了使 LED 闪烁,我正在做以下事情 在 init/main.c 中创建了一个全局定时器(
我有一些在 FreeBSD 和 Linux 上运行的特定硬件。 我必须做一个用户空间应用程序,它将使用内核/用户空间应用程序之间的共享内存与驱动程序一起工作。我的应用程序对来自用户空间的共享内存进行忙
我在哪里可以找到 linux 内核中相应函数的解释,特别是对于 ICMPv4? 例如:icmp_reply、icmp_send等 感谢您的帮助。 最好的,阿里木 最佳答案 探索 Linux 内核中的
我在 Linux Kernel 3.4 上工作,我有以下代码: /* Proximity sensor calibration values */ unsigned int als_kadc;
我正在阅读“罗伯特·洛夫 (Robert Love) 撰写的 Linux 内核开发第 3 版”,以大致了解 Linux 内核的工作原理..(2.6.2.3) 我对等待队列的工作方式感到困惑,例如这段代
我之前也问过同样的问题,但是我的帖子不知为何被删除了。 无论如何,我正在尝试使用 C++ 并编写一个允许我直接访问内存并向其中写入内容的程序。我听说我需要对内核做一些事情,因为它是连接操作系统和应用程
在尝试了解 Ruby 执行方法时,我找到了这篇关于在 Ruby 中运行命令的五种方法的博文 http://mentalized.net/journal/2010/03/08/5_ways_to_run
是否有 Linux 发行版(Minix 除外)包含良好的源代码文档?或者,是否有一些好的文档来描述一般的 Linux 源代码? 我已经下载了内核源代码,但是(不出所料)我有点不知所措,我想知道是否有一
有谁知道 linux 中的哪个函数或文件包含查找用于 bind() 系统调用的随机端口的算法?我到处寻找,在 Linux 源代码中找不到包含此算法的方法。 谢谢! 最佳答案 这是一段又长又复杂的代码,
前言 首先,对于有科班背景的读者,可以跳过本系列文章。这些文章的主要目的是通过简单易懂的汇总,帮助非科班出身的读者理解底层知识,进一步了解为什么在面试中会涉及这些底层问题。否则,某些概念将始终
CentOS7.2与CentOS6区别及特点 Linux 操作系统的启动首先从 BIOS 开始,接下来进入 boot loader,由 bootloader 载入内核,进行内核初始化。内核初始化的
我是一名优秀的程序员,十分优秀!