页式地址重定位模拟(JAVA语言)

页式地址重定位模拟(JAVA语⾔)
实验内容及步骤:
1.⽤户输⼊内存⼤⼩(单位GB),系统把内存分块,每块⼤⼩由⽤户输⼊设置,单位为KB,按字节寻址(B),也就是⼀个地址对应⼀个字节的⼤⼩
2.⽤户输⼊进程⼤⼩(单位KB)
3.为进程设置⼀个页表(页号,块号(块号的分配由系统随机产⽣)(先检查块号是否已经分配出去))
4.⽤户输⼊逻辑地址,
页号=255/页⾯⼤⼩ 取整
页内偏移量=255%页⾯⼤⼩ 取余 KB 注意单位,KB和B
物理地址=所在块号页⾯⼤⼩1024 + 业内偏移量 B
代码实现
package com.os;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Scanner;
import sun.applet.Main;
public class Test {
/*
⽤户输⼊内存⼤⼩(单位GB),系统把内存分块,每块⼤⼩由⽤户输⼊设置,单位为KB,按字节寻址(B),也就是⼀个地址对应⼀个字节的⼤⼩
⽤户输⼊进程⼤⼩(单位KB)
为进程设置⼀个页表(页号,块号(块号的分配由系统随机产⽣)(先检查块号是否已经分配出去))
⽤户输⼊逻辑地址,
页号=255/页⾯⼤⼩取整
页内偏移量=255%页⾯⼤⼩取余  KB              注意单位,KB和B
物理地址=所在块号*页⾯⼤⼩*1024 + 业内偏移量  B
*
* */
public static void main(String[] args){
Random random =new Random();
Scanner scanner =new Scanner(System.in);
//寻址单位为字节B
//⼀个内存块有4KB * 1024 个地址
//⽤户⾃定义内存⼤⼩,单位为GB
System.out.println("请输⼊内存⼤⼩(单位为GB):");
//memorySize:内存⼤⼩(⽤户输⼊,必须整数)
int memorySize = Int();
System.out.println("请设置页⾯⼤⼩(单位KB):");
//memoryBlockSize⼀个内存块⼤⼩(单位为KB)
int memoryBlockSize = Int();
System.out.println("系统内存块(页⾯)⼤⼩为"+ memoryBlockSize +"KB,寻址单位为字节B");
//系统把内存分块,每块物理内存⼤⼩为memoryBlockSize KB
/
/memoryBlockCount:内存块数 = 内存⼤⼩(GB) * 1024(MB) * 1024(KB) / memoryBlockSize KB
int memoryBlockCount =(memorySize *1024*1024)/ memoryBlockSize;
System.out.println("内存⼤⼩为:"+ memorySize +"GB,"+"⼀个内存块⼤⼩为:"+ memoryBlockSize +"KB,共分为:"+ memoryBlockCount +"个内存块。");
无镍电镀//定义⼀个数组haveBeenUsedMemoryBlockNum,⽤来存储已经分配出去的内存块号,这样就可以在后⾯的随机分配内存块号时,把已经分配的内存块剔除出
//定义⼀个数组haveBeenUsedMemoryBlockNum,⽤来存储已经分配出去的内存块号,这样就可以在后⾯的随机分配内存块号时,把已经分配的内存块剔除出去
//每分配出去⼀个内存块,就把块号存储到haveBeenUsedMemoryBlockNum数组中
ArrayList<Integer> haveBeenUsedMemoryBlockNum =new ArrayList<Integer>();
//  //progressSice :进程⼤⼩,⽤户输⼊进程⼤⼩
System.out.println("请输⼊进程⼤⼩(单位为KB):");
//进程⼤⼩⽤户输⼊,单位为KB
int progressSice = Int();
//页⾯数量:进程⼤⼩ % 页⾯⼤⼩ = 0 ?进程⼤⼩ / 页⾯⼤⼩:进程⼤⼩ / 页⾯⼤⼩ + 1
int progressPageCount = progressSice % memoryBlockSize ==0? progressSice / memoryBlockSize : progressSice / memoryBlockSize +1;
//页号数组 progressPageNumberList
int[] progressPageNumberList =new int[progressPageCount];
//存储页号
for(int i =0; i < progressPageCount; i++){
progressPageNumberList[0]= i;
}
//HashMap类型集合,存储进程页号和块号的分配情况(页表)
Map<Integer, Integer> pageNumToBlockNum =new HashMap<Integer, Integer>();
粉尘气溶胶发生器
钟表齿轮//为每⼀页随机分配⼀个内存块号,内存块号的范围为0~memoryBlockCount-1
for(int i =0; i < progressPageNumberList.length; i++){
//产⽣⼀个随机数,表⽰随机产⽣的块号,这个数要和haveBeenUsedMemoryBlockNum中的数字进⾏⽐较,如果没有,就存储进去并分配给当前页号,如果已经存在,则重新⽣成⼀个随机块号
int randomBlockNum = Int(memoryBlockCount);//⾥⾯的值为内存块数,范围是0~memoryBlockCount-1
//判断⽣成的数字是否存在haveBeenUsedMemoryBlockNum中
if(haveBeenUsedMemoryBlockNum.size()==0){
haveBeenUsedMemoryBlockNum.add(randomBlockNum);
}else{
//递归判断存储已经分配出去的内存块号集合haveBeenUsedMemoryBlockNum中是否已经存在刚随
导电膜机产⽣的内存块号,如果存在,重新⽣成
randomBlockNum =HaveBeenUsedMemoryToBlockNum(haveBeenUsedMemoryBlockNum, randomBlockNum, random, memoryBlockCount);
}
//把页号i和分配给它的块号randomBlockNum添加到pageNumToBlockNum中
pageNumToBlockNum.put(i, randomBlockNum);//key值是页号,value值是内存块号
}
System.out.println("页表:");
System.out.println("页号----块号");
for(Entry<Integer, Integer>entry : Set()){
System.out.Key()+"---->"+ Value());
edm石墨}
//⽤户输⼊要寻址的逻辑地址(B)
System.out.println("请输⼊要查询的逻辑地址:");
int logicAddress = Int();
//判断逻辑地址是否超过进程的⼤⼩
//如果超过,提⽰⽤户,并重新输⼊
logicAddress =LogicAddress(logicAddress, progressSice, scanner);
//计算逻辑地址所在页号逻辑地址/(页⾯⼤⼩memoryBlockSize KB * 1024)
int logicAddressPageNum = logicAddress /(memoryBlockSize *1024);蚀刻液再生
//根据页号,取出当前页号所在的块号
int pageNumOfBlockNum = (logicAddressPageNum);
//计算逻辑地址页内偏移量逻辑地址 % (页⾯⼤⼩memoryBlockSize KB * 1024)
int pageOffset = logicAddress %(memoryBlockSize *1024);
//计算物理地址 memoryBlockSize * 1024 * 块号 + 页内偏移量
long physicalAddress = pageNumOfBlockNum * memoryBlockSize *1024+ pageOffset;
System.out.println("逻辑地址:"+ logicAddress +"\n所在页号为:"+ logicAddressPageNum +"\n页内偏移量为:"+ pageOffset +"\n所在块号为:"+ page NumOfBlockNum +"\n物理地址为:"+ physicalAddress);
}
//递归判断存储已经分配出去的内存块号集合haveBeenUsedMemoryBlockNum中是否已经存在刚随机产⽣的内存块号,如果存在,重新⽣成
public static int HaveBeenUsedMemoryToBlockNum(ArrayList<Integer> haveBeenUsedMemoryBlockNum,int randomBlockNum, Random random,int me moryBlockCount){
int count =0;
for(int j =0; j < haveBeenUsedMemoryBlockNum.size(); j++){
(j)== randomBlockNum){
//已分配块号中没有产⽣的随机块号,添加进去
//    haveBeenUsedMemoryBlockNum.add(randomBlockNum);
count++;
}else{
continue;
}
}
if(count ==0){
//说明集合中没有
//已分配块号中没有产⽣的随机块号,添加进去
haveBeenUsedMemoryBlockNum.add(randomBlockNum);
}else{
//已分配块号中有产⽣的随机块号,重新⽣成⼀个
randomBlockNum = Int(memoryBlockCount);
//重新检测
HaveBeenUsedMemoryToBlockNum(haveBeenUsedMemoryBlockNum, randomBlockNum, random, memoryBlockCount);
}
return randomBlockNum;
}
//判断逻辑地址是否超过进程的⼤⼩
//如果超过,提⽰⽤户,并重新输⼊
public static int LogicAddress(int logicAddress,int progressSice, Scanner scanner){
if(logicAddress > progressSice *1024){
//判断逻辑地址是否超过进程的⼤⼩
//如果超过,提⽰⽤户,并重新输⼊
System.out.println("数值越界,请重新输⼊!");
logicAddress = Int();
logicAddress =LogicAddress(logicAddress, progressSice, scanner);
}
return logicAddress;
}
}
实验结果

本文发布于:2024-09-23 02:30:38,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/102887.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:块号   内存   地址   分配   逻辑   进程
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议