Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238

Пользовательская буферизация

13.09.2019, 22:51. Показов 4934. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что такое пользовательская буферизация? Читаю книгу по системному программированию и в ней есть тема пользовательской буферизации,но я не могу понять что автор имеет ввиду под понятием пользовательской буферизации.
Вот цитата с нее :
Кликните здесь для просмотра всего текста
So perform all your I/O in 4 or 8KB chunks and everything is great? Not so fast. The
problem, of course, is that programs rarely deal in terms of blocks. Programs work with
fields, lines, and single characters, not abstractions such as blocks. User-buffered I/O
closes the gap between the filesystem, which speaks in blocks, and the application, which
talks in its own abstractions. How it works is simple, yet very powerful: as data is written,
it is stored in a buffer inside the program’s address space. When the buffer reaches a set
size, called the buffer size, the entire buffer is written out in a single write operation.
Likewise, data is read using buffer-sized, block-aligned chunks. The application’s
various-sized read requests are served not directly from the filesystem, but via the
chunks of the buffer. As the application reads more and more, data is handed out from
the buffer piece-by-piece. Ultimately, when the buffer is empty, another large block-
aligned chunk is read in. In this manner, although the application reads and writes in
whatever odd sizes it chooses, data is buffered such that only large, block-aligned reads
and writes are actually issued to the filesystem. The end result is fewer system calls for
larger amounts of data, all aligned on block boundaries. Huge performance benefits
ensue.
It is possible to implement user buffering by hand in your own programs. Indeed, many
mission-critical applications do just that. The vast majority of programs, however, make
use of the popular standard I/O library (part of the standard C library) or the iostream
library (part of the standard C++ library), which provides a robust and capable user-
buffering solution.

Пользовательская буферизация это просто построение программы с помощью обычных массивов или что?

Добавлено через 5 часов 5 минут
Если это так то как может быть не буферизованный ввод вывод?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.09.2019, 22:51
Ответы с готовыми решениями:

двойная буферизация
можете помочь мне нужен простой пример двойной буферизации а то уже второй день не могу разобраться...и если можно прокоментированый код....

двойная буферизация
Здравствуйте. Ребят не сочтите за труд, помогите разобраться. Проблема собственно вот в чём: Пишу тетрис, в окошке находится стакан с...

Двойная буферизация на С++
Можно её реализовать для консоли, а то больно уж сильно экран мигает. Если можно то подскажите как или линки дайте. Заранее спасибо

49
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
14.09.2019, 19:49  [ТС]
Студворк — интернет-сервис помощи студентам
DrOffset, так разве адресное пространство ядра отделено полностью от адресного пространства программы? Насколько я помню то все адресное пространство процесса состоит с пространства ядра + процесса, разве не так?
И все таки правильно я написал, после вызова read() программа переключается в режим ядра и вызывается обработчик события который вызывает read который сначала читает данные в буфер ядра, потом возвращает данные обработчик, обработчик буфер программы, а буфер программы тому буферу который был указан в read()?

Добавлено через 5 часов 15 минут
DrOffset, я прочитал ту статью и у меня появились сомнения,вот цитата
Buffered output streams will accumulate write results into an intermediate buffer, sending it to the OS file system only when enough data has accumulated (or flush() is requested). This reduces the number of file system calls. Since file system calls can be expensive on most platforms (compared to short memcpy), buffered output is a net win when performing a large number of small writes. Unbuffered output is generally better when you already have large buffers to send -- copying to an intermediate buffer will not reduce the number of OS calls further, and introduces additional work.
Речь идет именно о буферах в ядре ,flush сбрасывает буферы в ядре,при чем как раз причины сброса данных такие же как для буферов ядра
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.09.2019, 19:55
Цитата Сообщение от Vanconts Посмотреть сообщение
Насколько я помню то все адресное пространство процесса состоит с пространства ядра + процесса, разве не так?
Я не знаю, какой именно смысл вы вкладываете в свои слова, но в такой формулировке это не так.

Цитата Сообщение от Vanconts Посмотреть сообщение
flush сбрасывает буферы в ядре
Не "в ядре", а "в ядро". Т.е. данные из буфера библиотеки С (RTL), передаются в системный вызов. О чем и говорилось неоднократно выше. Об этом же говорится в вашей цитате.

Добавлено через 1 минуту
Цитата Сообщение от Vanconts Посмотреть сообщение
буфер программы
Не понятно что именно вы здесь называете буфером программы.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
14.09.2019, 19:56  [ТС]
DrOffset,
Writebacks are carried out by a gang of kernel threads named flusher threads. When
one of the previous two conditions is met, the flusher threads wake up and begin com‐
mitting dirty buffers to disk until neither condition is true.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.09.2019, 19:59
Vanconts, к чему это?
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
14.09.2019, 20:01  [ТС]
DrOffset, к тому что flusher сбасывает память на диск с ядра,а не с буфера программы в ядро
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
14.09.2019, 20:04  [ТС]
DrOffset, а вот скрин с сайта о виртуальной памяти на котором видно что 1 ГБ адрессного пространства процесса занимает ядро,возможно это не правда,тогда как все на самом деле?
Миниатюры
Пользовательская буферизация  
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.09.2019, 20:07
Цитата Сообщение от Vanconts Посмотреть сообщение
к тому что flusher сбасывает память на диск с ядра,а не с буфера программы в ядро
Зачем же вы перепутали flush и flusher?
Ваша цитата из #21 не имеет ничего общего с flusher из ядра. Это цитата о библиотечной функции flush, которая делает то, что я написал.

Добавлено через 2 минуты
Цитата Сообщение от Vanconts Посмотреть сообщение
котором видно что 1 ГБ адрессного пространства процесса занимает ядро,возможно это не правда,тогда как все на самом деле?
Это правда. И даже на вашей картинке отчетливо видно, что адресное пространство ядра отделено. Никакой пользовательский процесс не может получить прямой доступ к адресам ядра в обход системных вызовов.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
14.09.2019, 20:10  [ТС]
DrOffset, я кажется понял, спасибо,просто принцип работы буфера ядра с буфером программы слегка схожи поэтому я путался в этом,но так же в той теме было написано что есть ввод-вывод без буфера ,такое же есть в ядре,там написано что не используют буфер для того чтобы быть увереным что данные попали на диск,но это выходит не так,т.к. данные задеживаются в буфере ядра и просто могут не записаться на диск даже если не использовать буфер программы,разве не так?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.09.2019, 20:12
Цитата Сообщение от Vanconts Посмотреть сообщение
там написано что не использую буфер для того чтобы быть увереным что данные попали на диск,но это выходит не так,т.к. данные задеживаются в буфере ядра и просто могут не записаться на диск даже если не использовать буфер программы,разве не так?
Там - это где?

Но вообще да, данные могут не записаться на диск, даже если буфер программы не используется.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
14.09.2019, 20:15  [ТС]
DrOffset, в теме на stackoverflow ,тоесть по сути данные(не всегда) проходят двойную буферизацию?

Добавлено через 1 минуту
а когда я указываю читать 1024 байт 1024 раза по одному байту с файла то выходит что ядро вызывает 1024 раза read с файла по одному байту ,записывает это в буфер программы и уже с этого буфера данные приходят в саму программу?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.09.2019, 20:23
Цитата Сообщение от Vanconts Посмотреть сообщение
в теме на stackoverflow
Если речь об этом:
You want unbuffered output when you already have large sequence of bytes ready to write to disk, and want to avoid an extra copy into a second buffer in the middle.
то здесь не говорится ничего о гарантиях записи на диск, а лишь только об избежании записи в дополнительный буфер.

Самый простой пример и наглядный - это запись на флешку, если вы открыли файл в программе, и даже если отключили буферизированный ввод-вывод из RTL, записали файл, данные ушли драйверу и все коды возврата всех вызовов сигнализируют об успешной записи, то это далеко не означает, что они реально будут записаны. Именно поэтому у вас просят сделать "безопасное извлечение" (в Linux также есть команда sync для этого). В этот момент драйверу уйдет событие о том, что нужно сбросить все данные на носитель.

Добавлено через 4 минуты
Цитата Сообщение от Vanconts Посмотреть сообщение
то выходит что ядро вызывает 1024 раза read с файла по одному байту
Я в этом не уверен. 1024 раза будет делаться системный вызов - это точно. Но вот будет ли ядро 1024 раза дергать устройство - это очень вряд ли.
1
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
14.09.2019, 20:25  [ТС]
DrOffset, ну именно как буферы ядра работают я понял
и я об этом

You want unbuffered output whenever you want to ensure that the output has been written before continuing.
насколько я понял записан значит именно записан на диск

