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

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

13.09.2019, 22:51. Показов 4932. Ответов 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
15.09.2019, 14:25  [ТС]
Студворк — интернет-сервис помощи студентам
Ygg,
Цитата Сообщение от Ygg Посмотреть сообщение
Если вы хотите следующий байт, то нужно опять прочесть тот же сектор и выбрать из него следующий байт
так а зачем так делать? есть же page cache который как раз таки предназначен для этого,если после первого чтения целый блок считан то второе обращение на считывание должно читать данные уже кешированные в ядре ,а не еще раз считывать
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
15.09.2019, 15:31
Цитата Сообщение от Vanconts Посмотреть сообщение
так а зачем так делать?
Если вы отключаете системный кэш и работаете без него, то нужно учитывать блочность в своей программе.
Возможно я отклоняюсь от изначального вопроса. Но на примере конкретной реализации работы с дисками под виндовс. Есть системный кэш, в числе прочего он используется для работы блоками (File Caching). Программа может отключить использование системного кэша, но тогда она должна собственными силами обеспечивать выравнивание и размеры блоков данных (File Buffering).

Добавлено через 43 минуты
Здравствуйте,не могли бы Вы мне описать весь процесс считывания?
Вот вызвал я read() в программе в этот момент процесс переходит в режим ядра в котором вызывается обработчик этого read() который вызывает сам read который читает данные с файла,тут момент как он их читает? если я вызову read(filedesc,buf,1) 1000 раз то системный вызов read будет 1000 раз читать по 1 байту,или он прочитает 1000 байт за раз и 1000 раз вернет по 1 байту в буфер программы?
read - это библиотечная функция. Она призвана для абстрагирования от конкретной ОС. Как она устроена можно только гадать. Если мы говорим про виндовс, то скорее всего библиотечные функции не имеют какого-то собственного кэша и работают через файловые функции операционки, вроде CreateFile и ReadFile. При считывании первого байта читается больше данных и они кэшируются в системном файловом кэше. При следующих вызовах чтения байты читаются уже из системного кэша. Однако, системный файловый кэш нужен не только для обеспечения блочных операций. В виндовс может параллельно работать несколько программ, несколько программ могут одновременно работать с одним файлом. Системный файловый кэш должен как-то шариться между различными программами. При обращении к файловому кэшу система должна, как минимум, обеспечивать межпроцессорные блокировки и дополнительные проверки аргументов. При обращении к кэшу тысячу раз вместо одного, тысяча раз будут выполняться блокировки и проверки аргументов. В данном случае падение производительности будет не столько из-за работы с диском, сколько из-за накладных расходов при обращении к системе.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
15.09.2019, 16:29
Цитата Сообщение от Ygg Посмотреть сообщение
read - это библиотечная функция. Она призвана для абстрагирования от конкретной ОС. Как она устроена можно только гадать.
Судя по первым цитатам ТС, он читает книгу Роберта Лав, которая описывает Linux.
Так что в данном случае read - это тонкая обертка в libc над одноименным системным вызовом.
1
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
15.09.2019, 16:54  [ТС]
DrOffset, так что будет происходить после вызова read() 1000 раз по одному байту? После считывания одного байт ядро каждый раз будет отправлять этот байт в буфер программы? Или оно отправит уже 1000 байт после их чтения?
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
15.09.2019, 17:26
Полагаю, что основные принципы универсальны и не зависят от операционки. Чтение по одному байту можно сравнить с поэлементным чтением массива через отдельную функцию. Даже без учёта файловой специфики накладные расходы на постоянное сворачивание/разворачивание стека вызова, сохранение/восстановление регистров на стеке будут замедлять работу по сравнению с одиночной операцией копирования всего массива и прямой обработкой его копии.
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
15.09.2019, 22:54
Цитата Сообщение от Vanconts Посмотреть сообщение
так что будет происходить после вызова read() 1000 раз по одному байту? После считывания одного байт ядро каждый раз будет отправлять этот байт в буфер программы? Или оно отправит уже 1000 байт после их чтения?
Если под буфером программы вы понимаете какой-то буфер на стороне приложения, т.е. буфер в user space, то да - ядро будет тысячу раз пересылать по байту.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
16.09.2019, 00:38  [ТС]
DrOffset, буфер в user space это буфер который я создаю вручную? Тоесть к примеру буфер в который read() читает?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.09.2019, 01:11
Цитата Сообщение от Vanconts Посмотреть сообщение
буфер в user space это буфер который я создаю вручную? Тоесть к примеру буфер в который read() читает?
Либо вы, либо RTL в своей реализации ввода-вывода.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
16.09.2019, 04:40  [ТС]
DrOffset, Тоесть если я сделаю так
C++
1
char buff[1024]; read(fd, buff, sizeof(buff)) ;
И не буду создавать никаких других массивов или подключать что-то, то buff будет моим пользовательским буфером? И больше не должно быть никаких буферов между buff и буфера и ядра?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.09.2019, 08:34
Цитата Сообщение от Vanconts Посмотреть сообщение
И не буду создавать никаких других массивов или подключать что-то, то buff будет моим пользовательским буфером? И больше не должно быть никаких буферов между buff и буфера и ядра?
Я бы сказал, что это зависит от того что из себя представляет fd. Но в целом да, никаких промежуточных буферов обычно нет.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.09.2019, 08:34

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru