From 36db457bf76321f140d0a604e8cba97bf10dc33a Mon Sep 17 00:00:00 2001 From: Wenchao Hao Date: Tue, 19 Nov 2024 19:47:41 +0800 Subject: [PATCH] update Signed-off-by: Wenchao Hao --- bak.c | 32 +++++++------- madvise.c | 123 ++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 117 insertions(+), 38 deletions(-) diff --git a/bak.c b/bak.c index 54a3bec..798b936 100644 --- a/bak.c +++ b/bak.c @@ -27,27 +27,25 @@ void main() exit(-1); } - for (i = 0; i < 100000; i++) { - madvise(p, SIZE, MADV_HUGEPAGE); - memset(p, 0x11, SIZE); /* write to get mem */ + madvise(p, SIZE, MADV_HUGEPAGE); + memset(p, 0x11, SIZE); /* write to get mem */ + gettimeofday(&tv_b, NULL); + madvise(p, SIZE, MADV_PAGEOUT); + gettimeofday(&tv_e, NULL); + + printf("swp out bandwidth: %ld bytes/ms\n", + SIZE/(tv_to_ms(tv_e) - tv_to_ms(tv_b))); + + pid = fork(); + + if (pid) { + //scanf("%c", &c); gettimeofday(&tv_b, NULL); - madvise(p, SIZE, MADV_PAGEOUT); + memset(p, 0x33, SIZE); /* write to get mem */ gettimeofday(&tv_e, NULL); - - printf("swp out bandwidth: %ld bytes/ms\n", + printf("swp in bandwidth: %ld bytes/ms\n", SIZE/(tv_to_ms(tv_e) - tv_to_ms(tv_b))); - - //pid = fork(); - - //if (pid) { - //scanf("%c", &c); - gettimeofday(&tv_b, NULL); - memset(p, 0x33, SIZE); /* write to get mem */ - gettimeofday(&tv_e, NULL); - printf("swp in bandwidth: %ld bytes/ms\n", - SIZE/(tv_to_ms(tv_e) - tv_to_ms(tv_b))); - //} } while(1) { diff --git a/madvise.c b/madvise.c index 136906d..0f52fa0 100644 --- a/madvise.c +++ b/madvise.c @@ -7,51 +7,132 @@ #include #include #include +#include + +#define SIZE 19*1024*1024 +#define PAGE_SIZE 4096 // 4KB +#define CHUNK_SIZE 8 * 1024 // 8KB + +void compute_md5(const unsigned char *data, size_t length, unsigned char *md5_hash) { + MD5_CTX md5_ctx; + + MD5_Init(&md5_ctx); + + MD5_Update(&md5_ctx, data, length); + + MD5_Final(md5_hash, &md5_ctx); +} + +void print_md5(unsigned char *md5_hash) { + for (int i = 0; i < MD5_DIGEST_LENGTH; i++) { + printf("%02x", md5_hash[i]); + } + printf("\n"); +} unsigned long long tv_to_ms(struct timeval tv) { return tv.tv_sec * 1000 + tv.tv_usec / 1000; } -void main() +int main() { char c; pid_t pid; int i; int j = 0; struct timeval tv_b, tv_e;; -#define SIZE 100*1024*1024 + unsigned char md5_hash[MD5_DIGEST_LENGTH]; + unsigned long *p = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (!p) { perror("fail to get memory"); exit(-1); } + printf("0x%lx\n", p); + madvise(p, SIZE, MADV_HUGEPAGE); - for (j = 0; j < SIZE / 8; j+=128) + for (j = 0; j < SIZE / 8; j += 8) *(p + j) = j; - for (i = 0; i < 3; i++) { - gettimeofday(&tv_b, NULL); - madvise(p, SIZE, MADV_PAGEOUT); - gettimeofday(&tv_e, NULL); + for (size_t offset = PAGE_SIZE; offset < SIZE; offset += CHUNK_SIZE) { + char *str = (char *)p + offset; - printf("swp out bandwidth: %ld bytes/ms\n", - SIZE/(tv_to_ms(tv_e) - tv_to_ms(tv_b))); - - gettimeofday(&tv_b, NULL); - for (j = 0; j < SIZE / 8; j+=128) - *(p + j) = j; - gettimeofday(&tv_e, NULL); - printf("swp in bandwidth: %ld bytes/ms\n", - SIZE/(tv_to_ms(tv_e) - tv_to_ms(tv_b))); + sprintf(str, "child"); } - //madvise(p, SIZE, MADV_PAGEOUT); + for (size_t offset = PAGE_SIZE; offset < SIZE; offset += CHUNK_SIZE) { + compute_md5((unsigned char *)p + offset, PAGE_SIZE, md5_hash); + printf("MD5 of the buffer: "); + print_md5(md5_hash); + } - //while(1) { - // sleep(100); - //} + gettimeofday(&tv_b, NULL); + madvise(p, SIZE, MADV_PAGEOUT); + gettimeofday(&tv_e, NULL); + + printf("swp out bandwidth: %ld bytes/ms\n", + SIZE/(tv_to_ms(tv_e) - tv_to_ms(tv_b))); + + pid = fork(); + + if (pid == 0) { + printf("child: freeing some swap\n"); + for (size_t offset = 0; offset < SIZE; offset += CHUNK_SIZE) { + if (madvise((void *)((char *)p + offset), PAGE_SIZE, MADV_DONTNEED) == -1) { + perror("madvise failed"); + return -1; + } + } + + printf("child: sleep\n"); + sleep(5); + + printf("child: reading swaped data\n"); + + for (size_t offset = PAGE_SIZE; offset < SIZE; offset += CHUNK_SIZE) { + char *str = (char *)p + offset; + + if (strcmp(str, "child")) + printf("%s\n", str); + + } + printf("child: read done\n"); + + for (size_t offset = PAGE_SIZE; offset < SIZE; offset += CHUNK_SIZE) { + compute_md5((unsigned char *)p + offset, PAGE_SIZE, md5_hash); + printf("MD5 of the buffer: "); + print_md5(md5_hash); + } +#if 2 + } else { + printf("parent: sleeping\n"); + sleep(1); + printf("parent: unmapping origin memory region\n"); + munmap(p, SIZE); + printf("parent: alloc new memory region\n"); + + p = mmap(NULL, 9 * 1024 * 1024, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + + for (j = 0; j < 1024 * 1024; j+=8) + *(p + j) = j + 10; + + for (size_t offset = 0; offset < 8 * 1024 * 1024; offset += CHUNK_SIZE) { + char *str = (char *)p + offset + PAGE_SIZE; + sprintf(str, "parent"); + } + + madvise(p, 9 * 1024 * 1024, MADV_PAGEOUT); +#endif + } + + while(1) { + sleep(100); + } + + return 0; }