[实验目的]
通过一个简单的基于位示图的文件存储空间管理模拟算法的设计,加深理解文件系统的外存分配管理原理
[实验学时]
4学时
[实验类型]
综合性
[实验内容]
设计一个m行n列(自定)二维数组表示位示图结构,利用初始化操作模拟给出位示图的原始状态或者某一时刻的当前状态,设计算法:
1)完成给某文件分配几个盘块的过程(返回分配的盘块号并修改位示图);
2)完成某磁盘块的回收过程(根据要回收的盘块号求解出对应位示图位置并修改位示图。
注意:
1可以以某文件为单位分配、回收,或者以某个磁盘块为单位分配、回收
2. 可以自行选择采取连续分配或者离散分配方式,
3. 要求程序对不合法的条件或输入能给予恰当的处理。
[实验参考代码]
略
(这么简单,自己写吧)
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
int map[100][100];
typedef struct file
{
char fileName[30];
int length;
int start;
}file;
file File[60];
int line, column;
int fileTotalNum = 0;
void mapInit()
{
int i, j;
printf( "请输入行和列:" );
scanf( "%d%d", &line, &column );
for ( i = 0; i < line; i++ )
{
for ( j = 0; j < column; j++ )
{
map[i][j] = 0;
printf( "%3d", map[i][j] );
}
printf( "\n" );
}
}
void allocation( int fileNum )
{
int length = File[fileNum].length;
int b[60];
int i, j;
int x = 0;
for ( i = 0; i < line; i++ )
{
for ( j = 0; j < column; j++ )
{
if ( map[i][j] == 0 )
{
b[x] = i * line + j;
x++;
if ( x == length )
break;
}else
x = 0;
}
if ( x == length )
break;
}
if ( length > x )
printf( "空间不足,无法分配\n" );
else{
File[fileNum].start = b[0];
for ( int i = 0; i < x; i++ )
{
int x1 = b[i] / column;
int y1 = b[i] % column;
map[x1][y1] = 1;
}
}
for ( i = 0; i < line; i++ )
{
for ( j = 0; j < column; j++ )
{
printf( "%3d", map[i][j] );
}
printf( "\n" );
}
}
void recovery( char s[] )
{
int cnt = -1;
for ( int i = 0; i < fileTotalNum; i++ )
{
if ( strcmp( s, File[i].fileName ) == 0 )
{
cnt = i;
break;
}
}
if ( cnt == -1 )
{
printf( "没有此文件,请重新输入!\n" );
}
int start = File[cnt].start;
int length = File[cnt].length;
for ( int i = start; i < start + length; i++ )
{
int x1 = i / column;
int y1 = i % column;
map[x1][y1] = 0;
}
for ( int i = cnt + 1; i < fileTotalNum; i++ )
{
strcpy( File[i - 1].fileName, File[i].fileName );
File[i - 1].start = File[i].start;
File[i - 1].length = File[i].length;
}
printf( "回收成功\n" );
for ( int i = 0; i < line; i++ )
{
for ( int j = 0; j < column; j++ )
{
printf( "%3d", map[i][j] );
}
printf( "\n" );
}
}
void allocInit()
{
printf( "请输入文件名\n" );
scanf( "%s", &File[fileTotalNum].fileName );
printf( "请输入文件长度\n" );
scanf( "%d", &File[fileTotalNum].length );
allocation( fileTotalNum );
fileTotalNum++;
}
void recoverInit()
{
char name[30];
printf( "请输入回收文件名\n" );
scanf( "%s", &name );
recovery( name );
fileTotalNum--;
}
void showDir()
{
if ( fileTotalNum == 0 )
printf( "空文件\n" );
else
for ( int i = 0; i < fileTotalNum; i++ )
{
printf( "文件名:%s\n", File[i].fileName );
printf( "开始位置:%d\n", File[i].start );
printf( "文件长度:%d\n", File[i].length );
}
for ( int i = 0; i < line; i++ )
{
for ( int j = 0; j < column; j++ )
{
printf( "%3d", map[i][j] );
}
printf( "\n" );
}
}
void page()
{
printf( "1为创建文件,2为回收文件,3为显示所有文件信息\n" );
printf( "请选择操作模式\n" );
}
int main()
{
int mode;
mapInit();
while ( 1 )
{
page();
scanf( "%d", &mode );
switch ( mode )
{
case 1: allocInit(); break;
case 2: recoverInit(); break;
case 3: showDir(); break;
default: printf( "不存在该操作,请重新输入\n" ); break;
}
}
}
|