1、map2map3位示图中每一位对应的相对磁盘块号如下图,磁盘块号由小到大对应于数组的低地址到高地址位上。即map0的第0位到第15位分别对应0号磁盘块到15号磁盘块的状态,map1的第0位到第15位对应16号磁盘块到31号磁盘块的状态,以此类推。313029282726252423222120191817164746454443424140393837363534333263626160595857565554535251504948如上表所示, 29号磁盘的状态存在map1中,对应于第13位, 第一行表示位号。3. 根据位示图中为1的位信息,生成一张已分配磁盘块表。柱面号磁道号物理块号 0
2、3 2. 1 7 如:map0的第1位为1, 则i=0,j=1, 其对应的相对块号block为1, 柱面号为0, 磁道号为 ,物理块号为1 计算公式如下:(1) 已知位示图中的下标i , j, 计算相对块号 Block= I * sizeof( int )+j (2)已知相对块号计算柱面、磁道、物理块号如下: 柱面号 C= 相对块号/(每柱面磁道数*每磁道物理块数) 磁道号 H= 相对块号%(每柱面磁道数*每磁道物理块数)/ 每磁道物理块数 物理块号 R= 相对块号%每磁道物理块数 4. 提出申请磁盘块或释放磁盘块的要求,根据要求完成操作。若申请盘块,则在位示图中找到为0的位,计算相对磁盘块号
3、,再计算相应具体物理设备的柱面号C、磁道号H和物理块号R,计算方法如步骤3;输出分配的CHR地址,并将位示图相应位由0变为1,输出位示图;若释放盘块,则从已分配磁盘块表中随机选择一个盘块释放,此时,已知CHR地址,计算该盘块的相对磁盘块号,再计算其相应信息在位示图中的位置( i,j)。计算过程如下:相对磁盘块号 = 柱面号*每柱面磁道数*每磁道物理块数+ 磁道号*每磁道物理块数+ 物理块号i = 相对磁盘块号/ sizeof(int)j = 相对磁盘块号% sizeof(int)四、实验报告要求1实验题目;2程序中所用的数据结构及说明;3源程序并附上必要的说明;4按照盘块的申请和释放顺序,打印
4、输出结果。源代码:/=package xiao.zhang.disk;public class DiskPartition private final int cylinderId; private final int trackId; private final int partitionId; private final int absolutelyId; public DiskPartition(int cylinderId, int trackId, int partionId, int absolutelyId) this.cylinderId = cylinderId; this.
5、trackId = trackId; this.partitionId = partionId; this.absolutelyId = absolutelyId; public int getAbsolutelyId() return this.absolutelyId; /* * (non-Javadoc) * * see java.lang.Object#toString() */ Override public String toString() return 磁盘块信息磁盘块编号: + this.cylinderId + - + this.trackId + + this.parti
6、tionId + , 磁盘块号: + this.absolutelyId + ;import java.util.ArrayList;import java.util.BitSet;import java.util.List;import java.util.Random;import java.util.Scanner;/* * 模拟磁盘存储 * author XiaoZhangpublic class Disk /* * 磁盘的柱面数量 * 磁盘的柱面编号为:0-cylinder-1 * 每个柱面的磁道数量 * 每个柱面的磁道编号为:0-track-1 * 每个磁道的磁盘块数量 * 每个磁
7、道的磁盘块编号为:0-partition-1 private List listPartition; private BitSet bitMap; * 未设置信息的磁盘 public Disk() System.out.println(创建一个未定义信息的磁盘); * 随机初始化BitMap的值 public void initalBitMap() Random random = new Random();初始化分配: for (int i = 0; i this.bitMap.length; i+) this.bitMapi = new BitSet(Integer.SIZE); for (
8、int j = 0; j Integer.SIZE; j+) this.bitMapi.set(j, random.nextBoolean(); * 初始化磁盘 * 创建BitMap对象 * 创建磁盘块状态表对象 * param cylinder * param track * param partition public Disk(int cylinder, int track, int partition) DiskPartition dp = null; this.listPartition = new ArrayList(); cylinder; track; for (int k =
9、 0; k partition; k+) dp = new DiskPartition(i, j, k, i * track * partition + j * partition + k); this.listPartition.add(dp); int partitionNumber = listPartition.size(); int length = partitionNumber % Integer.SIZE = 0 ? partitionNumber / Integer.SIZE : partitionNumber / Integer.SIZE + 1; this.bitMap
10、= new BitSetlength;Disk信息情况 柱面: + cylinder + 个, 每个柱面磁道: + track + 个, 每个磁道磁盘块: + partition + ,磁盘块号:0- + (listPartition.size() - 1) + System.out.println(); * 通过指定bitMap位置获得映射到磁盘上的磁盘块 * param i * 取值范围在0-bitMap.length-1 * param j * 取值范围在0-31 * return public void showDiskPartition(int i, int j) if (i = b
11、itMap.length | j = Integer.SIZE | (i * Integer.SIZE + j) = listPartition.size() System.out.println(请输入合法的磁盘块的bitMap位置 else int partitionId = i * Integer.SIZE + j; System.out.println(listPartition.get(partitionId).toString(); * 分配磁盘块 public void sendPatition() 再次开始分配剩余: int largeLength=listPartition.
12、size(); if(i*Integer.SIZE+j)=largeLength) return ; if (bitMapi.get(j)=false) bitMapi.set(j, true); int index = i * Integer.SIZE + j; System.out.println(listPartition.get(index).toString(); * 通过磁盘块号,修改bitMap的值 * param paratitionId * 磁盘块号 * param bvalue * 修改值 public void modifBitMap(int paratitionId,
13、boolean bvalue) int index = paratitionId / Integer.SIZE; int bitIndex = paratitionId % Integer.SIZE; if (index bitMap.length | bitIndex = 32) 请输入合法的磁盘块号 boolean before = bitMapindex.get(bitIndex); if (before = bvalue) / System.out.println(BitMap 位标识不用修改 System.out.println(BitMap 位标识不用释放 else bitMapi
14、ndex.set(bitIndex, bvalue); boolean after = bitMapindex.get(bitIndex);BitMap由: + before + 修改为: + after + ,释放成功 * 打印显示bitMap,显示磁盘块的存储情况 * return String public void showBitSet() StringBuffer sb = new StringBuffer(); bitMap.length; sb.append( if (bitMapi.get(j) sb.append(1 + else sb.append(0 + n System
15、.out.println(sb.toString(); public static void main(String args) Scanner console = new Scanner(System.in); System.out.print(请输入柱面数: int x = console.nextInt();请输入每个柱面数的道数: int y = console.nextInt();请输入每个磁道的磁盘块数: int z = console.nextInt(); Disk d = new Disk(x, y, z); d.initalBitMap(); d.showBitSet();
16、/ = / System.out.print(请输入bitMap的行:0-+(d.listPartition.size()%Integer.SIZE=0?(d.listPartition.size()/Integer.SIZE-1):(d.listPartition.size()/Integer.SIZE)+: / int i=console.nextInt();请输入bitMap的列:+(Integer.SIZE-1)+ / int j=console.nextInt(); / d.showDiskPartition(i, j); d.sendPatition();目前磁盘状态: /=请输入磁盘块的号码: int number = console.nextInt(); / Random r=new Random(); d.modifBitMap(number, false);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1