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

实验指南

运行环境:

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

*/

关键代码

cs 复制代码
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#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;i<WordLength;i++)
	{
		if(i>60&&i%60 == 1)
		printf("\n    ");
		printf(" %2d",i);
	}
	printf("\n");
	for(int i = 0;i<WordNum;i++)
	{
		for(int j = 0;j<WordLength;j++)
	{
		if(j == 0)
		{
			printf("%3d| %2d",i,sc[i][j]);
		}
		else
		{
			if(j>60&&j%60 == 1)
			{
				printf("\n    ");
			}
			printf(" %2d",sc[i][j]);
		}
		count++;
		if(count == BlockNum)
		break; 
	}
		printf("\n");
	}
	printf("\n");
	printf("    剩余物理块数%d\n",AvailableBlockNum);
}
//函数名:allocate    函数参数:head(作业链表的第一个节点)
node* allocate(node *head)
{
//函数功能:建立作业节点,判断是否可以分配,可以进行下一步,进行内存分配,插	入作业链表,打印该作业的页表信息,打印系统内存信息
	node *q;
	q=head;
	node *p = (node *)malloc(sizeof(node));
	p->next = NULL; 
	print();
	printf("    请输入作业的名字:");
	scanf("%s",&p->name);
	printf("    请输入作业需要分配的大小:");
	scanf("%d",&p->jobsize);
	if(p->jobsize<=AvailableBlockNum)
	{
		if(q == NULL)
		{
			q = p;
			head = q;
		}
		else
		{
			while(q->next!=NULL)
			{
				q = q->next; 
			}
			q->next = p;
			q = p;
		}
		printf("    分配成功!\n");
		
		int count = 0;
		for(int i = 0;i<WordNum;i++)
		{
			for(int j = 0;j<WordLength;j++)
			{
			if(sc[i][j] == 0)
			{
				//printf("置换%d %d\n",i,j);
				sc[i][j] = 1;
				UsingBlockNum++;
				AvailableBlockNum--;
				p->size[count][0] = count;
				p->size[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;i<p->jobsize;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;i<p->jobsize;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<WordNum;i++)
	{
		for(int j = 0;j<WordLength;j++)
		{
		sc[i][j] = rand()%2;
		if(sc[i][j] == 1)
		UsingBlockNum++;
		else
		AvailableBlockNum++;
		count++;
		if(count == BlockNum)
		break; 
		}
		if(count == BlockNum)
		break; 
	}
	print();
}
//函数名:Apply          函数参数:无
void Apply()
{	
	node *head = NULL;
    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;
}

运行结果

实验总结

①对链表的应用还不是很熟悉

②打印格式稍加修改了一下

相关推荐
shan_shmily40 分钟前
算法知识点————贪心
算法
寂柒1 小时前
C++——模拟实现stack和queue
开发语言·c++·算法·list
熬夜学编程的小王1 小时前
C++类与对象深度解析(一):从抽象到实践的全面入门指南
c++·git·算法
CV工程师小林1 小时前
【算法】DFS 系列之 穷举/暴搜/深搜/回溯/剪枝(下篇)
数据结构·c++·算法·leetcode·深度优先·剪枝
Dylanioucn1 小时前
【分布式微服务云原生】掌握 Redis Cluster架构解析、动态扩展原理以及哈希槽分片算法
算法·云原生·架构
繁依Fanyi1 小时前
旅游心动盲盒:开启个性化旅行新体验
java·服务器·python·算法·eclipse·tomcat·旅游
罔闻_spider1 小时前
爬虫prc技术----小红书爬取解决xs
爬虫·python·算法·机器学习·自然语言处理·中文分词
Themberfue2 小时前
基础算法之双指针--Java实现(下)--LeetCode题解:有效三角形的个数-查找总价格为目标值的两个商品-三数之和-四数之和
java·开发语言·学习·算法·leetcode·双指针
陈序缘3 小时前
LeetCode讲解篇之322. 零钱兑换
算法·leetcode·职场和发展
-$_$-3 小时前
【LeetCode HOT 100】详细题解之二叉树篇
数据结构·算法·leetcode