《操作系统内存可变分区管理实验报告》由会员分享,可在线阅读,更多相关《操作系统内存可变分区管理实验报告(12页珍藏版)》请在金锄头文库上搜索。
1、1? ?C?char *malloc(unsigned size)? size=1000? addr = (char *)fmalloc(unsigned size) ? ffree(unsigned size,char * addr)? ? addr = (char *)lmalloc(unsigned size) ? lfree(unsigned size,char * addr) ?UNIX? 2? ?1? ? ? ? ? ?2?,? ? ? ? ?3?AUTO?MANUAL? ? 3? #defi ne AUTO ? /#defi ne MANUAL /? #defi ne N 5 /
2、? #defi ne INPUT_FILE_PATH “/Users/LXC/Desktop/InPutFile.txt“ /? #defi ne OUTPUT_FILE_PATH “/Users/LXC/Desktop/OutPutFile.txt“ /? /* ? */ struct map unsigned m_size; char *m_addr; ; struct map coremapN; static struct map *loopBp = coremap? ? 4? / / main.c / MemoryManage / / Created by ? on 16/3/13.
3、/ Copyright 2016? ?. All rights reserved. / /* ?/?I/O? ? ? */ #include #include #defi ne AUTO /? /#defi ne MANUAL /? #defi ne N 5 #defi ne INPUT_FILE_PATH “/Users/LXC/Desktop/InPutFile.txt“ /? #defi ne OUTPUT_FILE_PATH “/Users/LXC/Desktop/OutPutFile.txt“ /* ? */ struct map unsigned m_size; char *m_a
4、ddr; ; struct map coremapN; static struct map *loopBp = coremap; /* ? */ char *lmalloc(unsigned size) /* ?mp?*/ register char *a; register struct map *bp; for (bp = loopBp; bp-m_size; bp+) if(bp-m_size = size) a = bp-m_addr; bp-m_addr += size; if(bp-m_size -= size) = 0) do bp+; (bp-1)-m_addr = bp-m_
5、addr; while(bp-1)-m_size = bp-m_size); loopBp = bp; if(loopBp+1)-m_size != 0) +loopBp; else loopBp = coremap; return(a); return(0); /* ? */ void lfree(unsigned size, char *aa) struct map *bp; char *a, *t; unsigned tt; a = aa; for (bp=coremap; bp-m_addrm_size!=0; bp+); if (bpcoremap loopBp-m_addr = (
6、bp-1)-m_addr; (bp-1)-m_size += size; /* ?1 */ if (a+size = bp-m_addr) /* ?2 */ (bp-1)-m_size += bp-m_size; while (bp-m_size) bp+; (bp-1)-m_addr = bp-m_addr; (bp-1)-m_size = bp-m_size; else if (a+size = bp-m_addr bp-m_size += size; loopBp = bp; loopBp-m_addr = bp-m_addr; else /* ?4 */ if (size) loopB
7、p = bp; loopBp-m_addr = a; do t = bp-m_addr; bp-m_addr = a; a = t; tt = bp-m_size; bp-m_size = size; bp+; while (size = tt); /* coremap? */ void initcoremap(char *addr, unsigned size) /* ?coremap? ?m_addr?malloc?addr? ?m_size?malloc?size? ?0 */ coremap0.m_addr = addr; coremap0.m_size = size; int i;
8、for(i = 1; i N; +i) coremapi.m_addr = NULL; coremapi.m_size = 0; /* ? */ void printcoremap(FILE *output) /* Function body: ?coremap?m_size?m_addr */ int i; for (i = 0; iN; +i) printf(“?:%4d ?:%pn“,coremapi.m_size, coremapi.m_addr); #ifdef AUTO fprintf(output,“?:%4d ?:%pn“,coremapi.m_size, coremapi.m
9、_addr); #endif FILE* openInputFile() FILE *fp = fopen(INPUT_FILE_PATH, “r“); if (fp = NULL) printf(“?“); exit(-1); return fp; FILE *openOutputFile() FILE *fp = fopen(OUTPUT_FILE_PATH, “w“); if (fp = NULL) printf(“?“); exit(-1); return fp; /* ? */ int main(int argc, const char * argv) /* ? */ /* ?mal
10、loc?1000 */ /* ?coremap? */ /* ? m size ? f size addr : ? p : ?coremap? q : ? default: continue */ /* ?free?malloc? */ #ifdef MANUAL void *memory = malloc(1000); initcoremap(memory, 1000); char command; int size; int addr; do printf(“?:“); char c; scanf(“%c“, while (c=getchar()!=n switch (command) c
11、ase m: printf(“?:“); scanf(“%d“, while (c=getchar()!=n lmalloc(size); break; case f: printf(“?:“); scanf(“%d“, while (c=getchar()!=n printf(“?:“); scanf(“%d“, while (c=getchar()!=n lfree(size, memory+addr); break; case p: printcoremap(); break; case q: exit(0); break; default: break; while (command=
12、m|command=f|command=p|command=q)|printf(“? ?n“); #endif #ifdef AUTO FILE *input = openInputFile(); FILE *output = openOutputFile(); void *memory = malloc(1000); initcoremap(memory, 1000); char command; int size; int addr; fscanf(input, “%c,%d,%dn“, do printf(“?:%cn“,command); fprintf(output, “?:%cn“,command); switch (command) case m: printf(“?:%dn“,size); fprintf(output, “?:%dn“,size); lmalloc(size); break; case f: printf(“?:%dn“,size); fprintf(output, “?:%dn“,size); printf(“?:%dn“,addr); fprintf(output, “?:%dn“,addr); lfree(size, me