⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2.6.c

📁 :在可变分区管理方式下采用首次适应算法实现主存分配和回收。 [提示]: (1) 可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时
💻 C
字号:
/*
*
*Title:Problem2 主存空间的分配和回收
*Author:Fanbo
*Date  :2005.4.1
*Student ID:200231500348
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

struct block{
	char name[10];  //进程名
	int start;  //起址
	int len;    //长度
	int state;  //状态:0为未分配,1为已分配
	struct block *next;
};

struct block *create(){

	struct block *head,*temp,*present;
	temp = (struct block *)malloc(sizeof(struct block));
	strcpy(temp->name,"pro1");
	temp->start = 5;
	temp->len = 5;
	temp->state = 1;
	head = present = temp;
	temp = (struct block *)malloc(sizeof(struct block));
	strcpy(temp->name,"pro3");
	temp->start = 10;
	temp->len = 4;
	temp->state = 1;
	present->next = temp;
	present = temp;
	temp = (struct block *)malloc(sizeof(struct block));
	strcpy(temp->name,"----");
	temp->start = 14;
	temp->len = 12;
	temp->state = 0;
	present->next = temp;
	present = temp;
	temp = (struct block *)malloc(sizeof(struct block));
	strcpy(temp->name,"pro2");
	temp->start = 26;
	temp->len = 6;
	temp->state = 1;
	present->next = temp;
	present = temp;
	temp = (struct block *)malloc(sizeof(struct block));
	strcpy(temp->name,"----");
	temp->start = 32;
	temp->len = 96;
	temp->state = 0;
	temp->next = NULL;
	present->next = temp;
	return head;
}

void main( void ){
	int choice;      //用户选择	
	int cap;         //要求分配或者收回的空间大小
	char proName[10];//进程名
	struct block *head,*present,*temp;
	head = create();
	present = head;
	
	
	while(1){
		printf("\n=========分配和收回请求===========\n");
		printf("\t1.分配一段空间给进程;\n");
		printf("\t2.收回某段进程所占用的空间;\n");
		printf("\t3.显示当前空间利用情况;\n");
		printf("\t0.退出。\n");
		printf("==================================\n");
		printf("Your choice is:");
		scanf("%d",&choice);
		if(choice==0)
			break;
		while(choice!=0){
			switch(choice){
			case 1:
				printf("\n输入要申请的进程名:");
				scanf("%s",proName);
				
				temp = head;
				while(temp!=NULL){					
					if(strcmp(temp->name,proName)!=0)
						temp = temp->next;
					else break;															
				}
				if(temp!=NULL){
					printf("\n已经有一个名称为%s的进程!请重新输入一个进程名!\n",proName);
					choice = 0;
					break;
				}
				
				printf("\n该进程要申请的空间大小:");
				scanf("%d",&cap);
				printf("\n");		
				
				while(present!=NULL){
					if((present->len>cap)&&(present->state==0)){
						
						temp = (struct block *)malloc(sizeof(struct block));						
						temp->len = present->len - cap;
						strcpy(temp->name,"----");
						temp->state = 0;
						temp->start = present->start + cap;
						present->len = cap;
						strcpy(present->name,proName);
						present->state = 1;
						temp->next = present->next;
						present->next = temp;
						break;
					}
					else
						present = present->next;
				}
				if(present==NULL)
					printf("\n没有足够的空间满足你的要求! :( 请申请一个较小的空间. *_*\n");
				choice = 0;
				break;
			case 2:
				printf("\n请输入要收回的进程:");
				scanf("%s",proName);				
				temp = head;
				
				//判断头结点是否满足条件
				if(strcmp(temp->name,proName)==0){
					if(temp->next->state==0){
						strcpy(temp->name,"----");
						temp->state = 0;
						temp->len += temp->next->len;
						temp->next = temp->next->next;
					}
					else{
						strcpy(temp->name,"----");
						temp->state = 0;
					}
					choice = 0;
					break;
				}
				//temp = temp->next;
				present = temp->next;				
				while(present!=NULL){
					if(strcmp(present->name,proName)==0){   //找到满足条件的present结点
						if(temp->state==0){                  //前面一个为空结点
							
							temp->len += present->len;
							temp->next = present->next;
							if(present->next->state==0){       //后面一个结点也为空
								temp->len += present->next->len;
								temp->next = present->next->next;
								present = present->next->next;
							}
						}//if
						else{							
							if(present->next->state==0){         //后面一个为空结点
								
								present->len += present->next->len;
								present->next = present->next->next;
							}//if                    
							present->state = 0;			
							strcpy(present->name,"----");
						}//else
						
						choice = 0;
						break;
					}//if
					else{						
						temp = temp->next;
						present = temp->next;
					}//else
				}//while
				if(temp->next==NULL)					
					printf("\n :( 对不起!找不到这个进程!\n");				
					
				choice=0;
				break;
			case 3:
				printf("\n目前的内存分配情况是: *_* \n");
				printf("**************************************************\n");
				printf("*\t进程名\t起址\t终址\t大小\t状态\t*\n");
				temp = head;
				while(temp!=NULL){
					printf("*\t%s\t%d\t%d\t%d\t%s\t*\n",temp->name,temp->start,temp->start+temp->len,temp->len,(temp->state==0)?"free":"busy");
					temp = temp->next;
				}
				printf("**************************************************\n");
				choice = 0;
				break;				
			default:

				printf("输入错误! :( 必须输入0-3之间的数!请重试!\n");
				choice = 0;
				break;
			}	
		}
		

	}//while(1)
	

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -