Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Буферизация при чтении функциями С и Win32  (Прочитано 5754 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
tumanovalex
Помогающий

ru
Offline Offline

« : 20-09-2008 06:28 » new

Меня заинтересовал вопрос о буферизации ввода-вывода и я решил попробовал проверить, так ли я все понимаю, на конкретной программе. В ней читается один и тот же файл функциями С и Win32 с включенной буферизацией и выключенной. Удобно смотреть, как это работает, на примере чтения небольшого файла (я смотрел на файле 10 мб) с CD. Функция Win32 CreateFile действительно отключает буферизацию (файл читается с диска постоянно, индикатор горит), а функция setvbuf буферизацию не отключает (файл читается один раз, индикатор гаснет, но в программе чтение происходит). Правильно ли я понимаю принципы работы этой программы в Windwows (программу прилагаю):
1. Windows выделяет свои буферы для операций чтения-записи файла в рамках функции CreateFile . Если я отключаю буферизацию, а в программе использую свой буфер, то windows создает в памяти только буфер, который я выделяю в своей программе, никаких других буферов не используется. В связи с этим все время читается файл с диска CD.
2. Если я буферизацию не отключаю, то Windows при работе функции CreateFile выделяет свои буферы (буфер1) (интересно, исходя из каких принципов определяется размер этих буферов) и, кроме того, создает буфер, который я выделяю в своей программе (буфер2). При чтении файл читается в буфер1 и, если он умещается целиком, далее в буфер2 он читается из буфера1. Поэтому индикатор дисковода не горит.
3. Я думал, что при использовании функции С будут достигаться те же результаты, что и при использовании функций Win32 (думал, что при компиляции в exe идут вызовы функций Win32) и думал, что setvbuf отключает буферизацию Windows (bufer1). Однако, как показывает программа, это не так (если я все правильно делаю).
Покритикуйте, пожалуйста, мои взгляды на буферизацию и объясните, пожалуйста, почему не работает setvbuf.

* Bufer.zip (28.79 Кб - загружено 831 раз.)
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 20-09-2008 16:28 » 

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

Функция sevbuf() никак не связана с ОС и с ReadFile в частности - это часть стандартной библиотеки C и влияет на "потоковые" функции, работающие со структурой FILE. Т.е. это буферизация уровня приложения и только для определенного набора функций.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines