用位示图管理磁盘空间分配与回收设计方案书报告.docx

上传人:b****5 文档编号:11896897 上传时间:2023-04-08 格式:DOCX 页数:16 大小:216.60KB
下载 相关 举报
用位示图管理磁盘空间分配与回收设计方案书报告.docx_第1页
第1页 / 共16页
用位示图管理磁盘空间分配与回收设计方案书报告.docx_第2页
第2页 / 共16页
用位示图管理磁盘空间分配与回收设计方案书报告.docx_第3页
第3页 / 共16页
用位示图管理磁盘空间分配与回收设计方案书报告.docx_第4页
第4页 / 共16页
用位示图管理磁盘空间分配与回收设计方案书报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

用位示图管理磁盘空间分配与回收设计方案书报告.docx

《用位示图管理磁盘空间分配与回收设计方案书报告.docx》由会员分享,可在线阅读,更多相关《用位示图管理磁盘空间分配与回收设计方案书报告.docx(16页珍藏版)》请在冰豆网上搜索。

用位示图管理磁盘空间分配与回收设计方案书报告.docx

用位示图管理磁盘空间分配与回收设计方案书报告

 

课程设计报告

(2009--2010年度第二学期)

 

课程名称:

操作系统实验

课设题目:

用位示图管理磁盘空间的分配与回收

院系:

控制与计算机工程学院

班级:

姓名:

指导教师:

李为

设计周数:

一周

成绩:

2010年7月9日

一、需求分析

要求打印或显示程序运行前和运行后的位示图,以及分配和回收磁盘的物理地址过程。

(1)假定现有一个磁盘组,共40个柱面。

每个柱面4个磁道,每个磁道又划分成4个物理记录。

磁盘的空间使用情况用位示图表示。

位示图用若干个字构成,每一位对应一个磁盘块。

1表示占用,0表示空闲。

为了简单,假定字长为16位,其位示图如图9—1所示。

系统设一个变量S,记录磁盘的空闲块个数。

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

字0

1

1

1

1

1

1

0

1

0

0

1

1

1

1

1

0

1

2

....

39

图9—1位示图

(2)申请一个磁盘块时,由磁盘块分配程序查位示图,找出一个为0的位,并计算磁盘的物理地址(即求出柱面号、磁道号(也即磁头号)和扇区号)。

由位示图计算磁盘的相对块号的公式如下:

相对块号一字号×16+位号

之后再将相对块号转换成磁盘的物理地址:

由于一个柱面包含的扇区数=每柱面的磁道数×每磁道的扇区数=4×4=16,故柱面号=相对块号/16的商,即柱面号=字号

磁道号=(相对块号/16的余数)/4的商,即(位号/4)的商

物理块号=(相对块号/16的余数)/4的余数,即(位号/4)的余数

(3)当释放一个相对物理块时,运行回收程序,计算该块在位示图中的位置,再把相应位置0。

计算公式如下:

先由磁盘地址计算相对块号:

相对块号=柱面号×16+磁道号×4+物理块号

再计算字号和位号:

字号=相对块号/16的商,也即字号=柱面号

位号=磁道号×物理块数/每磁道+物理块号

(4)按照用户要求,申请分配一系列磁盘块,运行分配程序,完成分配。

然后将分配的相对块号返回用户,并将相对块号转换成磁盘绝对地址,再显示系统各表和用户已分配的情况。

(5)设计一个回收算法,将上述已分配给用户的各盘块释放。

并显示系统各表。

回收算法框图如图5所示。

二、整体功能及设计

程序整体主要有三个功能模块,分别是:

初使化、分配以及回收。

当点击相应按钮时实现其功能。

使用二维数组array1_after[50][16]、array1_before[50][16]、array2_after[50][16]分别记录分配前、分配后、回收后的位示图的使用情况,使用表格m_list1_after、m_list1_before、m_listafter显示位示图的使用情况。

程序设计了三个方法,分别是初始化OnInitDialog()、分配算法OnButtonFp()、回收算法OnButtonHs()。

磁盘空间分配框图如图1所示,磁盘空间回收框图如图2所示.

 

图1磁盘空间分配框图图2磁盘空间回收框图

三、编程实现

#include"stdafx.h"

#include"FENPEIYUHUISHOU.h"

#include"FENPEIYUHUISHOUDlg.h"

#include"HuishouDlg.h"

#ifdef_DEBUG

#definenewDEBUG_NEW

#undefTHIS_FILE

staticcharTHIS_FILE[]=__FILE__;

#endif

classCAboutDlg:

publicCDialog

{

public:

CAboutDlg();

//DialogData

//{{AFX_DATA(CAboutDlg)

enum{IDD=IDD_ABOUTBOX};

//}}AFX_DATA

//ClassWizardgeneratedvirtualfunctionoverrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport

//}}AFX_VIRTUAL

//Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg:

:

CAboutDlg():

CDialog(CAboutDlg:

:

IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

voidCAboutDlg:

:

DoDataExchange(CDataExchange*pDX)

{

CDialog:

:

DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

CFENPEIYUHUISHOUDlg:

:

CFENPEIYUHUISHOUDlg(CWnd*pParent/*=NULL*/)

:

CDialog(CFENPEIYUHUISHOUDlg:

:

IDD,pParent)

{

//{{AFX_DATA_INIT(CFENPEIYUHUISHOUDlg)

m_kongxian=0;

//}}AFX_DATA_INIT

//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32

m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

voidCFENPEIYUHUISHOUDlg:

:

DoDataExchange(CDataExchange*pDX)

{

CDialog:

:

DoDataExchange(pDX);

//{{AFX_DATA_MAP(CFENPEIYUHUISHOUDlg)

DDX_Control(pDX,IDC_LIST2_AFTER,m_list2_after);

DDX_Control(pDX,IDC_LIST1_ON,m_list1_on);

DDX_Control(pDX,IDC_LIST1_BEFORE,m_list1_before);

DDX_Control(pDX,IDC_LIST1_AFTER,m_list1_after);

DDX_Text(pDX,IDC_EDIT_KONGXIAN,m_kongxian);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CFENPEIYUHUISHOUDlg,CDialog)

//{{AFX_MSG_MAP(CFENPEIYUHUISHOUDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON_FP,OnButtonFp)

ON_BN_CLICKED(IDC_BUTTON_HS,OnButtonHs)

ON_BN_CLICKED(IDC_BUTTON_INIT,OnButtonInit)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

BOOLCFENPEIYUHUISHOUDlg:

:

OnInitDialog()

{

CDialog:

:

OnInitDialog();

//Add"About..."menuitemtosystemmenu.

//IDM_ABOUTBOXmustbeinthesystemcommandrange.

ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX<0xF000);

CMenu*pSysMenu=GetSystemMenu(FALSE);

if(pSysMenu!

=NULL)

{

CStringstrAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if(!

strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);

}

}

//Settheiconforthisdialog.Theframeworkdoesthisautomatically

//whentheapplication'smainwindowisnotadialog

SetIcon(m_hIcon,TRUE);//Setbigicon

SetIcon(m_hIcon,FALSE);//Setsmallicon

//TODO:

Addextrainitializationhere

DWORDdwExStyle=LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT;

m_list1_before.SetExtendedStyle(dwExStyle);

m_list1_after.SetExtendedStyle(dwExStyle);

m_list2_after.SetExtendedStyle(dwExStyle);

m_list1_on.SetExtendedStyle(dwExStyle);

for(inti=15;i>=0;i--)

{

CStringstr;

str.Format("%d",i);

m_list1_before.InsertColumn(0,str,LVCFMT_CENTER,30);

m_list1_after.InsertColumn(0,str,LVCFMT_CENTER,30);

m_list2_after.InsertColumn(0,str,LVCFMT_CENTER,30);

}

m_list1_on.InsertColumn(0,"相对块号",LVCFMT_CENTER,60);

m_list1_on.InsertColumn(1,"柱面号",LVCFMT_CENTER,60);

m_list1_on.InsertColumn(2,"磁道号",LVCFMT_CENTER,60);

m_list1_on.InsertColumn(3,"物理块号",LVCFMT_CENTER,60);

m_list1_on.InsertColumn(4,"字号",LVCFMT_CENTER,40);

m_list1_on.InsertColumn(5,"位号",LVCFMT_CENTER,40);

 

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol

}

voidCFENPEIYUHUISHOUDlg:

:

OnSysCommand(UINTnID,LPARAMlParam)

{

if((nID&0xFFF0)==IDM_ABOUTBOX)

{

CAboutDlgdlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog:

:

OnSysCommand(nID,lParam);

}

}

voidCFENPEIYUHUISHOUDlg:

:

OnPaint()

{

if(IsIconic())

{

CPaintDCdc(this);//devicecontextforpainting

SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);

//Centericoninclientrectangle

intcxIcon=GetSystemMetrics(SM_CXICON);

intcyIcon=GetSystemMetrics(SM_CYICON);

CRectrect;

GetClientRect(&rect);

intx=(rect.Width()-cxIcon+1)/2;

inty=(rect.Height()-cyIcon+1)/2;

//Drawtheicon

dc.DrawIcon(x,y,m_hIcon);

}

else

{

CDialog:

:

OnPaint();

}

}

HCURSORCFENPEIYUHUISHOUDlg:

:

OnQueryDragIcon()

{

return(HCURSOR)m_hIcon;

}

voidCFENPEIYUHUISHOUDlg:

:

OnButtonFp()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

intindex=0;

intflag=1,m=0,n=0;

intcount=0;

for(m=0;m

{

for(n=0;n<16;n++)

{

if(array1_after[m][n]==0)

{

flag=0;

break;

}

}

if(flag==0)

break;

}

array1_after[m][n]=1;

CStringstr;

intk=0;

inti,j;

for(i=0;i

{

str.Format("%d",array1_after[i][0]);

}

for(i=0;i

{

m_list1_after.InsertItem(i,str);

for(j=0;j<16;j++)

{

CStringstr;

str.Format("%d",array1_after[i][j]);

array2_after[i][j]=array1_after[i][j];

if(array1_after[i][j]==0)

count++;

m_list1_after.SetItemText(i,j,str);

}

}

str.Format("%d",m*16+n);

m_list1_on.InsertItem(index,str);

str.Format("%d",m);

m_list1_on.SetItemText(index,1,str);

m_list1_on.SetItemText(index,4,str);

str.Format("%d",n/b);

m_list1_on.SetItemText(index,2,str);

str.Format("%d",n%b);

m_list1_on.SetItemText(index,3,str);

str.Format("%d",n);

m_list1_on.SetItemText(index,5,str);

index++;

m_kongxian=m_kongxian-1;

if(m_kongxian<0){

AfxMessageBox("无空闲块!

请回收后再使用!

");}

UpdateData(FALSE);

}

voidCFENPEIYUHUISHOUDlg:

:

OnButtonHs()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

UpdateData(TRUE);

CHuishouDlgdlg;

intnum=0;

intm=0,n=0;

CStringstr;

if(dlg.DoModal()==IDOK)

{

num=dlg.m_it1*16+dlg.m_it2*b+dlg.m_it3;

m=dlg.m_it1;

n=dlg.m_it2*b+dlg.m_it3;

}

array2_after[m][n]=0;

for(inti=0;i

{

str.Format("%d",array2_after[i][0]);

}

for(intx=0;x

{

m_list2_after.InsertItem(x,str);

for(inty=0;y<16;y++)

{

CStringstr;

str.Format("%d",array2_after[x][y]);

m_list2_after.SetItemText(x,y,str);

}

}

m_kongxian=m_kongxian+1;

for(i=0;i

{

CStringo=m_list1_on.GetItemText(i,0);

CStringstr1;

str1.Format("%d",num);

if(str1==o)

{

m_list1_on.DeleteItem(i);

}

}

UpdateData(FALSE);

}

voidCFENPEIYUHUISHOUDlg:

:

OnButtonInit()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

UpdateData(TRUE);

CInitDlgdlg;

intcount=0;

if(dlg.DoModal()==IDOK)

{

a=dlg.m_it1;

b=dlg.m_it2;

c=dlg.m_it3;

CStringstr;

intm,n;

intk=0;

for(m=0;m

{

for(n=0;n<16;n++)

{

array1_before[m][n]=(int)(rand()%2);

array1_after[m][n]=array1_before[m][n];

if(array1_before[m][n]==0)

{

count++;

m_kongxian=count;

}

}

str.Format("%d",array1_before[m][0]);

}

for(m=0;m

{

m_list1_before.InsertItem(m,str);

for(n=0;n<16;n++)

{

CStringstr;

str.Format("%d",array1_before[m][n]);

m_list1_before.SetItemText(m,n,str);

}

}

}

UpdateData(FALSE);

}

四、使用说明

程序运行后的运行界面如图3所示:

图3程序运行界面

单击初使化按扭初使化程序。

初使化后位示图分配情况图如图4所示。

图4初使化后位示图分配情况图

连续单击分配按钮,系统从第一个盘块到最后一个盘块,寻找第一个不为1的盘块,并为用户连续分配相应个数盘块,并显示分配情况和位示图情况,如图5所示。

图5点击分配按钮后信息

单击回收按钮,系统回收已分配给用户的盘块,如图6所示

图6回收的提示信息

当空闲块为零时,会弹出提示信息,如图7所示。

图6回收的提示信息

五、结果分析

程序满足要求,测试通过。

但是不能实现一次分配多块,只能多次单击分配按钮实现该功能。

在以后的学习中一定多加努力,解决这个问题。

六、心得体会

通过这次课程设计,我更加明确的了解了磁盘分配和回收的过程,同时我的编程能力也得到了加强。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1