文件系统——空闲块成组链接法的模拟

文件系统——空闲块成组链接法的模拟

内容

  1. 设计合适的数据结构模拟磁盘空闲块的情况。
    (操作系统第二版 孟庆昌 5.4下的第4点)

  2. 模拟分配空闲块的过程。

  3. 模拟回收空闲块的过程。

  4. 模拟对所有空闲块进行分析、凑连续块 的维护过程。

思路

步骤一:

了解知识点:

  1. 空闲块成组链接法的创建和功能

  2. 了解运行的过程和原理

  3. 写出数据结构和程序结构

  4. 运行调试

  5. 补充功能

步骤二:

1. 数据结构:

  • 超级栈s_stack

  • 超级栈深 s_stack.stackDeepth

  • 栈st

  • 栈深 stackDeepth(本次实验为10)

  • 栈头 stack[10]

  • 盘块号 stack[n] int

  • 组长盘块 Captin 栈指针st*

  • 空闲块 :栈内成员 除了第一个组长

  • 申请空间:申请的名称 申请盘块数量 自动分配对应的盘块号,进队

  • 释放空间:释放名称 自动对应相应的数量和盘块号,出队

2. 函数、功能结构:

    1. 构建空闲块成组链接 void makeList()
    1. 分配空闲盘块st* Devide(st* stack,int n)
    1. 释放盘块void Release(st* stack,int n)
    1. 展现当前盘块的状态void showStack(st* stack)
    1. 维护盘块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
  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值