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

实验指南

运行环境:

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;
}

运行结果

实验总结

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

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

相关推荐
古希腊掌管学习的神17 分钟前
[搜广推]王树森推荐系统笔记——曝光过滤 & Bloom Filter
算法·推荐算法
qystca18 分钟前
洛谷 P1706 全排列问题 C语言
算法
浊酒南街24 分钟前
决策树(理论知识1)
算法·决策树·机器学习
就爱学编程32 分钟前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
学术头条36 分钟前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
Schwertlilien1 小时前
图像处理-Ch4-频率域处理
算法
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·深度学习·算法·机器学习·matlab·多目标算法
__lost1 小时前
MATLAB直接推导函数的导函数和积分形式(具体方法和用例)
数学·算法·matlab·微积分·高等数学
thesky1234561 小时前
活着就好20241224
学习·算法
ALISHENGYA2 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战项目二)
数据结构·c++·算法