Я читаю о внутреннем и системном вызовах Linux и зацикливаюсь на термине IO Stream
(это позор, потому что я опытный программист).
Моя лучшая догадка, что за Поток ввода-вывода на самом деле заключается в том, что это операция передачи данных в виде последовательности байтов из одной абстракции файла в другую.
Ясно, что это не вопрос о разнице между буферизацией и потоковой передачей.
Буферизация является реализацией.Он используется потому, что передача байтов с устройств в память медленная, и нет необходимости делать это для каждых нескольких байтов, потому что:
- переключение контекста стоит дорого
- ОЗУ подключено напрямую кПроцессор и даже 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
что делает его соответствующим потоком ?