tumanovalex
Помогающий
Offline
|
|
« : 20-09-2008 06:28 » |
|
Меня заинтересовал вопрос о буферизации ввода-вывода и я решил попробовал проверить, так ли я все понимаю, на конкретной программе. В ней читается один и тот же файл функциями С и 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.
|