操作系统原理与实验——实验九分页式存储

05-01 1137阅读 0评论

实验指南

运行环境:

Dev c++

算法思想:

本实验模拟分页存储管理,对于需要分配资源的作业,预先申请空间,内存空间满足要求,进行内存分配并插入作业链表,打印该作业页表信息与系统内存信息。对于需要回收资源的作业,若能再作业链表中找到该作业,进行内存释放并从作业链表中删除,最后打印系统内存信息。

关键数据结构定义:

int sc[MAX][MAX]= {0};//系统内存

int MemorySize;//系统内存大小

int WordLength;//字长

int WordNum;//页数

int BlockSize;//物理块

int BlockNum;//一个物理块的大小

int UsingBolckNum;

int AvailableBlockNum;

//作业节点

typedef struct link_node

{

    char name[10];//作业名

    int size[MAX][MAX];//作业页表

    struct link_node *next;

} node;

程序框架:

//函数名:OperationChoice       函数参数:无

int OperationChoice()

{

//函数功能:打印操作菜单,选择需要进行的操作

}

//函数名:print       函数参数:无

void print()

{

//函数功能:打印系统内存信息

}

//函数名:allocate    函数参数:head(作业链表的第一个节点)

node* allocate(node *head)

{

//函数功能:建立作业节点,判断是否可以分配,可以进行下一步,进行内存分配,插         入作业链表,打印该作业的页表信息,打印系统内存信息

}

//函数名:recycle        函数参数:head(作业链表的第一个节点)

node* recycle(node *head)

{

//函数功能:找到待回收的作业节点,释放内存,从作业链表中删除,打印系统内存信息

}

//函数名:initMemory       函数参数:无

void initMemory(){

//函数功能:定义内存大小,字长与物理块大小,初始化系统内存,打印系统内存信息

}

//函数名:Apply          函数参数:无

void Apply()

{

    initMemory();

    while(1)

    {

        int c;

        c=OperationChoice();

        switch(c)

        {

        case 1:

            head=allocate(head);

            break;

        case 2:

            head=recycle(head);

            break;

        case 0:

            return ;

        }

    }

}

int main()

{

    Apply();

    return 0;

}

测试用例:

/*

1000

64

1

1

job2

50

1

job1

30

2

job2

2

1

2

job1

0

*/

关键代码

#include
#include
#include
#include
#define MAX 100
int sc[MAX][MAX]= {0};//系统内存
int MemorySize;//系统内存大小
int WordLength;//字长
int WordNum;//页数
int BlockSize;//一个物理块的大小
int BlockNum;//物理块数 
int UsingBlockNum;//已用物理块数 
int AvailableBlockNum;//系统剩余物理块数 
//作业节点
typedef struct link_node
{
    char name[10];//作业名
    int size[MAX][MAX];//作业页表
    int jobsize;//作业大小 
    struct link_node *next;
} node;
int OperationChoice();
void print();
node* allocate(node *head);
node* recycle(node *head);
void initMemory();
void Apply();
//函数名:OperationChoice       函数参数:无
int OperationChoice()
{
//函数功能:打印操作菜单,选择需要进行的操作
	//printf("      剩余物理块数%d\n",AvailableBlockNum);
	printf("*********分页式管理*********\n");
	printf("   *     1.内存分配     *   \n");
	printf("   *     2.内存去配     *   \n");
	printf("   *     0.退出         *   \n");
	printf("         请输入选项[ ]\b\b");
	int c;
	scanf("%d",&c);
	return c;
}
//函数名:print       函数参数:无
void print()
{
//函数功能:打印系统内存信息
	int count = 0;
	printf("主存位示图如下所示:\n    ");
	for(int i = 0;i60&&i%60 == 1)
		printf("\n    ");
		printf(" %2d",i);
	}
	printf("\n");
	for(int i = 0;inext = NULL; 
	print();
	printf("    请输入作业的名字:");
	scanf("%s",&p->name);
	printf("    请输入作业需要分配的大小:");
	scanf("%d",&p->jobsize);
	if(p->jobsizenext!=NULL)
			{
				q = q->next; 
			}
			q->next = p;
			q = p;
		}
		printf("    分配成功!\n");
		
		int count = 0;
		for(int i = 0;isize[count][1] = i*WordLength + j;
				count++;
				if(count == p->jobsize)
				break;
			}
			}
			if(count == p->jobsize)
			break;
		}
		print();
		printf("**********打印%s作业的页表**********\n",p->name);
		for(int i = 0;ijobsize;i++)
		printf("       %2d      %2d\n",p->size[i][0],p->size[i][1]);
		
	}
	else
	{
		printf("分配失败!\n");
		print();
		free(p);
	}
	return head;
}
//函数名:recycle        函数参数:head(作业链表的第一个节点)
node* recycle(node *head)
{
//函数功能:找到待回收的作业节点,释放内存,从作业链表中删除,打印系统内存信息
	node *pre,*p;
	char Name[10];
	printf("请输入你当前要回收的作业名:");
	scanf("%s",&Name);
	p = head;
	while(p!=NULL)
	{
		if(strcmp(Name,p->name) == 0)
		break;
		pre = p;
		p = p->next; 
	}
	if(p == NULL)
	printf("无此作业!回收失败!\n");
	else
	{
		printf("该作业回收成功!\n");
		if(p == head)
		{
			head = p->next;
		}
		else
		{
			pre->next = p->next;
		}
		for(int i = 0;ijobsize;i++)
		{
			sc[p->size[i][1]/WordLength][p->size[i][1]%WordLength] = 0;
			UsingBlockNum--;
			AvailableBlockNum++;
		}
		free(p);
		print();
	}
	return head;
}
//函数名:initMemory       函数参数:无
void initMemory(){
//函数功能:定义内存大小,字长与物理块大小,初始化系统内存,打印系统内存信息
	printf("请输入系统内存空间的大小:");
	scanf("%d",&MemorySize);
	printf("请输入字长(16/32/64):");
	scanf("%d",&WordLength);
	printf("请输入物理块大小:");
	scanf("%d",&BlockSize);
	BlockNum = MemorySize/BlockSize;
	WordNum = BlockNum/WordLength;
	if(BlockNum%WordLength)
	WordNum++;
	UsingBlockNum = 0;
	AvailableBlockNum = 0;
	int count = 0;
	for(int i = 0;i

免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,1137人围观)

还没有评论,来说两句吧...

目录[+]