#include #include "unistd.h" #include #include #include #include #include #include "love.h" #include "mmstat.h" #define PAGESIZE 4096 #define CLEANFILESIZE 128*1024*1024 #define LRUFILESIZE 64*1024*1024 #define MRUFILESIZE 64*1024*1024 #define HATEPAGESTEP 64 #define MRUTOUCH 2 int main(int argc, char** argv) { // unsigned long long start_t, stop_t, *timePerChunk; int i, j, k, x, n; int lrufd, mrufd, cleanfd; void *mrumap, *lrumap, *cleanmap; char *mru, *lru, *clean; time_t start_t, stop_t, middle_t, pass1_t, pass2_t, total_t; int majorFaults; int totalPages, totalPagesOut; int pageTouched; char dummy; struct listsize info; int pppm_index, pppm[2*MRUFILESIZE/PAGESIZE/HATEPAGESTEP]; int pnpm_index, pnpm[2*MRUFILESIZE/PAGESIZE/HATEPAGESTEP]; // clean the cache cleanfd = open("clean", O_RDONLY); cleanmap = mmap(0, CLEANFILESIZE, PROT_READ, MAP_PRIVATE, cleanfd, 0); if (cleanmap == MAP_FAILED) { printf("clean mmap failed."); return 0; } printf("Cleaning the cache by reading dummy file\n"); totalPages = 0; clean = (char*)cleanmap; for (i = 0; i < CLEANFILESIZE; i += PAGESIZE) { dummy = clean[i]; totalPages++; } printf("Cleaned the cache by reading %d pages\n", totalPages); munmap(cleanmap, CLEANFILESIZE); close(cleanfd); // done cleaning the cache mrufd = open("mru", O_RDONLY); lrufd = open("lru", O_RDONLY); mrumap = mmap(0, MRUFILESIZE, PROT_READ, MAP_PRIVATE, mrufd, 0); if (mrumap == MAP_FAILED) { printf("mru mmap failed."); return 0; } printf("mru file mmaped\n"); lrumap = mmap(0, LRUFILESIZE, PROT_READ, MAP_PRIVATE, lrufd, 0); if (lrumap == MAP_FAILED) { printf("lru mmap failed."); return 0; } printf("lru file mmaped\n"); // goes through each file // mru sequentially // lru randomly mru = (char*) mrumap; lru = (char*) lrumap; x = syscall(247, (void*) &info); fprintf( stdout, "Before loving inner file:\n"); fprintf( stdout, "%lu free pages, ", info.free ); fprintf( stdout, "%lu inactive pages, ", info.inactive ); fprintf( stdout, "%lu active pages\n", info.active ); totalPages = 0; for (i = 0; i < LRUFILESIZE; i += PAGESIZE) { dummy = lru[i]; totalPages++; } // love the pages of the inner file printf("lru: %d pages read\n", totalPages); printf("lru: %d pages loved\n", syscall(244, lru, LRUFILESIZE, 250)); x = syscall(247, (void*) &info); fprintf( stdout, "After loving inner file:\n"); fprintf( stdout, "%lu free pages, ", info.free ); fprintf( stdout, "%lu inactive pages, ", info.inactive ); fprintf( stdout, "%lu active pages\n", info.active ); start_t = time(NULL); pppm_index = pnpm_index = 0; for (n = 1; n <= MRUTOUCH; n++) { printf("Going through mru: pass %d\n", n); for (i = 0; i < MRUFILESIZE; i += PAGESIZE) { dummy = mru[i + (rand() % PAGESIZE)]; // hate the pages if (!(i % (PAGESIZE*HATEPAGESTEP)) && i != 0) { x = syscall(245, &mru[i - PAGESIZE*HATEPAGESTEP], PAGESIZE*HATEPAGESTEP); } pageTouched = (rand() % (LRUFILESIZE/PAGESIZE))*PAGESIZE; dummy = lru[pageTouched + (rand() % PAGESIZE)]; // love the page // x = syscall(244, &lru[pageTouched], PAGESIZE, 249); } if (n == 1) middle_t = time(NULL); x = syscall(247, (void*) &info); fprintf( stdout, "After pass #%d:\n", n); fprintf( stdout, "%lu free pages, ", info.free ); fprintf( stdout, "%lu inactive pages, ", info.inactive ); fprintf( stdout, "%lu active pages\n", info.active ); } stop_t = time(NULL); total_t = stop_t - start_t; pass1_t = middle_t - start_t; pass2_t = stop_t - middle_t; printf("Excution time: %d (pass #1 %d, pass #2 %d)\n\n", total_t, pass1_t, pass2_t); munmap(lrumap, LRUFILESIZE); munmap(mrumap, MRUFILESIZE); close(mrufd); close(lrufd); return 1; }