当Linux内核内存负载变高时,对普通文件的读/写性能如何变化?

看来,对普通文件的写入/读取不可能是非阻塞的。 我find了以下的支持参考:

来自Linux编程接口:Linux和UNIX系统编程手册:

“—非阻塞模式可用于设备(​​如terminal和伪terminal),pipe道,FIFO和套接字(因为pipe道和套接字的文件描述符不是使用open()获得的,所以我们必须使用fcntl ()F_SETFL操作见5.3节)O_NONBLOCK通常在常规文件中被忽略,因为内核缓冲区的高速caching保证了常规文件上的I / O不会被阻塞,如13.1节所描述的那样,但是O_NONBLOCK对常规当使用强制文件locking时(第55.4节)—“

从UNIX环境中的高级编程第二版:

“—我们也说过,与磁盘I / O相关的系统调用并不算慢,即使读写磁盘文件可能暂时阻塞调用者—”

从http://www.remlab.net/op/nonblock.shtml :

“—规则文件总是可读的,而且它们也总是可写的,这在相关的POSIX规范中已经清楚地说明了,我不能强调这一点,把一个普通的文件放在非阻塞文件中绝对没有任何效果,文件标志从常规文件读取可能需要很长时间,例如,如果它位于繁忙的磁盘上,I / O调度程序可能花费很多时间以致于用户会注意到应用程序被冻结。如果系统需要时间来执行I / O操作,它将使任务处于不可中断的睡眠状态或者写系统调用—“

当内存充分可用时,通过内核缓冲来执行读/写操作。

我的问题是:是否有内核内存不足,缓冲不能立即使用的情况? 如果是的话,内核会做什么? 只是返回一个错误或做一些惊人的把戏?

多谢你们!

我采取O_NONBLOCK和引用文字:

  • 如果触发实际磁盘I / O块的系统调用或不等待I / O完成,则O_NONBLOCK完全不起作用 。 O_NONBLCOK只影响文件系统级别的操作,如访问伪文件(作为第一个引号的提及)和锁定的文件。 O_NONBLOCK不会影响块设备级别的任何操作。

  • 缺少内存与O_NONBLOCK无关。

  • O_NONBLOCK指示是否访问锁定的文件。 例如,flock()/ lockf()可用于锁定文件。 如果使用O_NONBLOCK,read()/ write()将立即返回EGAIN,而不是阻塞,并等待释放文件锁定。 请记住,这种同步差异是在文件系统级别实现的,与read()/ write()系统调用是否触发真正的磁盘I / O无关。

  • because the kernel buffer cache ensures that I/O on regular files does not block的片段because the kernel buffer cache ensures that I/O on regular files does not block从第一个报价是误导性的,我会尽可能考虑错误。 确实,缓冲降低了文件读/写系统调用导致磁盘I / O并因此阻塞的机会,但单独缓冲不能完全避免I / O。 如果文件没有被缓存,当你从文件读取()时,内核需要执行一个实际的IO。 如果您将文件写入()并且页面缓存已满脏页面,则内核必须首先将一些数据刷新到存储设备,以腾出空间。 我觉得如果你在脑海中跳过这个片段,文字就会变得更加清晰。

  • 第二个引用似乎是通用的(对于某些缓慢的东西,这意味着什么),并没有解释为什么I / O相关的调用不被认为是慢的。 我怀疑在它周围的文字中有更多的背景资料,更多的资格是作者想要说的。

  • 内核中缺少内存可能有两种形式:(a)缓冲区缓存中缺少空闲页面;(b)没有足够的内存来分配新的数据结构来为新的系统调用提供服务。 对于(a)内核简单地回收缓冲区缓存中的页面,可能通过先将脏页面写入磁盘。 这是一个非常常见的情况。 对于(b)内核需要通过将程序数据分页到交换分区来释放内存,或者甚至通过杀死现有进程来释放内存(OOM函数被调用,这几乎杀死了内存消耗最大的进程) 。 这是一种不常见的操作模式,但系统将在用户进程终止后继续运行。