|
|
1.1 root 1: /*
2: * Random page access with
3: * a gaussian distribution.
4: *
5: * Allocate a large (zero fill on demand) address
6: * space and fault the pages in a random gaussian
7: * order.
8: */
9:
10: float sqrt(), log(), rnd(), cos(), gauss();
11: char *valloc();
12: int rand();
13:
14: main(argc, argv)
15: char *argv[];
16: {
17: register int pn, i, niter, delta;
18: register char *pages;
19: float sd = 10.0;
20: int npages = 4096, pagesize, debug = 0;
21: char *name;
22:
23: name = argv[0];
24: argc--, argv++;
25: again:
26: if (argc < 1) {
27: usage:
28: printf(
29: "usage: %s [ -d ] [ -p #pages ] [ -s standard-deviation ] iterations\n", name);
30: exit(1);
31: }
32: if (strcmp(*argv, "-s") == 0) {
33: argc--, argv++;
34: if (argc < 1)
35: goto usage;
36: sscanf(*argv, "%f", &sd);
37: if (sd <= 0) {
38: printf("%s: Bad standard deviation.\n", *argv);
39: exit(2);
40: }
41: argc--, argv++;
42: goto again;
43: }
44: if (strcmp(*argv, "-p") == 0) {
45: argc--, argv++;
46: if (argc < 1)
47: goto usage;
48: npages = atoi(*argv);
49: if (npages <= 0) {
50: printf("%s: Bad page count.\n", *argv);
51: exit(2);
52: }
53: argc--, argv++;
54: goto again;
55: }
56: if (strcmp(*argv, "-d") == 0) {
57: argc--, argv++;
58: debug++;
59: goto again;
60: }
61: niter = atoi(*argv);
62: pagesize = getpagesize();
63: pages = valloc(npages*pagesize);
64: if (pages == (char *)0) {
65: printf("Can't allocate %d pages (%2.1f megabytes).\n",
66: npages, (npages*pagesize) / (1024. * 1024.));
67: exit(3);
68: }
69: pn = 0;
70: for (i = 0; i < niter; i++) {
71: delta = gauss(sd, 0.0);
72: while (pn + delta < 0 || pn + delta > npages)
73: delta = gauss(sd, 0.0);
74: pn += delta;
75: if (debug)
76: printf("touch page %d\n", pn);
77: else
78: pages[pn * pagesize] = 1;
79: }
80: }
81:
82: float
83: gauss(sd, mean)
84: float sd, mean;
85: {
86: register float qa, qb;
87:
88: qa = sqrt(log(rnd()) * -2.0);
89: qb = 3.14159 * rnd();
90: return (qa * cos(qb) * sd + mean);
91: }
92:
93: float
94: rnd()
95: {
96: static int seed = 1;
97: static int biggest = 0x7fffffff;
98:
99: return ((float)rand(seed) / (float)biggest);
100: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.