IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 操作系统位示图bitMap算法实现 -> 正文阅读

[数据结构与算法]操作系统位示图bitMap算法实现

1.位示图简介(Bit Map)

爆肝4小时~
这种方法是为文件存储空间建立一张位示图用以反映整个存储空间的分配情况。
普遍采用这种方法的OS:NOVA机中的RDOS,PDP-11的DOS和微型机CP/M
基本思想:用若干字节构成一张图,每个字节中的每一位对应文件存储器中的一个物理块。文件存储器上的物理块,依次编号为0,1,2,3……。在位示图中的第一个字节对应0,1,2…,号块,7,第二字节对应8,9,…,15号块,一次类推。若某位位“1”,表示对应的物理块已分配;若某位为“0”,表示对应的物理块空闲。
在这里插入图片描述
上代码:
//Manager.java

package com.xin;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class Manager {
    int m , p , q;//磁盘柱面数,每柱面磁道数, 每磁道物理块数
    int size;//行数
    int[][] block;//相对磁盘块号 table
    int[][] bitmap;//位示图
    Stored list = null;//已分配磁盘对象
    ArrayList<Stored> lists = new ArrayList<Stored>();//已分配磁盘链表
    //构造方法输入m,p,q以及随机生成数据对位示图进行初始化
    public Manager() {
        System.out.println("请分别输入磁盘柱面数,每柱面磁道数, 每磁道物理块数:");
        Scanner scanner = new Scanner(System.in);
        m = scanner.nextInt();
        p = scanner.nextInt();
        q = scanner.nextInt();
        size =  m * p * q / 8;
        bitmap = new int[size][8];
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < 8; j++) {
                int random = new Random().nextInt(2);
                //Random随机数类.nextInt()方法生成随机数
                 bitmap[i][j] = random;
            }
        }
    }
    //输出位示图
    public void printBM() {
        System.out.println("位示图:");
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < 8; j++) System.out.print(bitmap[i][j] + "  ");
            System.out.println();
        }
        System.out.println("-----------------------");
    }
    //输出相对磁盘块号 table
    public void printBlock() {
        block = new int[size][8];//创建相对磁盘块号 table
        System.out.println("block:");
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < 8; j++) {
                block[i][j] = i * 8 + j;//计算对应的磁盘块号
                System.out.print(block[i][j] + "   \t");
            }
            System.out.println();
        }
        System.out.println("----------------------------------------------------------");
    }
    //输出已分配磁盘块表
    public void printStored() {
        int index = 0;
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < 8; j++) {
                if (bitmap[i][j] == 1) {
                    lists.add(new Stored(block[i][j] / (4 * 8),//柱面号
                            block[i][j] % (4 * 8) / 8,//磁道号
                            block[i][j] % 8, index++));//物理块号
                }
            }
        }
        System.out.println("柱面号     磁道号      物理块号");
        for (Stored list : lists) {//遍历已分配磁盘链表 foreh循环
            System.out.println(list.C + "        \t" + list.H + "       \t" + list.R);
        }
        System.out.println("-----------------");
    }
    //申请磁盘块
    public void apply() {
        System.out.print("申请前的");
        printBM();//申请前位示图
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < 8; j++) {
                if (bitmap[i][j] == 0) {//如果 == 0就申请
                    bitmap[i][j] = 1;//置位1
                    System.out.println("申请磁盘信息:" + block[i][j] / (4 * 8) + "," +
                            " " + block[i][j] % (4 * 8) / 8 + ", " + block[i][j] % 8);
                    System.out.print("申请后的");
                    printBM();//申请后位示图
                    return;
                }
            }
        }
    }
    //释放磁盘号
    public void release() {
        //随机数随机释放一块被占用的
        int random = new Random().nextInt(lists.size());
        System.out.println("释放的random:" + random);
        for (int i = 0; i < lists.size(); i++) {
            if (random == lists.get(i).index) {//寻找释放块
                list = lists.get(i);
                int bnum = list.C * 4 * 8 + list.H * 8 + list.R;//相对磁盘块号
                int x = bnum / 8;//第x行
                int y = bnum % 8;//第y列
                System.out.println("i = " + x + ", j = " + y);
                System.out.print("释放前的");
                printBM();
                bitmap[x][y] = 0;
                System.out.print("释放后的");
                printBM();
                return;
            }
        }

    }


}

//Stored.java

package com.xin;

public class Stored {
    int C, H, R, index;//  柱面号,磁道号,物理块号,下标

    public Stored(int c, int h, int r, int index) {
        C = c;
        H = h;
        R = r;
        this.index = index;
    }

}

//Start.java

package com.xin;

import java.util.Scanner;

public class Start {
    public static void main(String[] args) {
        Manager manager = new Manager();
        int i = 0;
        do {
            System.out.println("1.随机形成位示图");
            System.out.println("2.打印block");
            System.out.println("3.打印存储信息");
            System.out.println("4.申请磁盘块");
            System.out.println("5.释放磁盘块");
            System.out.println("6.退出");
            System.out.println("请输入操作序号:");
            Scanner scanner = new Scanner(System.in);
            i = scanner.nextInt();
            switch (i) {
                case 1:
                    manager.printBM();
                    break;
                case 2:
                    manager.printBlock();
                    break;
                case 3:
                    manager.printStored();
                    break;
                case 4:
                    manager.apply();
                    break;
                case 5:
                    manager.release();
                    break;
                case 6:
                    break;
            }
        }while (i != 6);
        System.out.println("运行结束!");
    }
}

运行结果

在这里插入图片描述
原创作品,谢谢浏览!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-11 15:58:41  更:2021-12-11 15:59:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:53:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码