文件系统空闲空间管理模拟Word文档格式.docx

上传人:b****5 文档编号:21010867 上传时间:2023-01-26 格式:DOCX 页数:11 大小:79.67KB
下载 相关 举报
文件系统空闲空间管理模拟Word文档格式.docx_第1页
第1页 / 共11页
文件系统空闲空间管理模拟Word文档格式.docx_第2页
第2页 / 共11页
文件系统空闲空间管理模拟Word文档格式.docx_第3页
第3页 / 共11页
文件系统空闲空间管理模拟Word文档格式.docx_第4页
第4页 / 共11页
文件系统空闲空间管理模拟Word文档格式.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

文件系统空闲空间管理模拟Word文档格式.docx

《文件系统空闲空间管理模拟Word文档格式.docx》由会员分享,可在线阅读,更多相关《文件系统空闲空间管理模拟Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。

文件系统空闲空间管理模拟Word文档格式.docx

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);

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1