我正在阅读一些有关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在这里发生的事情以及它如何发挥缓冲作用的直觉都将不胜感激。
答案 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竭尽全力提供一致性。