#include #include #include #include #include #include char *file = "/larder/file/file0"; int fd; int size = 1*G; char *ptr = 0; int foo(void) { static int old = -1; int pos; char tmp; long long before, after; volatile char x __attribute__ ((unused)); do { pos = random() % size; if (mincore(&ptr[pos], 1, &tmp)) pdie("mincore"); } while (tmp); before = rdtsc(); x = ptr[pos]; after = rdtsc(); char str[1024]; size_t len; #define SYSCTL(foo) \ unsigned int foo; \ str[0] = 0; len = sizeof(str); \ if (sysctlbyname("debug." ## #foo, str, &len, NULL, 0)) \ pdie("sysctl"); \ foo = *(int*)str; SYSCTL(secsprcyl); SYSCTL(blkno); SYSCTL(cylinder); SYSCTL(head); SYSCTL(sector); SYSCTL(lba); if (old >= 0) printf("%g \t%g \tblk %d cyl %d head %d sec %d\n", (pos - old) / (1.0*M), (after - before)/1000.0, blkno, cylinder, head, sector); old = pos; return pos; } int main(int argc, char *argv[]) { int i; fd = open(file, O_RDONLY); unless (fd >= 0) die("open"); ptr = (char *) mmap(0, size, PROT_READ, MAP_PRIVATE, fd, 0); unless (ptr) die("mmap"); srandom(time(0)+getpid()); for (i = 0; i < 10000; i++) foo(); return 0; }