操作系统-(基本分页存储管理-java实现)

实验目的:熟悉并掌握基本分页存储管理的思想。
熟悉并掌握基本分页存储管理的分配和回收方式,并能够模拟实现。
实验内容:用高级语言模拟实现基本分页存储管理,要求:
1、 内存空间的初始化——可以由用户输入初始内存空间各个物理块情况。(用二维矩阵的方式按物理块号,逐行给出每个物理块的状态,1——表示已分配,0——表示未分配,并能够将行标、列标转换为对应的物理块号,以查看或修改每一个块的状态,要求:初始时部分物理块已分配)
2、 基本分页的分配过程:由用户输入作业号和作业的大小(这里的大小是逻辑页面数),实现分配过程:空间充足,分配,修改状态矩阵的相应位置的值(值由0转变为1),并用专门的数据记录下该作业占用的物理块的块号,以备删除作业时回收空间。
3、 作业空间的回收:用户输入作业号,实现分区回收(通过相应的数据结构找到该作业占有的物理块号,将块号转变成对应的行标、 列标,将对应位置的值由1转变成0就完成了回收)
4、 分区的显示:任何时刻,可以查看当前内存的情况(显示记录内存情况的矩阵的值)
5、 要求考虑:(1)内存空间不足的情况,要有相应的显示;
(2)作业不能同名,但是删除后可以再用这个名字;
(3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。

源码

package Blue;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Scanner;


public class 基本分页存储管理 {
	public static int len,alllen;//len代表矩阵的行数和列数;alllen代表矩阵的总大小
	public static int reminder;//reminder表示剩下的物理块是多少
	public static int num[][];
	public static String copynum[][];
	public static HashSet<String> hashSet;
	public static ArrayList<page> listpage;
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("请输入内存中的物理块的大小 (代表矩阵的行数和列数):");
		len = input.nextInt();
		alllen = len*len;
		num = new int[len][len];
		copynum = new String[len][len];
		
		hashSet = new HashSet<>();
		listpage = new ArrayList<>();
		//物理块的初始化
		for (int i = 0; i < len; i++) {
			for (int j = 0; j < len; j++) {
				num[i][j] = (int)(Math.random()*2);
				copynum[i][j] = num[i][j]+"";
				if (num[i][j] == 0) {
					reminder++;
				}
			}
		}
		for (int i = 0; i < len; i++) {
			for (int j = 0; j < len; j++) {
				System.out.print(num[i][j]+" ");
			}
			System.out.println();
		}
		while(true) {
			System.out.println("请输入下一步的操作 1-分配,2-回收");
			int p = input.nextInt();
			switch (p) {
			case 1://分配
				System.out.println("请输入作业名及作业号及作业大小");
				String name = input.next();
				int size = input.nextInt();
				allocative(name,size);
				show();
				break;
			case 2://回收
				System.out.println("请输入要回收的作业号");
				String name1 = input.next();
				setFree(name1);
				show();
				break;
			default:
				break;
			}
		}
	}
	private static void show() {
		for (int i = 0; i < num.length; i++) {
			for (int j = 0; j < num.length; j++) {
				System.out.print(num[i][j]+" ");
			}
			System.out.print("              ");
			for (int j = 0; j < num.length; j++) {
				System.out.print(copynum[i][j]+" ");
			}
			System.out.println();
		}
	}
	private static void setFree(String name) {
		if (hashSet.contains(name) == false) {
			//说明当前这个作业名不存在
			System.out.println("当前作业不存在,释放失败");
			return;
		}
		for(page tem : listpage) {
			if (tem.name.equals(name)) {
				reminder+=tem.list.size();
				for(Integer ans : tem.list) {
					num[(ans-1)/len][(ans-1)%len] = 0;
					copynum[(ans-1)/len][(ans-1)%len] = 0+"";
				}
				listpage.remove(tem);
				
			}
			hashSet.remove(name);
			System.out.println("释放成功");
			return;
		}
		
	}
	private static void allocative(String name, int size) {
		if (reminder < size) {
			System.out.println("剩余空间不足,分配失败");
			return;
		}
		if (hashSet.contains(name)) {
			System.out.println("已经存在,分配失败");
			return;
		}
		LinkedList<Integer> list = new LinkedList<>();
		for (int i = 0; i < num.length; i++) {
			for (int j = 0; j < num.length; j++) {
				if (num[i][j] == 0) {
					num[i][j] = 1;
					copynum[i][j] = name;
					list.add(i*len+j+1);//将这一个物理空间加入进去
					reminder--;
					size--;
					if (size == 0) {
						System.out.println("分配成功");
						hashSet.add(name);
						listpage.add(new page(name, list));
						return;
					}
				}
			}
		}
	}
}
/*
 * name代表作业的名称
 * list代表是每一个作业所占的物理块的位置
 */
