1、用位示图管理磁盘空间的分配与回收设计报告课 程 设 计 报 告( 2009-2010年度第二学期)课程名称: 操作系统实验 课设题目: 用位示图管理磁盘空间的分配与回收 院 系: 控制与计算机工程学院 班 级: 姓 名: 指导教师: 李为 设计周数: 一周 成 绩: 2010年7月9 日一、需求分析要求打印或显示程序运行前和运行后的位示图,以及分配和回收磁盘的物理地址过程。(1)假定现有一个磁盘组,共40个柱面。每个柱面4个磁道,每个磁道又划分成4个物理记录。磁盘的空间使用情况用位示图表示。位示图用若干个字构成,每一位对应一个磁盘块。1表示占用,0表示空闲。为了简单,假定字长为16位,其位示图
2、如图91所示。系统设一个变量S,记录磁盘的空闲块个数。位0123456789101112131415字0111111010011111012. . .39图91 位示图(2)申请一个磁盘块时,由磁盘块分配程序查位示图,找出一个为0的位,并计算磁盘的物理地址(即求出柱面号、磁道号(也即磁头号)和扇区号)。由位示图计算磁盘的相对块号的公式如下:相对块号一字号16+位号之后再将相对块号转换成磁盘的物理地址:由于一个柱面包含的扇区数每柱面的磁道数每磁道的扇区数4416,故柱面号相对块号16的商,即柱面号字号磁道号(相对块号16的余数)4的商,即(位号4)的商物理块号(相对块号16的余数)4的余数,即(
3、位号4)的余数(3)当释放一个相对物理块时,运行回收程序,计算该块在位示图中的位置,再把相应位置0。计算公式如下:先由磁盘地址计算相对块号:相对块号柱面号16+磁道号4+物理块号再计算字号和位号:字号相对块号16的商,也即字号柱面号位号磁道号物理块数每磁道+物理块号 (4)按照用户要求,申请分配一系列磁盘块,运行分配程序,完成分配。然后将分配的相对块号返回用户,并将相对块号转换成磁盘绝对地址,再显示系统各表和用户已分配的情况。(5)设计一个回收算法,将上述已分配给用户的各盘块释放。并显示系统各表。回收算法框图如图5所示。二、整体功能及设计程序整体主要有三个功能模块,分别是:初使化、分配以及回收
4、。当点击相应按钮时实现其功能。使用二维数组array1_after5016、array1_before5016、array2_after5016分别记录分配前、分配后、回收后的位示图的使用情况,使用表格m_list1_after、m_list1_before、m_listafter显示位示图的使用情况。程序设计了三个方法,分别是初始化OnInitDialog()、分配算法OnButtonFp()、回收算法OnButtonHs()。磁盘空间分配框图如图1所示, 磁盘空间回收框图如图2所示. 图1 磁盘空间分配框图 图2 磁盘空间回收框图三、编程实现#include stdafx.h#includ
5、e FENPEIYUHUISHOU.h#include FENPEIYUHUISHOUDlg.h#include HuishouDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endifclass CAboutDlg : public CDialogpublic: CAboutDlg();/ Dialog Data /AFX_DATA(CAboutDlg) enum IDD = IDD_ABOUTBOX ; /AFX_DATA / ClassWizard generat
6、ed virtual function overrides /AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support /AFX_VIRTUAL/ Implementationprotected: /AFX_MSG(CAboutDlg) /AFX_MSG DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD) /AFX_DATA_INIT(CAboutDlg) /AFX_
7、DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CAboutDlg) /AFX_DATA_MAPCFENPEIYUHUISHOUDlg:CFENPEIYUHUISHOUDlg(CWnd* pParent /*=NULL*/) : CDialog(CFENPEIYUHUISHOUDlg:IDD, pParent) /AFX_DATA_INIT(CFENPEIYUHUISHOUDlg) m_kongxian = 0; /AFX_DATA_INI
8、T / Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CFENPEIYUHUISHOUDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CFENPEIYUHUISHOUDlg) DDX_Control(pDX, IDC_LIST2_AFTER, m_list2_after); DDX_Co
9、ntrol(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_MAPBEGIN_MESSAGE_MAP(CFENPEIYUHUISHOUDlg, CDialog) /AFX_MSG_MAP(CFENPEIYUHUISHOUDlg) ON_WM_SYSCOMMAND()
10、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_MAPEND_MESSAGE_MAP()BOOL CFENPEIYUHUISHOUDlg:OnInitDialog() CDialog:OnInitDialog(); / Add About. menu item to system menu. / IDM
11、_ABOUTBOX must be in the system command range. ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); / Set the icon for this dialog. The framework does this automatically / when the applications main w
12、indow is not a dialog SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set small icon / TODO: Add extra initialization here DWORD dwExStyle = LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT; m_list1_before.SetExtendedStyle(dwExStyle); m_list1_after.SetExtendedStyle(dwExStyle); m_list2_after
13、.SetExtendedStyle(dwExStyle); m_list1_on.SetExtendedStyle(dwExStyle); for(int i=15;i=0;i-) CString str; 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.InsertColu
14、mn(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); return TRUE; / return TRUE
15、unless you set the focus to a controlvoid CFENPEIYUHUISHOUDlg:OnSysCommand(UINT nID, LPARAM lParam) if (nID & 0xFFF0) = IDM_ABOUTBOX) CAboutDlg dlgAbout; dlgAbout.DoModal(); else CDialog:OnSysCommand(nID, lParam); void CFENPEIYUHUISHOUDlg:OnPaint() if (IsIconic() CPaintDC dc(this); / device context
16、for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); / Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon +
17、 1) / 2; / Draw the icon dc.DrawIcon(x, y, m_hIcon); else CDialog:OnPaint(); HCURSOR CFENPEIYUHUISHOUDlg:OnQueryDragIcon() return (HCURSOR) m_hIcon;void CFENPEIYUHUISHOUDlg:OnButtonFp() / TODO: Add your control notification handler code here int index=0;int flag =1,m=0,n=0; int count=0; for(m=0;ma;m
18、+) for(n=0;n16;n+) if(array1_aftermn=0) flag = 0; break; if(flag = 0) break; array1_aftermn=1; CString str; int k=0; int i,j; for(i=0;ia;i+) str.Format(%d,array1_afteri0); for(i=0;ia;i+) m_list1_after.InsertItem(i,str); for(j=0;j16;j+) CString str; str.Format(%d,array1_afterij); array2_afterij=array
19、1_afterij; if(array1_afterij=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)
20、; 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_kongxian0) AfxMessageBox(无空闲块!请回收后再使用!); UpdateData(FALSE);void CFENPEIYUHUISHOUDlg:OnButtonHs() / TODO: Add your control notification handler code here UpdateData(TRUE
21、); CHuishouDlg dlg; int num=0; int m=0,n=0; CString str; 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_aftermn=0; for(int i=0;ia;i+) str.Format(%d,array2_afteri0); for(int x=0;xa;x+) m_list2_after.InsertItem(x,str); for(int y=0;y16;y+) CS
22、tring str; str.Format(%d,array2_afterxy); m_list2_after.SetItemText(x,y,str); m_kongxian=m_kongxian+1; for(i=0;im_list1_on.GetItemCount();i+) CString o=m_list1_on.GetItemText(i,0); CString str1; str1.Format(%d,num); if(str1=o) m_list1_on.DeleteItem(i); UpdateData(FALSE);void CFENPEIYUHUISHOUDlg:OnBu
23、ttonInit() / TODO: Add your control notification handler code here UpdateData(TRUE); CInitDlg dlg; int count=0; if(dlg.DoModal()=IDOK) a=dlg.m_it1; b=dlg.m_it2; c=dlg.m_it3; CString str; int m,n; int k=0; for(m=0;ma;m+) for(n=0;n16;n+) array1_beforemn=(int)(rand()%2); array1_aftermn=array1_beforemn;
24、 if(array1_beforemn=0) count+; m_kongxian=count; str.Format(%d,array1_beforem0); for(m=0;ma;m+) m_list1_before.InsertItem(m,str); for(n=0;n16;n+) CString str; str.Format(%d,array1_beforemn); 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