文件系统——空闲块成组链接法的模拟
文章目录
内容
-
设计合适的数据结构模拟磁盘空闲块的情况。
(操作系统第二版 孟庆昌 5.4下的第4点) -
模拟分配空闲块的过程。
-
模拟回收空闲块的过程。
-
模拟对所有空闲块进行分析、凑连续块 的维护过程。
思路
步骤一:
了解知识点:
-
空闲块成组链接法的创建和功能
-
了解运行的过程和原理
-
写出数据结构和程序结构
-
运行调试
-
补充功能
步骤二:
1. 数据结构:
-
超级栈s_stack
-
超级栈深 s_stack.stackDeepth
-
栈st
-
栈深 stackDeepth(本次实验为10)
-
栈头 stack[10]
-
盘块号 stack[n] int
-
组长盘块 Captin 栈指针st*
-
空闲块 :栈内成员 除了第一个组长
-
申请空间:申请的名称 申请盘块数量 自动分配对应的盘块号,进队
-
释放空间:释放名称 自动对应相应的数量和盘块号,出队
2. 函数、功能结构:
-
- 构建空闲块成组链接 void makeList()
-
- 分配空闲盘块st* Devide(st* stack,int n)
-
- 释放盘块void Release(st* stack,int n)
-
- 展现当前盘块的状态void showStack(st* stack)
-
- 维护盘块void SafeStack(st* stack)
3. 过程结构:
队列:
-
分配队入出栈 分配成功的条件:栈减去的长度==队列进来的长度
当分配到栈底盘块时,先将栈底盘块出栈,将改盘块数据督导超级块栈中,再将超级块的栈顶分配出去 -
释放队出进栈 释放成功的条件:队列出去的长度==栈增加的长度
当栈满的时候,若再回收一个盘块,先将栈内数据写到该新回收的盘块中,将栈清空,再将该回收的盘块作为超级栈。
分配过程:
需要新建文件分配空闲盘块,先把超级块中表示栈深的数值减一,加入加一得到39,就以39为索引,检索超级块中的空闲块号栈的索引,得到盘块号111,它就是当前分出去的第1个空闲块。
特殊: 如果栈深是1,还要分配两个盘块,那么栈深减一,结果为0,以0为索引下标,得到盘块150,他是第78号组的组长;然后把150号盘块中的内容,下一组77组中所有的空闲盘块的数量50和各个盘块的块好分别放入超级块的栈深和空闲号块,超级栈中记录了第77组盘块的情况;最后,把150号盘块分配出去。至此,
释放过程: 需要删除文件,它占用3个盘块,块号分别是69、75、87.首先释放69号块,把块号为69放在栈深40所对应的元素,然后栈深加1,变为41.接着释放75号块和87号块。最后,超级快中的栈深的值为43,空闲块号栈中新加入
特殊: 栈满了,还要继续释放盘块,以此盘块为组长号。
步骤三:
- 实验准备:
准备创建30个空闲块,每个组有10个盘块(栈深是10).
栈内存储的是盘块号,每个栈的栈底为stack[0],栈顶是stack[9],操作都在栈顶
第1组的总块数是10,而首块块号标志为0,并不表示物理块号,而是分配警戒位,作为空闲盘块连的结束标志。
代码
数据结构定义
#include<iostream>
#include<queue>
using namespace std;
#define N 10 //最大栈深
#define max 30//最大盘块数
//普通栈定义
struct st
{
int stackDeepth=0; //栈深
int stack[N]; //栈头数组 根据栈深获取对应的盘块
st* next=NULL; //如果该栈满了 则需要新增一个新栈
};
st s_stack; //超级栈 超级栈的栈深s_stack.stackDeepth==s_stackDeepth
//初始化栈
void InitStack(st* Stack){
Stack->next=NULL;
for(int i=0;i<N;i++)
Stack->stack[i]=0;
Stack->stackDeepth=0;
}
//清空化栈
void CleanStack(st* Stack){
Stack->next=NULL;
for(int i=0;i<N;i++)
Stack->stack[i]=0;
Stack->stackDeepth=0;
}
//显示栈表
void showStack(st* stack)
{
int n=0;
cout<<"*******第0号栈是超级栈*******"<<endl;
while(stack!=NULL)
{
//第0号栈是超级栈
cout<<"第"<<n<<"个栈的盘块号,栈深是"<< stack->stackDeepth<<endl;
for(int i=0;i<N;i++)
cout<<"盘块"<<stack->stack[i]<<" ";
cout<<endl;
if(stack->next!=NULL)
stack=stack->next;
else
stack=NULL;
n++;
}
}
//
创建成组链接
//创建成组链接
void makeList()
{
int i,a=9;
int n;
st* tempStack=new st();//定义一个临时的栈 为后续的增加栈准备
st* Captain=new st(); //定义一个临时指针
for(i=1,n=9;i<max+1;i++)
{
//先填满超级栈,再填普通的栈
if(i<N&&n>