Linux内核中的IO Stream抽象和缓冲实现

时间:2018-06-03 03:56:46

标签: python linux-kernel system-calls iostream strace

我正在阅读linux内部和系统调用,我对术语IO Stream感到很沮丧(这是一种耻辱,因为我是一名经验丰富的程序员)。

我对 IO流实际上是什么的最好猜测是,它是从一个文件抽象中将数据作为字节序列传输的操作到另一个。

要明确这不是关于缓冲和流媒体之间差异的问题。

缓冲是一种实现。使用它是因为从设备到内存的传输速度很慢,并且不需要每隔几个字节执行一次,因为:

  1. 上下文切换很昂贵
  2. RAM直接连接到CPU,甚至SSD(nv-RAM)仍然必须通过SATA控制器
  3. 我想做一些分析,所以我查看了python文档并在一个简单的strace上做了open

      

    io.open(file,mode ='r',buffering = -1,encoding = None,errors = None,newline = None,closefd = True)

         

    打开文件并返回相应的流。如果无法打开文件,则会引发IOError。

    据推测,对于文本文件,这将是io.TextBase

    strace的结果是:

    #!/usr/bin/env python3
    with open('./sample.txt') as f:
        print(f.read())
    ...
    # returns 3 which is the first available file descriptor
    openat(AT_FDCWD, "./sample.txt", O_RDONLY|O_CLOEXEC) = 3 
    # check it's not a directory and lseek to 0
    lseek(3, 0, SEEK_CUR)  
    read(3, "streams of screams because I've "..., 46) = 45
    read(3, "", 1)                          = 0
    write(1, "streams of screams because I've "..., 46streams of screams because I've read too much
    ) = 46
    close(3)
    

    因此,python解释器正在从当前工作目录中执行openat,因为我在文件路径上使用了 ./ 。然后进行一些检查并lseek标记移动到文件中的第一个字节。

    然后read为文件,write stdout

    让我感到困惑的是,我认为是python文档中的一行说返回相应的流

    TextBase类的含义是什么,使其成为相应的流

0 个答案:

没有答案