阻塞与未阻塞的I / O缓冲?

时间:2019-07-18 06:01:17

标签: c buffer zos

我正在阅读一些有关z / OS的blocked IO概念的信息。它指出:

  

阻止的I / O是ISO标准的扩展。对于以块格式打开的文件,z /OS®XL C / C ++一次读取和写入一个块。如果您尝试向块中写入更多数据,而该块无法容纳更多数据,则数据将被截断。对于阻塞的I / O,z / OS XL C / C ++仅允许使用fread()和fwrite()来读写文件。

然后它会说:

  

fflush()函数对被阻止的I / O文件无效。

但是,在another文章中说:

  

对于终端,由于I / O始终是无阻塞的,因此行缓冲是   等同于完全缓冲。

     

对于记录I / O文件,缓冲为   仅对z / OS UNIX中的阻止文件或记录I / O文件有意义   使用完全缓冲的文件系统。对于未阻止的文件,缓冲区为   每次写入后已满,因此立即写入,离开   没有要冲洗的东西。对于阻塞文件或全缓冲UNIX文件系统   文件,但是,缓冲区可以包含一个或多个具有以下内容的记录:   未冲洗,需要冲洗操作才能进入   系统。

     

对于被阻止的I / O文件,缓冲总是毫无意义的。

我对这一切感到非常困惑。如果I / O畅通无阻,那么行缓冲与完全缓冲等效吗?为什么不刷新对块I / O没有影响?此外,阻塞的I / O导致缓冲始终无意义是什么意思?任何关于阻塞I / O与未阻塞I / O在这里发生的事情以及它如何发挥缓冲作用的直觉都将不胜感激。

1 个答案:

答案 0 :(得分:4)

我对您提供的内容的看法是,这是指MVS数据集的阻塞I / O。这些将不同于Unix System Services HFS / ZFS中存储的文件。与终端I / O不同。

  

我对这一切感到非常困惑。如果I / O被解除阻止,怎么办   行缓冲等于完全缓冲吗?

我认为您指的是对终端I / O的引用,该引用指示一行是一条记录,并且与块大小相同,因此每条记录都是完整的数据块。也就是说,每块LRECL = BLKSIZE == 1条记录,因此它不被缓冲,或者说缓冲是记录。

  

为什么不刷新块I / O会有所不同?

每个块有多个记录的地方,在块满之前,fflush不会写入块。我怀疑这与平台上早于C的z / OS中的I / O实现有关,因此他们做出了一项设计决策,以不引起不同语言在I / O进行方式上的不同行为。

  

此外,阻塞的I / O导致缓冲始终无意义是什么意思?

同样,z / OS会写完整的块,但文件中的最后一个块可能会很短,因为它没有包含完整块的足够记录。

在C进入平台之前,z / OS已有许多历史,并且z / OS竭尽全力提供一致性。