Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解Ruby和OS I/O缓冲_Ruby_Operating System_Io_Buffering_Io Buffering - Fatal编程技术网

了解Ruby和OS I/O缓冲

了解Ruby和OS I/O缓冲,ruby,operating-system,io,buffering,io-buffering,Ruby,Operating System,Io,Buffering,Io Buffering,在Ruby中IO缓冲是如何工作的?使用IO和文件类时,数据刷新到底层流的频率是多少?这与操作系统缓冲相比如何?在自信地将给定数据读回进行处理之前,需要做些什么来确保已将其写入磁盘?Ruby IO文档并不是100%清楚这种缓冲是如何工作的,但您可以从文档中提取以下内容: Ruby IO有自己的内部缓冲区 除此之外,底层操作系统可能会进一步缓冲数据,也可能不会 要查看的相关方法: :刷新IO。我还查看了Ruby源代码,调用IO.flush也调用底层操作系统。这应该足以缓存文件,但不能保证将物理

在Ruby中IO缓冲是如何工作的?使用
IO
文件
类时,数据刷新到底层流的频率是多少?这与操作系统缓冲相比如何?在自信地将给定数据读回进行处理之前,需要做些什么来确保已将其写入磁盘?

Ruby IO文档并不是100%清楚这种缓冲是如何工作的,但您可以从文档中提取以下内容:

  • Ruby IO有自己的内部缓冲区
  • 除此之外,底层操作系统可能会进一步缓冲数据,也可能不会
要查看的相关方法:

  • :刷新
    IO
    。我还查看了Ruby源代码,调用
    IO.flush也调用底层操作系统。这应该足以缓存文件,但不能保证将物理数据存储到磁盘
  • :如果设置为
    true
    ,则不会执行Ruby内部缓冲。所有内容都会立即发送到操作系统,并且每次写入都会调用
    fflush()
  • :返回当前同步设置(
    true
    false
  • :刷新操作系统上的两个Ruby缓冲区+调用(如果支持)。这将保证完全刷新物理磁盘文件
  • :关闭Ruby
    IO
    并将挂起的数据写入操作系统。请注意,这并不意味着
    fsync()
    。上的POSIX文档表示,它不保证数据以物理方式写入文件。因此,需要使用显式的
    fsync()
    调用
结论:
flush
和/或
close
应足以缓存文件,以便其他进程或操作可以完全读取该文件。要确定地将文件一直传送到物理介质,需要调用
IO.fsync

其他相关方法:

  • :绕过Ruby内部缓冲区,直接进行OS
    写入操作。如果使用此选项,请不要将其与
    IO.read/write
    混合使用
  • :同上,但用于阅读

    • Ruby在操作系统的顶部进行内部缓冲。执行file.flush时,Ruby将刷新其内部缓冲区。要确保文件写入磁盘,需要执行file.fsync。但最终你无法确定文件是否写入磁盘,这取决于操作系统、硬盘驱动器控制器和硬盘驱动器