class page {
	String name;
	LinkedList<Integer> list;
	public page(String name,LinkedList<Integer> list) {
		super();
		this.name = name;
		this.list = list;
	}
}
  • 0
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 分页存储管理操作系统中一种常见的内存管理方式,它将进程的逻辑地址空间划分为固定大小的页,将物理内存划分为与之相等的物理页框,通过页表实现逻辑页与物理页之间的映射关系。在实验中,我们可以使用Java编程语言模拟分页存储管理的过程。 首先,我们需要定义一个页表类,用于记录逻辑页号和物理页号之间的映射关系。该类可以包含一个哈希表或数组,以逻辑页号作为键,物理页号作为值。 接下来,需要编写一个模拟程序,模拟进程的内存访问过程。该程序可以随机生成一个逻辑地址,然后通过页表查找该逻辑地址对应的物理页号。如果页表中存在该逻辑页号的映射关系,程序就可以通过物理页号找到相应的物理内存地址;否则,程序需要进行页面置换算法来选择一个物理页进行替换,并更新页表中的映射关系。 在实验中,可以选择常见的页面置换算法,如最近最久未使用(LRU)、先进先出(FIFO)、钟算法(CLOCK)等,来模拟操作系统的页面置换过程。根据选择的算法,我们可以编写相应的替换函数来实现物理页的选择和替换。 总之,通过实现一个页表类和模拟程序,我们可以模拟分页存储管理的过程,并通过选择适当的页面置换算法实现页的替换操作。该实验可以帮助我们更好地理解操作系统中的内存管理机制,并加深对分页存储管理的理解。 ### 回答2: 操作系统分页存储管理是计算机操作系统中的一个重要概念,它涉及到内存中数据的存储和管理。在分页存储管理中,内存被划分为固定大小的页框,每个页面大小相同。而程序的数据则被划分为多个大小相等的页面,每个页面被映射到内存中的一个页框。通过这种方式,程序的逻辑地址可以被划分为页号和偏移量,而不需要关心实际的物理地址。 在这个实验中,我们可以用Java编写一个简化的分页存储管理系统模拟。我们可以通过以下几个步骤来完成这个实验: 1. 定义页面和页框的大小。例如,我们可以将页面和页框大小都定义为4KB,即4096字节。 2. 定义程序的逻辑地址空间和物理地址空间。逻辑地址空间可以分为页号和偏移量,而物理地址空间则直接对应着内存中的页框。 3. 实现页面的映射和置换算法。页面的映射可以通过一个页表来实现,存储页面到页框的映射关系。如果内存中的页框已经被占用,需要使用置换算法将某些页面置换出去,腾出页框给新的页面。 4. 实现页面访问和管理功能。通过逻辑地址,我们可以找到对应的页号和偏移量,然后根据页表的映射关系找到物理地址。页面的访问可以是读取或写入操作。 通过这个实验,我们可以深入理解分页存储管理的原理并且学习如何使用Java模拟实现这个功能。这有助于我们更好地理解操作系统中内存的管理和存储机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WeChat098

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值