位示图磁盘管理模拟实现算法

位示图磁盘管理模拟实现算法位示图磁盘管理模拟实现算法分配和回收转换公式3.1转换公式的四种情况1.行列号从0开始,盘块号从0开始2.行列号从0开始,盘块号从1开始3.行列号从1开始,盘块号从0开始4.行列号从1开始,盘块号从1开始提示:(1)/为整除,%为取余(2)位示图每个位可以取0或1,下面表格中的内容不代表位示

大家好,欢迎来到IT知识分享网。位示图磁盘管理模拟实现算法"

位示图磁盘管理模拟实现算法

分配和回收转换公式

3.1 转换公式的四种情况
1.行列号从0开始,盘块号从0开始
2.行列号从0开始,盘块号从1开始
3.行列号从1开始,盘块号从0开始
4.行列号从1开始,盘块号从1开始

提示:
(1)/为整除,%为取余
(2)位示图每个位可以取0或1,下面表格中的内容不代表位示图的取值,而是代表对应位的位置编号,即行号列号盘块号。每个单元格内容的格式如下:
(3)为了方便说明,假设下面的位示图每行都只有4个位
盘块号( 行号,列号)

3.1.1 行列号从0开始,盘块号从0开始
如表3.1.1:
位 字 第0列 第1列 第2列 第3列
第0行 0(0,0) 1(0,1) 2(0,2) 3(0,3)
第1行 4(1,0) 5(1,1) 6(1,2) 7(1,3)
第2行 8(2,0) 9(2,1) 10(2,2) 11(2,3)
第…行 … … … …
表3.1.1
此种情况最好计算,类似于二维数组的行列下标与元素位置之间的转换
分配时,行列号转换为盘块号
盘块号 = 行号 ∗ 行位数 + 列号
回收时,盘块号转换为行列号:
行号 = 盘块号 / 行位数
列号 = 盘块号 % 行位数

3.1.2 行列号从0开始,盘块号从1开始
如表3.1.2:
位 字 第0列 第1列 第2列 第3列
第0行 1(0,0) 2(0,1) 3(0,2) 4(0,3)
第1行 5(1,0) 6(1,1) 7(1,2) 8(1,3)
第2行 9(2,0) 10(2,1) 11(2,2) 12(2,3)
第…行 … … … …
表3.1.2
相对于第一种情况,盘块号多了1,所以:
分配时,相对于第一种情况,计算后盘块号再加一
盘块号 = 行号 ∗ 行位数 + 列号 + 1
回收时,相对于第一种情况,计算前盘块号先减一
行号 = (盘块号−1) / 行位数
列号 = (盘块号 − 1) % 行位数

3.1.3 行列号从1开始,盘块号从0开始
如表3.1.3:
位 字 第1列 第2列 第3列 第4列
第1行 0(1,1) 1(1,2) 2(1,3) 3(1,4)
第2行 4(2,1) 5(2,2) 6(2,3) 7(2,4)
第3行 8(3,1) 9(3,2) 10(3,3) 11(3,4)
第…行 … … … …
表3.1.3
相对于第一种情况,行列号多了1,所以:
分配时,相对于第一种情况,计算前行列号先减一
盘块号= == (行号 − 1) ∗ 行位数 + 列号 − 1
回收时,相对于第一种情况,计算后行列号再加一
行号 = 盘块号 / 行位数 + 1
列号 = 盘块号 % 行位数 + 1

