Абстракция IO Stream и буферизованная реализация в ядре Linux - PullRequest
0 голосов
/ 03 июня 2018

Я читаю о внутреннем и системном вызовах Linux и зацикливаюсь на термине IO Stream (это позор, потому что я опытный программист).

Моя лучшая догадка, что за Поток ввода-вывода на самом деле заключается в том, что это операция передачи данных в виде последовательности байтов из одной абстракции файла в другую.

Ясно, что это не вопрос о разнице между буферизацией и потоковой передачей.

Буферизация является реализацией.Он используется потому, что передача байтов с устройств в память медленная, и нет необходимости делать это для каждых нескольких байтов, потому что:

  1. переключение контекста стоит дорого
  2. ОЗУ подключено напрямую кПроцессор и даже SSD (nv-RAM) по-прежнему должны проходить через контроллер SATA

Я хотел провести некоторый анализ, поэтому я посмотрел на документы python и сделал strace на простом open:

io.open (файл, режим = 'r', буферизация = -1, кодировка = нет, ошибки = нет, символ новой строки = нет, 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 s файл и write s его stdout .

Что меня смущает здесь, я думаю, это то, что строка в документации по Python, говорящая , возвращает соответствующий поток .

Что такое, например, класс TextBaseчто делает его соответствующим потоком ?

...