文件系统空闲空间管理模拟Word文档格式.docx
《文件系统空闲空间管理模拟Word文档格式.docx》由会员分享,可在线阅读,更多相关《文件系统空闲空间管理模拟Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
map[2]
map[3]
位示图中每一位对应的相对磁盘块号如下图,磁盘块号由小到大对应于数组的低地址到高地址位上。
即map[0]的第0位到第15位分别对应0号磁盘块到15号磁盘块的状态,map[1]的第0位到第15位对应16号磁盘块到31号磁盘块的状态,以此类推。
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
47
46
45
44
43
42
41
40
39
38
37
36
35
34
33
32
63
62
61
60
59
58
57
56
55
54
53
52
51
50
49
48
如上表所示,29号磁盘的状态存在map[1]中,对应于第13位,第一行表示位号。
3.根据位示图中为1的位信息,生成一张已分配磁盘块表。
柱面号
磁道号
物理块号
0
3
2
…….
……
1
7
如:
map[0]的第1位为1,则i=0,j=1,其对应的相对块号block为1,柱面号为0,磁道号为,物理块号为1
计算公式如下:
(1)已知位示图中的下标i,j,计算相对块号
Block=I*sizeof(int)+j
(2)已知相对块号计算柱面、磁道、物理块号如下:
柱面号C=相对块号/(每柱面磁道数*每磁道物理块数)
磁道号H=相对块号%(每柱面磁道数*每磁道物理块数)/每磁道物理块数
物理块号R=相对块号%每磁道物理块数
4.提出申请磁盘块或释放磁盘块的要求,根据要求完成操作。
若申请盘块,则在位示图中找到为0的位,计算相对磁盘块号,再计算相应具体物理设备的柱面号C、磁道号H和物理块号R,计算方法如步骤3;
输出分配的CHR地址,并将位示图相应位由0变为1,输出位示图;
若释放盘块,则从已分配磁盘块表中随机选择一个盘块释放,此时,已知CHR地址,计算该盘块的相对磁盘块号,再计算其相应信息在位示图中的位置(i,j)。
计算过程如下:
相对磁盘块号=柱面号*每柱面磁道数*每磁道物理块数+
磁道号*每磁道物理块数+物理块号
i=相对磁盘块号/sizeof(int)
j=相对磁盘块号%sizeof(int)
四、实验报告要求
1.实验题目;
2.程序中所用的数据结构及说明;
3.源程序并附上必要的说明;
4.按照盘块的申请和释放顺序,打印输出结果。
源代码:
//============================================
packagexiao.zhang.disk;
publicclassDiskPartition{
privatefinalintcylinderId;
privatefinalinttrackId;
privatefinalintpartitionId;
privatefinalintabsolutelyId;
publicDiskPartition(intcylinderId,inttrackId,intpartionId,
intabsolutelyId){
this.cylinderId=cylinderId;
this.trackId=trackId;
this.partitionId=partionId;
this.absolutelyId=absolutelyId;
}
publicintgetAbsolutelyId(){
returnthis.absolutelyId;
/*
*(non-Javadoc)
*
*@seejava.lang.Object#toString()
*/
@Override
publicStringtoString(){
return"
磁盘块信息[磁盘块编号:
"
+this.cylinderId+"
-"
+this.trackId+"
+this.partitionId+"
磁盘块号:
+this.absolutelyId+"
]"
;
}
importjava.util.ArrayList;
importjava.util.BitSet;
importjava.util.List;
importjava.util.Random;
importjava.util.Scanner;
/**
*模拟磁盘存储
*@authorXiaoZhang
publicclassDisk{
/**
*磁盘的柱面数量
*磁盘的柱面编号为:
0-cylinder-1
*每个柱面的磁道数量
*每个柱面的磁道编号为:
0-track-1
*每个磁道的磁盘块数量
*每个磁道的磁盘块编号为:
0-partition-1
privateList<
DiskPartition>
listPartition;
privateBitSet[]bitMap;
*未设置信息的磁盘
publicDisk(){
System.out.println("
创建一个未定义信息的磁盘"
);
*随机初始化BitMap的值
publicvoidinitalBitMap(){
Randomrandom=newRandom();
初始化分配:
for(inti=0;
i<
this.bitMap.length;
i++){
this.bitMap[i]=newBitSet(Integer.SIZE);
for(intj=0;
j<
Integer.SIZE;
j++){
this.bitMap[i].set(j,random.nextBoolean());
}
}
*初始化磁盘
*创建BitMap对象
*创建磁盘块状态表对象
*@paramcylinder
*@paramtrack
*@parampartition
publicDisk(intcylinder,inttrack,intpartition){
DiskPartitiondp=null;
this.listPartition=newArrayList<
();
cylinder;
track;
for(intk=0;
k<
partition;
k++){
dp=newDiskPartition(i,j,k,i*track*partition+j
*partition+k);
this.listPartition.add(dp);
}
intpartitionNumber=listPartition.size();
intlength=partitionNumber%Integer.SIZE==0?
partitionNumber
/Integer.SIZE:
partitionNumber/Integer.SIZE+1;
this.bitMap=newBitSet[length];
Disk信息情况[柱面:
+cylinder+"
个,每个柱面磁道:
+track
+"
个,每个磁道磁盘块:
+partition+"
磁盘块号:
0-"
+(listPartition.size()-1)+"
System.out.println();
*通过指定bitMap位置获得映射到磁盘上的磁盘块
*@parami
*取值范围在0-bitMap.length-1
*@paramj
*取值范围在0-31
*@return
publicvoidshowDiskPartition(inti,intj){
if(i<
0||i>
=bitMap.length||j<
0||j>
=Integer.SIZE
||(i*Integer.SIZE+j)<
||(i*Integer.SIZE+j)>
=listPartition.size()){
System.out.println("
请输入合法的磁盘块的bitMap位置"
}else{
intpartitionId=i*Integer.SIZE+j;
System.out.println(listPartition.get(partitionId).toString());
*分配磁盘块
publicvoidsendPatition(){
再次开始分配剩余:
intlargeLength=listPartition.size();
if((i*Integer.SIZE+j)>
=largeLength){
return;
if(bitMap[i].get(j)==false){
bitMap[i].set(j,true);
intindex=i*Integer.SIZE+j;
System.out.println(listPartition.get(index).toString());
*通过磁盘块号,修改bitMap的值
*@paramparatitionId
*磁盘块号
*@parambvalue
*修改值
publicvoidmodifBitMap(intparatitionId,booleanbvalue){
intindex=paratitionId/Integer.SIZE;
intbitIndex=paratitionId%Integer.SIZE;
if(index<
0||index>
bitMap.length||bitIndex<
||bitIndex>
=32){
请输入合法的磁盘块号"
booleanbefore=bitMap[index].get(bitIndex);
if(before==bvalue){
//System.out.println("
[BitMap位标识不用修改]"
System.out.println("
[BitMap位标识不用释放]"
}else{
bitMap[index].set(bitIndex,bvalue);
booleanafter=bitMap[index].get(bitIndex);
[BitMap由:
"
+before+"
修改为:
+after
+"
],释放成功"
*打印显示bitMap,显示磁盘块的存储情况
*@returnString
publicvoidshowBitSet(){
StringBuffersb=newStringBuffer();
bitMap.length;
sb.append("
["
if(bitMap[i].get(j)){
sb.append(1+"
}else{
sb.append(0+"
]\n"
System.out.println(sb.toString());
publicstaticvoidmain(String[]args){
Scannerconsole=newScanner(System.in);
System.out.print("
请输入柱面数:
intx=console.nextInt();
请输入每个柱面数的道数:
inty=console.nextInt();
请输入每个磁道的磁盘块数:
intz=console.nextInt();
Diskd=newDisk(x,y,z);
d.initalBitMap();
d.showBitSet();
//================================
//System.out.print("
请输入bitMap的行:
[0-"
+(d.listPartition.size()%Integer.SIZE==0?
(d.listPartition.size()/Integer.SIZE-1):
(d.listPartition.size()/Integer.SIZE))+"
]:
//inti=console.nextInt();
请输入bitMap的列:
+(Integer.SIZE-1)+"
//intj=console.nextInt();
//d.showDiskPartition(i,j);
d.sendPatition();
目前磁盘状态:
//=================================
请输入磁盘块的号码:
intnumber=console.nextInt();
//Randomr=newRandom();
d.modifBitMap(number,false);