3.1.4 行列号从1开始,盘块号从1开始
如表3.1.4:
位 字 第1列 第2列 第3列 第4列
第1行 1(1,1) 2(1,2) 3(1,3) 4(1,4)
第2行 5(2,1) 6(2,2) 7(2,3) 8(2,4)
第3行 9(3,1) 10(3,2) 11(3,3) 12(3,4)
第…行 … … … …
表3.1.4
相对于第一种情况,盘块号、行列号都多了1,所以:分配时,相对于第一种情况,计算前行列号先减一,计算后盘块号再加一
盘块号 = (行号 − 1) * 行位数 + (列号 − 1) + 1
盘块号 = (行号 – 1) * 行位数 + 列号
回收时,相对于第一种情况,计算前盘块号先减一,计算后行列号再加一
行号 = (盘块号 — 1) / 行位数 + 1
列号 = (盘块号 —1) % 行位数 + 1

 

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class bitmap extends JFrame implements ActionListener  {
    JTable table;
    JScrollPane sp1,sp2;
    JTextArea ta;
    JLabel l1,l2,l3,l4,l5;
    JTextField tf1,tf2,tf3;
    JButton b1,b2,b3,b4;
    JPanel p1,p2,p3,p4,p5,p6,p7;
    String data[][];
    String colum[];
    int sp [];//存放相对可用块
    int used[];//存放相对已用块
    int A,H;//A为可用快,H为已用块
    public static void main(String [] args){
        new bitmap();
    }
    public void init() { //功能:初始化
        int k;
        for(int i=0;i<30;i++)
            for(int j=0;j<16;j++) {
                k = (int)(Math. random()*2);//0与1两数字中进行随机
                data[i][j]=""+k;
                table.setValueAt(""+k,i,j);
            }
    }
public bitmap() {
    // TODO Auto-generated constructor stub
    super("位示图管理磁盘空间的分配与回收算法模拟实现");
    data=new String[30][16];
    colum =new String[16];
    sp=new int[480];
    used=new int[480];
    A=0;
    H=0;
    for(int i=0;i<16;i++) {
        colum[i]=""+i;
        
    }
    table = new JTable(data,colum);
    sp1 = new JScrollPane(table);
    tf1 = new JTextField(6);
    tf2 = new JTextField(6);
    tf3 = new JTextField(8);
    ta = new JTextArea(10,20);
    sp2 = new JScrollPane(ta);
    p1 = new JPanel(new BorderLayout());
    p2 = new JPanel(new FlowLayout());
    p3 = new JPanel(new BorderLayout());
    p4 = new JPanel(new FlowLayout());
    p5 = new JPanel(new FlowLayout());
    p6 = new JPanel(new BorderLayout());
    p7 = new JPanel(new FlowLayout());
    
    l1 = new JLabel("位示图");
    b1 = new JButton("位示图初始化");
    b1. addActionListener(this);
    b2 = new JButton("回收全部磁盘块");
    b2. addActionListener(this);
    p2.add(b1);
    p2. add(b2);
    p1.add(l1, "North");
    p1. add(sp1, "Center");
    p1.add(p2 ,"South");

    l2 = new JLabel("运行状况: ");
    l5 = new JLabel("空闲块数量: ");
    p7.add(l5);
    p7.add(tf3);
    p3.add(l2, "North");
    p3. add(p7,"South");
    p3. add(sp2,"Center");
    l3 = new JLabel("请输入需要分配的块数: ");
    l4 = new JLabel("请输入要回收的盘块号: ");
    b3 = new JButton("确认分配");
    b3.addActionListener(this);

    
    b4= new JButton("确认回收");
    b4. addActionListener(this);
    p4.add(l3);p4. add(tf1);
    p4. add(b3);p5.add(l4);
    p5. add(tf2);
    p5. add(b4);
    p6. add(p4 ,"North");
    p6. add(p5, "Center");

    this.setLayout(new BorderLayout());
    this. add(p1, "West");
    this.add(p3,"Center");
    this. add(p6, "South");
    this. pack();
    this . setVisible(true);
}


public void getavail() //功能:得出可用块号与不可用块号的集合
    {
    int a;
    int b=0,c=0;
    A= 0;
    H=0;
    for(int i=0;i<30;i++)
        for(int j=0;j<16;j++) {
            if(data[i][j].equals("0")) {
                a=i*16+j;//得到相对块号
                sp[b]=a;//写入可用块集合
                A++;
                b++;
                
            }else{
                a=i*16+j;//得到相对块号
                used[c]=a;
                H++;
                c++;//写入不可用块号 集合
            }
        }
        
    }
        

public void allrec(){//全部收回
    ta.setText("");
    String str= "收回结果:\n";
    for(int i=0;i<H;i++) {
        int a = used[i]/16;
        int b = used[i]%16/4;
        int c = used[i]%16%4;
        data[a][4*b+c]="0";
        table.setValueAt("0",a,4*b+c);//位示图相应位置零
        str+="柱面"+a+"--磁道"+b+"--扇区"+c+"--盘块号"+used[i]+"\n";
        used[i]=0;//位示图相应位置置零
    }
    for(int i=0;i<30;i++)
        for(int j=0;j<16;j++)
        {
            table.setValueAt("0",i,j);
        }
    H=0;
    getavail();
    ta.append(str);
}
    


@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    if(e.getSource()==b1) {
        init();
        getavail();
        String str6=""+A;
        ta.append("初始化完成\n");
        tf3.setText(str6);
    }
    else if(e.getSource()==b2) {
        if(A==480) {
            ta.setText("");
            String str7="没有资源可回收";
            ta.append(str7);
        }else {
            allrec();
        }
        String str8=""+A;
        tf3.setText(str8);
    }
    else if(e.getSource()==b3) {
        int n;
        System.out.println(tf1.getText());
        n=Integer.parseInt(tf1.getText());
        tf1.setText("");
        if(A<n) {
            ta.setText("");
            String str1="空闲块不足";
            ta. append(str1);
            JOptionPane.showMessageDialog(null, "空闲块不足","提示",JOptionPane.PLAIN_MESSAGE);
            return;
        }
        else {
            int j,k;
            ta.setText("");
            String str= "分配结果\n" ;
            int x=H;
            for(int i=0;i<n;i++) {
                j = sp[1]/16;
                k = sp[1]-j*16;
                used[x+1]=sp[1];//可用块相对地址转为已用块相对地址
                data[j][k]="1";
                table. setValueAt("1",j,k);//将位示图对应位置写1
                str+="桂面"+sp[i]/16+"--磁道"+(sp[i]%16)/4+"-- 扇区"+(sp[i]%16)%4+"--盘块号: "+sp[i]+" \n";
                A--;
                H++;
            }
            for(int t=0;t<A;t++) {
                sp[t]=sp[t+n];//删除可用块中的已用块
            }
            ta. append(str);

            }
            String str2=""+A;
            tf3.setText(str2);
            tf1. setText("");
    }

    else if(e. getSource()==b4) {
        int num;
        num=Integer.parseInt(tf2.getText());
        ta.setText("");
        String str="";
        int j,k=0;
        int a=num/16;//柱面
        int b=num%16/4;//磁道
        int c=num%16%4;//扇区
        if(data[a][4*b+c].equals("0")){
            JOptionPane.showInternalMessageDialog(null, "不可回收空闲块","提示",JOptionPane.PLAIN_MESSAGE);
            //tf2.setText(" ");
            System.out.println("不可回收");
            return;

        }else {
            data[a][4*b+c]="0";
            table.setValueAt("0",a,4*b+c);
            str+="柱面"+a+"磁道"+b+"扇区"+c+"盘快号"+num+"\n";
            A++;
            H--;
            for(int i=0;i<H;i++) {
                if(used[i]==num) {
                    k=i;
                    break;
                }
            }
            for( j=k;j<H;j++)
            {
                used[j]=used[j+1];//将回收的块号从以用中删除
                ta.append("回收结果:\n");
                ta.append(str);
            }
        }
        getavail();
        String str5=""+A;
        tf3.setText(str5);
        tf2.setText("");
    }
    }

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/33833.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信