Зачем нужна буферизация ввода-вывода в Zig?
Зачем нужна буферизация ввода-вывода в Zig?
В последних версиях zig для вывода обязательно использовать буферизацию (у меня уже был вопрос на эту тему: Возможно ли использовать форматирование без буфера в Zig?), но потом мне стало интересно зачем собственно нужна буферизация? Для оптимизации? Для каких-то ещё нужд?
В интернете есть некоторые статьи про это, но хотелось бы получить ответ от знающих людей, так сказать, хочется всё по полочкам разложить.
PS: В принципе, язык программировния не особенно важен.
Ответы (1 шт):
Так вы написали ответ. Вы написали - "Для оптимизации? Для каких-то ещё нужд?". Точно так, для оптимизации и прочих нужд.
Смотрите, концепция памяти устроена так, что память считается бесконечной, т.е. в общем смысле не всегда имеет размер. И существуют условный "поставщик" данных, и "потребитель" данных. Под данными подразумевается упорядоченный набор байт, неопределённого размера. И это не обязательно данные, но суть не в этом. Существует поток байт, и что то с ним нужно делать. Почти во всех случаях в современном программировании - этот самый "поток байт" и существует повсеместно, причём неопределённого размера.
Так вот буфер - это переиспользуемый кусочек памяти обычно определённого размера. Назначение разное. Это может быть "накопитель" данных. Поступают данные и они накапливаются в буфере, как только накопятся - можно обрабатывать этот буфер целиком. И существует концепция двойной буферизации. Это когда данные накопились - их можно обрабатывать одним куском. А следующие поступающие данные можно собирать во второй буфер. Это распараллеливание задач.
Типичный буфер - это например кеш процессора. Самый ближний кеш ядра состоит из кеш-линий. Так вот это буфер и есть. Данные из оперативки читаются большими кусочками в кеш и кеш-линии, потому что это быстрее получается, чем если читать оперативку как то иначе. Данные из оперативки кусочками залетают в кеш, а из кеша берётся то что нужно ядру процессора.
В случае с зигом скорее всего какие то оптимизации и есть. Залетающие в буфер зига строки возможно обрабатываются. Это ещё одно назначение буферов. Здесь буфер - это не просто "накопитель", а ещё и обработчик данных. Т.е. возможно зиг обрабатывает данные в какой то внутренний собственный нативный формат. И уже после эти данные доступны "потребителю".
Ещё буферы используются как единая точка сбора данных. Т.е. может быть так, что писатель в буфер один, а читателей буфера много. Т.е. данные пишутся в буфер, а вычитываются разными читателями, как только буфер готов.
И даже целиком вся оперативка - это по сути буфер и есть. Точнее виртуальная память. Это память фиксированного размера, где операционная система и терзает эту виртуальную память. Это буфер, большой огромный, но тем не менее - это буфер.
В общем смысле как и всё в теории информации, буфер - это абстракция с поведением. Используется практически везде.
П.с.: "По полочкам" вряд ли разложите. Полочек слишком много, потому что видов и назначений буферов - всяких разных очень много.