Добавлено через 55 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
Я в этом не уверен. 1024 раза будет делаться системный вызов - это точно.
спасибо ,так понятно
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.09.2019, 20:29
You want unbuffered output whenever you want to ensure that the output has been written before continuing.
Несколько неоднозначная фраза.
Я бы не понимал ее буквально на вашем месте.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
14.09.2019, 20:40  [ТС]
DrOffset, просто теперь когда я понял как все работает то как по мне это глупый подход постройки логики,нужно проверять скорее записаны ли данные на диск ,а не в ядро,
а вот еще такой момент насчет sync() ,насколько я знаю sync как и fsync только "убеждаются " что данные записываются на диск,а чтобы использовать прямую запись с буфера программы на диск нужно открыть файл с флагом O_DIRECT,не так ли?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
15.09.2019, 00:08
Цитата Сообщение от Vanconts Посмотреть сообщение
то как по мне это глупый подход постройки логики,нужно проверять скорее записаны ли данные на диск ,а не в ядро,
Я не уверен, что с вашим опытом вы имеете право делать подобные выводы.
Большинству программ совершенно не важно, записаны ли реально данные сию минуту или будут записаны чуть позже. Если бы каждая обращающаяся к диску программа требовала немедленной реакции устройства на это, то как вы считаете, что бы произошло? Я вам подскажу: устройство будет просто "висеть" в бесконечной активности, что приведет не только к "тормозам" на уровне софта, но и быстрому его (устройства) износу.

Добавлено через 3 минуты
Цитата Сообщение от Vanconts Посмотреть сообщение
а чтобы использовать прямую запись с буфера программы на диск нужно открыть файл с флагом O_DIRECT,не так ли?
Да.
И кстати в справке к этому флагу написано следующее:
Use of this flag can drastically reduce performance if not used with care.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
15.09.2019, 00:19  [ТС]
DrOffset, а в каких случаях это может быть?
Цитата Сообщение от DrOffset Посмотреть сообщение
Use of this flag can drastically reduce performance if not used with care.
Что значит with care? Есть какие-то случаи когда не стоит это использовать?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
15.09.2019, 00:42
Цитата Сообщение от Vanconts Посмотреть сообщение
with care
"с осторожностью".

Цитата Сообщение от Vanconts Посмотреть сообщение
Есть какие-то случаи когда не стоит это использовать?
Практически всегда вы не должны это использовать. Т.е. у вас должно быть основание и реальная потребность использовать этот флаг.

Добавлено через 1 минуту
Возможно будет полезно: https://lwn.net/Articles/457667/
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
15.09.2019, 00:43  [ТС]
DrOffset, та я понимаю что с осторожностью, просто что значит с осторожностью в моем случае? Это может быть опасно? И кстати чем так плохо делать прямой ввод-вывод?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
15.09.2019, 01:31
Цитата Сообщение от Vanconts Посмотреть сообщение
Это может быть опасно? И кстати чем так плохо делать прямой ввод-вывод?
Я ж выше написал чем.
1
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
15.09.2019, 11:24
Vanconts, жесткие диски осуществляют обмен информацией только блоками - секторами (512, 1024, ... байт). Если вы хотите прочесть один байт, то с диска нужно всё равно прочесть сектор, затем из прочитанного выбрать один байт. Если вы хотите следующий байт, то нужно опять прочесть тот же сектор и выбрать из него следующий байт. Логично, что выгоднее прочесть сектор один раз в память, а последующие операции чтения выполнять из памяти миную обращение к дискам. При записи ещё хуже. Что бы записать байт, нужно сперва прочесть сектор, заменить в нём байт и затем записать изменённый сектор на диск. Блочный алгоритм работы дисков вынуждает к использованию промежуточного буфера. Если хотите работать напрямую, то вы должны работать с блоками памяти кратными секторам как по размеру, так и по смещению.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.09.2019, 11:24

Нужна двойная буферизация для программы
Сделал игру змейка.Но не могу найти нигде как использовать двойную буферизацию, потому что моргания портят вид.Может кто знает? #include...

пользовательская функцыя
народ помогите написать программу http://radikal .r u/fp/69956ae3a3d746208c492c4c105fe87c Добавлено через 7 минут надо написать...

Пользовательская функция
Что такое пользовательская функция? И что делает numb? Заранее спасибо.

Пользовательская функция!
На интервале с точностью e(e>0) определить значение одного корня уравнения cos(2/x)*sin(x)+1=0 Определить минимальное значение функции...

Пользовательская функция О_О
Ребят такое задание: необходимо вывести следующий текст на экран "Three blind mice", используя пользовательскую функцию. Ее нужно вызывать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru