操作系统简单分页存储管理(含代码)

实验目的:

   在分页存储管理方式中,如果不具备页面置换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具备支持虚拟存储器的功能,显示一次性的特征。本实验通过程序模拟操作系统的基本分页存储管理方式,进一步理解这一内存分配方式的原理和特点,加深对理论知识的掌握。

实验要求:

(1) 给出初态;

(2) 程序入口参数: 分配时,参数为进程名及请求分配的内存空间大小----字节数或页数。 回收时,参数为进程名。

(3) 每次分配或回收后,显示分区说明表、段表、页表、存储分块表等的内容,无法分配时,给出回应信息。

代码实现:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define PAGE 100   //内存总量100块

int memory[PAGE];
int process[PAGE][PAGE+1]; //进程数组
int use_num; //已经使用内存
int process_num; //进程数目


void check()
{
	printf("内存总量: %d块,已用空间: %d块,剩余空间: %d块,进程总数: %d个\n", PAGE, use_num, PAGE - use_num, process_num);
	if (use_num < PAGE) {
		printf("已使用的内存块(%d):\n", use_num);
		int tmp = 1;  //用于换行
		for (int i = 0; i < PAGE; i++) {
			if (memory[i] == 1) {
				if (tmp == 15) {
					printf("%d\n", i);
					tmp = 1;
				}
				printf("%d ", i);
				tmp++;
			}
		}
	}
	if (process_num > 0) {
		printf("\n各进程详细使用情况如下: \n");
		for (int i = 0; i < PAGE; i++) {
			if (process[i][0] > 0) {
				printf("进程号:%d \n占用内存块 (%d块):", i, process[i][0]);
				int tmp = 1;
				for (int j = 1; j <= process[i][0]; j++)
				{
					if (tmp == 15) {
						printf("%d\n", process[i][j]);
						tmp = 1;
					}
					printf("%d ", process[i][j]);
					tmp++;
				}
			}
		}
	}
	else {
		printf("\n当前内存无进程块!\n");
	}
}
void init_memory() //随机占用18块内存块
{
	memset(memory, 0, sizeof(memory)); //将所有内存块置为0,表示未使用
	const int count = 18;
	srand((unsigned)time(NULL)); //初始化随机数
	for (int i = 0; i < count; i++) {
		memory[rand() % PAGE] = 1; //产生0~99的随机数
	}
	use_num = count;  //初始化已经使用的内存 
	for (int i = 0; i < PAGE; i++) {   //初始化进程数组
		process[i][0] = 0;
		for (int j = 1; j < PAGE; j++)
			process[i][j] = -1;
	}
	process_num = 0;  //初始化进程数
	printf("初始化结果如下:\n");
	check();
}


void build_process() //创建进程
{
	int num, size;
	printf("请输入进程号(小于%d)和所需页面: ",PAGE);
	scanf("%d%d", &num, &size);
	if (num >= PAGE) {
		printf("输出错误,进程号越界!\n");
		return;
	}
	if (PAGE - use_num < size) {    
		printf("内存空间不足\n");
		return;
	}
	use_num += size;
	process[num][0] = size;
	int k = 0;
	for (int i = 1;i <= size; i++) {   //检查是否存在相同进程号的进程
		while (memory[k] == 1 && k < PAGE) {
			k++;
		}
		process[num][i] = k;
		memory[k++] = 1;
	}
	process_num++;
	printf("创建新进程成功!\n");
}

void end_process()  //结束进程
{
	int num, size;
	if (process_num < 1) {
		printf("当前内存没有进程!\n");
		return;
	}
	printf("请输入进程号(小于%d): ", PAGE);
	scanf("%d", &num);
	if (process[num][0] == 0) {
		printf("该进程不存在!\n");
		return;
	}
	size = process[num][0];
	for (int j = 1; j < size; j++)
	{
		memory[process[num][j]] = 0;
		process[num][j] = -1;
	}
	process[num][0] = 0;
	process_num--;
	use_num -= size;
	printf("结束进程成功!\n");
}

void menu() //菜单
{
	printf("\n操作菜单:\n");
	printf("1、创建进程\n");
	printf("2、结束进程\n");
	printf("3、查看内存\n");
	printf("4、退出程序\n");	
	printf("请输入您要进行的操作: ");
}

int main(int argc, char *argv[])
{
 	system("color 3f");
    init_memory(); /*初始化内存空间*/
	int choice;
	menu();
	while (scanf("%d", &choice) != 0) {
		switch (choice)
		{
		case 1:
			build_process();
			break;
		case 2:
			end_process();
			break;
		case 3:
			check();
			break;
		case 4:
			printf("程序已经退出!\n");
			exit(0);
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
		menu();
	}
	system("pause");
	return 0;
}

结果:

  • 19
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值