RU/2: Форум. Общение пользователей и разработчиков OS/2 (eCS). : Ответить на сообщение
Имя:
e-mail:
FIDO:
Home page:
сохранить данные о вас
Тема:
> Давно уже у меня зуб на HPFS кэш от Мерлина, по крайней мере русского, и по крайней мере от фиксов 0, 2 и 5. Всегда добивало его категорическая привиредливость при кэшировании на запись. Но когда вчера винчестер тарахтел без умолку, когда я постоянно перечитывал 16-Кб кусок файла, я понял, что тут что-то не так. > > Привожу два примера. Первый - странное кэширование при записи (это не самое странное, что я видел, но всё же). После запуска поначалу всё идет так, как и ожидалось. Но уже через 0-20 секунд (зависит от предыстории) система "зажигает LED HDD и не гасит ее" (надеюсь, я не слишком вульгарно выражаюсь). > > --- begin write.cpp --- > #include "stdio.h" > #include "assert.h" > #include "stdlib.h" > #define INCL_DOS > #include "os2.h" > int main () > { > int sz=65536; > char *buf = new char[sz]; assert(buf!=0); > int i; > for (i=0; sz>i; i++) buf[i]=0; > FILE *f; > f = fopen ("tmp.tmp", "wb"); assert (f!=0); > for (;;) > { > //DosSleep(100); > assert (1==fwrite(buf,sz,1,f)); > fseek(f,0,0); > } > fclose (f); > } > --- end --- > > > Второй пример меня уже добил - эпизодическое, но настойчивое нехотение кэшировать при чтении. > > --- begin rw.cpp --- > #include "stdio.h" > #include "assert.h" > #include "stdlib.h" > > int main(int ac, char **av) > { > int sz=65536; > int wcnt=ac>=2 ? atoi(av[1]) : 0; > char *buf = new char[sz]; assert(buf!=0); > int i; > for (i=0; sz>i; i++) buf[i]=0; > FILE *f; > if (wcnt) > { > f = fopen ("tmp.tmp", "wb"); assert (f!=0); > printf ("Writing...\n"); > for (i=0; wcnt>i; i++) assert (1==fwrite(buf,sz,1,f)); > fclose (f); > } > f = fopen ("tmp.tmp", "rb"); assert (f!=0); > printf ("Reading...\n"); > for (;;) > { > assert (1==fread(buf,sz,1,f)); > fseek(f,0,0); > } > } > --- end --- > > При запуске > > F:\> rw.exe 500 > > (с параметром 1..300 глюка нет, но с 500 или 1000 он есть. почему - не знаю.) > > Вначале, как и положено, он записывает большой файл. > Затем, когда загорится "reading", и кэш записи уже сбросит все данные, загрузка процессора падает почти до нуля, зато винчестер продолжает непрерывно работать. > > После этого можно нажать ctrl+break и запускать просто > F:\> rw.exe > (все дело в надлежащей предыстории) - записи происходить уже не будет, но система будет постоянно обращаться в HDD, перечитывая один и тот же 16-Кб блок. (есть тихое подозрение, что она вовсе даже не его перечитывает) > > Система: > > Merlin Rus FP5, > > Диск F: 4Gb, HPFS > > DiskIdle: 4000 миллисекунд > MaxAge: 10000 миллисекунд > BufferIdle: 2000 миллисекунд > Размер кэш-буфера: 1024 килобайт > Установлено 1 исполнителей ленивой записи. > Опережающее чтение выключено или Установлено 1 исполнителей опережающего чтения - роли не играет. > > Компилятор Watcom C++10.0, (wcl386) > > Что самое обидне, что _на_FATе_получается_всё_как_у_людей_. Замему дополнительно, что на FAT тестовая компиляция проекта из 30 небольших файлов в BC 3.1 идет процентов на 10-20 быстрее. %) Вот те и High Perfomance. > > Неужели надо ставить HPFS386? Или просто руки кривы? > > А, да, чуть не забыл: > --- CONFIG.SYS --- > IFS=F:\OS2\HPFS.IFS /CACHE:1024 /CRECL:4 /AUTOCHECK:FG > DISKCACHE=512,LW (говорят, не влияет, но всё же) > --- startup.cmd --- > F:\OS2\CACHE.EXE -DISKIDLE:4000 -MAXAGE:10000 -BUFFERIDLE:2000 >
__, _, __, _,_ _, _
|_ / \ |_) | | |\/|
| \ / | \ | | | |
~ ~ ~ ~ `~' ~ ~
Programmed by
Dmitri Maximovich
,
Dmitry I. Platonoff
,
Eugen Kuleshov
.
25.09.99 (c) 1999,
RU/2
. All rights reserved.
Rewritten by
Dmitry Ban
. All rights ignored.