山东科技大学学生课程设计
printf(\}
二、内存管理源程序
//内存空闲分区的描述 #include
#define PROCESS_NAME_LEN 32 #define MIN_SLICE 10
#define DEFAULT_MEM_SIZE 1024 #define DEFAULT_MEM_START 0 #define MA_FF 1 #define MA_BF 2 #define MA_WF 3
int mem_size=DEFAULT_MEM_SIZE; int ma_algorithm = MA_FF;
static int pid = 0; int flag = 0; struct free_block_type{ int size;
int start_addr;
struct free_block_type *next; };
struct free_block_type *free_block;
//描述已分配的内存块
struct allocated_block{ int pid; int size; int start_addr;
char process_name[PROCESS_NAME_LEN]; struct allocated_block *next; };
struct allocated_block *allocated_block_head = NULL;
//函数声明
struct free_block_type* init_free_block(int mem_size); void display_menu(); int set_mem_size(); void set_algorithm();
void rearrange(int algorithm); int rearrange_FF(); int rearrange_BF();
山东科技大学学生课程设计
int rearrange_WF(); int new_process();
int allocate_mem(struct allocated_block *ab); void kill_process();
int free_mem(struct allocated_block *ab); int dispose(struct allocated_block *free_ab); int display_mem_usage(); void do_exit();
struct allocated_block *find_process(int pid);
int main(){
char choice; pid=0;
free_block = init_free_block(mem_size); //初始化空闲区 while(1) {
display_menu(); //显示菜单 fflush(stdin);
choice=getchar(); //获取用户输入 switch(choice){
case '1': set_mem_size(); break; //设置内存大小 case '2': set_algorithm();flag=1; break;//设置算法 case '3': new_process(); flag=1; break;//创建新进程 case '4': kill_process(); flag=1; break;//删除进程
case '5': display_mem_usage(); flag=1; break; //显示内存使用 case '0': do_exit(); exit(0); //释放链表并退出 default: break; } }
return 1; }
struct free_block_type* init_free_block(int mem_size){ struct free_block_type *fb;
fb=(struct free_block_type *)malloc(sizeof(struct free_block_type)); if(fb==NULL){
printf(\ return NULL; }
fb->size = mem_size;
fb->start_addr = DEFAULT_MEM_START; fb->next = NULL; return fb; }
void display_menu(){ printf(\
printf(\
山东科技大学学生课程设计
printf(\ printf(\
printf(\ printf(\ printf(\}
int set_mem_size(){ int size;
if(flag!=0){ //防止重复设置
printf(\ return 0; }
printf(\ scanf(\ if(size>0) {
mem_size = size;
free_block->size = mem_size; } flag=1; return 1; }
void set_algorithm(){ int algorithm; while(1) {
printf(\ printf(\ printf(\ scanf(\
if(algorithm>=1 && algorithm <=3) { ma_algorithm = algorithm; break; } else
printf(\输入有误,请重新输入!\\n\ }
//按指定算法重新排列空闲区链表 rearrange(ma_algorithm); }
void rearrange(int algorithm){ switch(algorithm){
case MA_FF: rearrange_FF(); break; case MA_BF: rearrange_BF(); break; case MA_WF: rearrange_WF(); break; }
山东科技大学学生课程设计
}
int rearrange_FF(){
struct free_block_type *temp;
//使用头插法,thead为临时头,p为最小地址的数据块的前一个结点 struct free_block_type *thead=NULL,*p=NULL; //当前的最小地址
int min_addr = free_block->start_addr; temp = free_block;
while(temp->next!=NULL) {
if(temp->next->start_addr
temp = temp->next; }
if(NULL!=p) { temp = p->next;
p->next = p->next->next; temp->next = free_block; free_block = temp; }
//printf(\
//printf(\
thead = free_block; p = free_block;
temp = free_block->next; while(thead->next!=NULL) {
min_addr = thead->next->start_addr; while(temp->next!=NULL) {
if(temp->next->start_addr
temp = temp->next; }
if(p->next!=thead->next) { temp = p->next;
p->next = p->next->next; temp->next = thead->next; thead->next = temp; }
thead = thead->next; p = thead;
temp = thead->next; }
山东科技大学学生课程设计
//请自行补充 return 1; }
int rearrange_BF(){
struct free_block_type *temp;
//使用头插法,thead为临时头,p为最小内存的数据块的前一个结点 struct free_block_type *thead=NULL,*p=NULL; //当前的最小内存
int min_size = free_block->size; temp = free_block;
while(temp->next!=NULL) {
if(temp->next->size
temp = temp->next; }
if(NULL!=p) { temp = p->next;
p->next = p->next->next; temp->next = free_block; free_block = temp; }
thead = free_block; p = free_block;
temp = free_block->next; while(thead->next!=NULL) { min_size = thead->next->size; while(temp->next!=NULL) {
if(temp->next->size
temp = temp->next; }
if(p->next!=thead->next) { temp = p->next;
p->next = p->next->next; temp->next = thead->next; thead->next = temp; }
thead = thead->next; p = thead;
temp = thead->next; }