2009-09-29 2 views
2

Я собираюсь сначала признать, что это для проекта класса, так как это будет довольно очевидно. Мы должны делать чтение для проверки размера блока файловой системы. Моя проблема заключается в том, что время, затраченное на это, кажется линейным, без каких-либо шагов, как я ожидал.Исследование размера блока файловой системы

Я приурочивать читать так:

double startTime = getticks(); 
read = fread(x, 1, toRead, fp); 
double endTime = getticks(); 

где getticks использует инструкции RDTSC. Я боюсь, что есть кеширование/предварительная выборка, из-за чего чтение не требует времени во время теста. Я попытался создать случайный файл между каждым исполнением моей программы, но это не облегчает мою проблему.

Каков наилучший способ точного измерения времени, затраченного на чтение с диска? Я уверен, что размер моего блока равен 4096, но как я могу получить данные для поддержки?

+0

Вы хотите что-то дать размер блока или совет по улучшению вашего эксперимента, чтобы угадать размер блока по времени? –

+0

Наверное, я ищу экспериментальную помощь. У меня возникли проблемы с получением C, чтобы делать то, что я хочу с помощью ввода-вывода. – plor

+0

Проверьте fcntl (.., F_NOCACHE, ..), чтобы полностью отключить кеширование. – rpj

ответ

1

Вы можете использовать системные вызовы (open(), read(), write(), ...) непосредственно уменьшить влияние буферизации, проделанной FILE* материала. Также вы можете каким-то образом использовать синхронный ввод-вывод. Один из способов открыть файл с флагом O_SYNC (или O_DIRECT в соответствии с ответом эфемона). Цитируя open (2) страница руководства Linux:

O_SYNC The file is opened for synchronous I/O. Any write(2)s on the 
      resulting file descriptor will block the calling process until 
      the data has been physically written to the underlying hardware. 
      But see NOTES below. 

Другие варианты будут монтировании файловой системы с -o sync (см mount (8)) или установки атрибута S на файл, используя (1) команды chattr.

2

Обычный способ определения размера блока файловой системы - запросить файловую систему, каков ее размер.

#include <sys/statvfs.h> 
#include <stdio.h> 
int main() { 
    struct statvfs fs_stat; 
    statvfs(".", &fs_stat); 
    printf("%lu\n", fs_stat.f_bsize); 
} 

Но если вы действительно хотите, open(…,…|O_DIRECT) или posix_fadvise(…,…,…,POSIX_FADV_DONTNEED) будет пытаться препятствовать вам кеш буфера во время загрузки ядра (не гарантировано).

+0

Спасибо, мне нужно сгенерировать граф, который я могу указать на то, что указывает границу блока. Я попробую это и приму это, если это сработает для меня. – plor

Смежные вопросы