MS-DOS для программиста

Программа CHKINTRL


Для анализа используемого чередования секторов можно использовать программу CHKINTRL (листинг 5.5), которая пытается прочитать подряд два расположенных рядом сектора с номерами 1 и 2. Если используется стандартное чередование, то секторы с номерами 1 и 2 находятся рядом. Если же дорожка отформатирована приведенной выше программой, то эти секторы находятся на максимальном удалении друг от друга.

Программа анализирует время, необходимое на то, чтобы 50 раз подряд прочитать эти два сектора на двадцатой дорожке. Вначале используется головка 0 - это нестандартная дорожка, подготовленная программой FMTINTRL, затем - головка 1, для которой раньше было выполнено стандартное форматирование.

Листинг 5.5. Файл chkintrl\chkintrl.cpp

#include <stdio.h> #include <conio.h> #include <bios.h> #include <dos.h> #include <stdlib.h> #include <time.h>

char diskbuf[1024];

int main(void) { unsigned status = 0, i, j; struct diskinfo_t di; time_t start, end; float t1, t2;

// Читаем первый сектор дорожки // для синхронизации таймера di.drive = 0; di.head = 0; di.track = 20; di.sector = 1; di.nsectors = 1; di.buffer = diskbuf;

for(i = 0; i < 3; i++) { status = _bios_disk (_DISK_READ , &di) >> 8; if(!status) break; }

// Отсчет времени начинаем сразу после чтения // сектора,это позволит компенсировать время, // необходимое на разгон мотора НГМД start = clock();

// Повторяем 50 раз чтение секторов с номерами 1 и 2 for(j=0; j<50; j++) { di.drive = 0; di.head = 0; di.track = 20; di.sector = 1; di.nsectors = 2; di.buffer = diskbuf;

for(i = 0; i < 3; i++) { status = _bios_disk (_DISK_READ , &di) >> 8; if(!status) break; } }

end = clock(); t1 = ((float)end - start) / CLK_TCK;

printf("Время для головки 0: %5.1f\n",t1);

// Выполняем аналогичную процедуру для дорожки, // которая была отформатирована обычным способом di.drive = 0; di.head = 1; di.track = 20; di.sector = 1; di.nsectors = 1; di.buffer = diskbuf;

for(i = 0; i < 3; i++) { status = _bios_disk (_DISK_READ , &di) >> 8; if(!status) break; }

start = clock();

for(j=0; j<50; j++) { di.drive = 0; di.head = 1; di.track = 20; di.sector = 1; di.nsectors = 2; di.buffer = diskbuf;

for(i = 0; i < 3; i++) { status = _bios_disk (_DISK_READ , &di) >> 8; if(!status) break; } } end = clock();

t2 = ((float)end - start) / CLK_TCK;

printf("Время для головки 1: %5.1f\n",t2); return 0; }



Содержание раздела