实现内存动态分区分配(首次算法)_第1页
实现内存动态分区分配(首次算法)_第2页
实现内存动态分区分配(首次算法)_第3页
实现内存动态分区分配(首次算法)_第4页
实现内存动态分区分配(首次算法)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实 验 报 告 课程名称: 计算机操作系统 实验名称:用首次适应算法实现内存动态分区分配 任课教师: 霍 林林 专 业: 计算机科学与技术 班 级: 学 号: _姓 名:蓝冠恒_ _ 完成日期: 2009年10月15日 一、实验目的:了解和掌握操作系统的动态分区分配的基本原理和实现方法,包括内存的动态分配和内存的回收。二、主要实验内容及要求:用首次适应算法编程实现对操作系统内存动态分区分配,主要功能包括分配内存和回收内存。三、设计思路:1.内存分配:(1)若非法输入或请求内存过大或内存分配块数达到上限,则提示相关信息,需重新输入或等待。(2) 若输入数据合法,则按首次适应算法分配内存,将分配的

2、内存地址和大小存BusyTable(内存分配表)中;并在SpareTable(内存空闲管理表)修改剩余内存地址和大小,若是首次分配,需要同时建立这两张表。(3)将刚分配的内存地址写入consumeCombo(等待消费的内存地址下拉框)。2.消费内存(释放内存):(1)从consumeCombo选出可消费内存地址,进行消费。(2)从consumeCombo中删除刚消费的内存地址,并将该地址写入recoverCom(等待回收的内存地址下拉框)。3.回收内存:(1)若回收区同时与插入点的前、后两分区邻接,将三个分区合并,合并后分区地址为此插入点的前一分区地址,大小为三个分区大小之和;然后从Spare

3、Table表中去掉分区前后一分区的表项。(2)若回收区与插入点的前分区邻接,则将前分区与回收分区合并,合并后的分区地址为此前前一分区的内存地址,大小为合并前两者大小之和,SpareTable表长度不变。(3) 若回收区与插入点的后分区邻接,则将后分区与回收分区合并,合并后的分区地址为回收的内存地址,大小为合并前两者大小之和,SpareTable表长度不变。(4)若都不满足上述情况,这是应在SpareTable表插入点处单独建立一个表项,填写回收的地址和大小。(5)执行以上任何一步后,立即从BusyTable中删除刚回收的内存所在的表项,同时从recoverCombo中删除刚回收的内存的地址。(

4、6)显示回收过程以及回收的内存地址和大小、合并后的内存地址和大小的信息。四、实验结果与结论:(经调试正确的源程序和程序的运行结果)编程员:蓝冠恒程序源代码:package myPackage;import org.eclipse.swt.widgets.Display;import org.eclipse.swt.widgets.Shell;import org.eclipse.swt.widgets.Composite;import org.eclipse.swt.SWT;import org.eclipse.swt.widgets.Label;import org.eclipse.swt.

5、widgets.Text;import org.eclipse.swt.widgets.Button;import org.eclipse.swt.widgets.Combo;import org.eclipse.swt.events.SelectionAdapter;import org.eclipse.swt.events.SelectionEvent;import com.swtdesigner.SWTResourceManager;public class MemoryManagement protected Shell shell;private Composite mainComp

6、osite;private Composite firstComposite;private Label requestLabel;private Text requestText;private Button requestOK;private Label consumeLabel;private Combo consumeCombo;private Button consumeOK;private Label recoverLabel;private Combo recoverCombo;private Button recoverOK;private Label informationL

7、abel;private Text informationText;private Label CanUseLabel;private final int MinLimitSize=200; SpareNode SpareTable; private static int SpareTLength=0; BusyNode BusyTable; private static int BusyTLength=0; private Text CanUseText; private Text HaveUseText; private Label HaveUseLabel; private final

8、static int MaxProcessNum=100; public class SpareNodeprivate int Address;private int Size;protected void Copy(SpareNode SN)this.Address=SN.Address;this.Size=SN.Size;protected SpareNode(int address, int size) super();Address = address;Size = size;protected int getAddress() return Address;protected voi

9、d setAddress(int address) Address = address;protected int getSize() return Size;protected void setSize(int size) Size = size;public class BusyNodeprivate int Address;private int Size;private boolean ISConsume;protected BusyNode(int address, int size) super();Address = address;Size = size;ISConsume=f

10、alse;protected void Copy(BusyNode BN)this.Address=BN.Address;this.Size=BN.Size;this.ISConsume=BN.ISConsume;protected int getAddress() return Address;protected void setAddress(int address) Address = address;protected boolean getIsISConsume() return ISConsume;protected void setISConsume(boolean consum

11、e) ISConsume = consume;protected int getSize() return Size;protected void setSize(int size) Size = size;public static void main(String args) try MemoryManagement window = new MemoryManagement();window.open(); catch (Exception e) e.printStackTrace();/*Open the window.*/public void open() Display disp

12、lay = Display.getDefault();createContents();shell.open();shell.layout();while (!shell.isDisposed() if (!display.readAndDispatch() display.sleep();/* Create contents of the window.*/protected void createContents() shell = new Shell();shell.setForeground(SWTResourceManager.getColor(SWT.COLOR_GREEN);sh

13、ell.setSize(680, 418);shell.setText(操作系统内存管理);SpareTable=new SpareNodeMaxProcessNum+1;SpareTable0=new SpareNode(0,20000);SpareTLength=1;BusyTable=new BusyNodeMaxProcessNum;mainComposite = new Composite(shell, SWT.NONE);mainComposite.setBounds(0, 0, 664, 382);firstComposite = new Composite(mainCompos

14、ite, SWT.BORDER);firstComposite.setBounds(0, 0, 295, 382);requestLabel = new Label(firstComposite, SWT.NONE);requestLabel.setForeground(SWTResourceManager.getColor(0, 0, 255);requestLabel.setFont(SWTResourceManager.getFont(微软雅黑, 12, SWT.NORMAL);requestLabel.setBounds(0, 25, 97, 27);requestLabel.setT

15、ext(申请资源大小);requestText = new Text(firstComposite, SWT.BORDER);requestText.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW);requestText.setFont(SWTResourceManager.getFont(微软雅黑, 12, SWT.NORMAL);requestText.setBounds(103, 26, 104, 27);requestOK = new Button(firstComposite,

16、SWT.NONE);requestOK.setBackground(SWTResourceManager.getColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW);requestOK.addSelectionListener(new SelectionAdapter() public void widgetSelected(SelectionEvent e) int size = 0;boolean Y=false;if(BusyTLength=MaxProcessNum)informationText.setText();informationText.inse

17、rt(进程数量达到上限,不能再申请!);else try size= Integer.parseInt(requestText.getText(); requestText.setText(); catch(Exception ex) Y= true; informationText.setText(); informationText.insert(输入有误,请重新输入(整数)!n); if(!Y) AllocateResources(size); );requestOK.setBounds(229, 23, 52, 29);requestOK.setText(OK);consumeLabe

18、l = new Label(firstComposite, SWT.NONE);consumeLabel.setForeground(SWTResourceManager.getColor(0, 0, 255);consumeLabel.setFont(SWTResourceManager.getFont(微软雅黑, 12, SWT.NORMAL);consumeLabel.setBounds(0, 59, 97, 27);consumeLabel.setText(消费资源地址);consumeCombo = new Combo(firstComposite, SWT.READ_ONLY);c

19、onsumeCombo.setFont(SWTResourceManager.getFont(微软雅黑, 10, SWT.NORMAL);consumeCombo.setBounds(103, 61, 104, 27);consumeOK = new Button(firstComposite, SWT.NONE);consumeOK.addSelectionListener(new SelectionAdapter() public void widgetSelected(SelectionEvent e) String str=consumeCombo.getText();informat

20、ionText.setText();tryint ConsumeAddress=Integer.parseInt(str);Consume( ConsumeAddress);catch(Exception ex);consumeOK.setBounds(229, 58, 52, 27);consumeOK.setText(OK);recoverLabel = new Label(firstComposite, SWT.NONE);recoverLabel.setForeground(SWTResourceManager.getColor(0, 0, 255);recoverLabel.setF

21、ont(SWTResourceManager.getFont(微软雅黑, 12, SWT.NORMAL);recoverLabel.setBounds(0, 99, 97, 27);recoverLabel.setText(回收资源地址);recoverCombo = new Combo(firstComposite, SWT.READ_ONLY);recoverCombo.setForeground(SWTResourceManager.getColor(0, 255, 0);recoverCombo.setFont(SWTResourceManager.getFont(微软雅黑, 10,

22、SWT.NORMAL);recoverCombo.setBounds(103, 101, 104, 27);recoverOK = new Button(firstComposite, SWT.NONE);recoverOK.addSelectionListener(new SelectionAdapter() public void widgetSelected(SelectionEvent e) String str=recoverCombo.getText();boolean IsNull=false;int RecoverAddress = 0;informationText.setT

23、ext();try RecoverAddress=Integer.parseInt(str); catch(Exception ex)IsNull=true;if(!IsNull)Recover(RecoverAddress););recoverOK.setBounds(229, 101, 52, 27);recoverOK.setText(OK);informationLabel = new Label(firstComposite, SWT.CENTER);informationLabel.setForeground(SWTResourceManager.getColor(SWT.COLO

24、R_RED);informationLabel.setFont(SWTResourceManager.getFont(微软雅黑, 12, SWT.NORMAL);informationLabel.setBounds(0, 142, 253, 27);informationLabel.setText(操作信息提示);informationText = new Text(firstComposite, SWT.BORDER | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL | SWT.CANCEL);informationText.setForegroun

25、d(SWTResourceManager.getColor(255, 0, 0);informationText.setFont(SWTResourceManager.getFont(微软雅黑, 10, SWT.NORMAL);informationText.setBounds(10, 175, 271, 193);CanUseLabel = new Label(mainComposite, SWT.HORIZONTAL | SWT.SHADOW_IN | SWT.CENTER);CanUseLabel.setBackground(SWTResourceManager.getColor(SWT

26、.COLOR_CYAN);CanUseLabel.setForeground(SWTResourceManager.getColor(0, 0, 255);CanUseLabel.setFont(SWTResourceManager.getFont(微软雅黑, 12, SWT.NORMAL);CanUseLabel.setBounds(624, 9, 40, 167);CanUseLabel.setText(可n用n内n存n状n态n信n息);CanUseText = new Text(mainComposite, SWT.BORDER | SWT.READ_ONLY | SWT.H_SCROL

27、L | SWT.V_SCROLL | SWT.CANCEL);CanUseText.setForeground(SWTResourceManager.getColor(0, 0, 255);CanUseText.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE);CanUseText.setBounds(310, 10, 316, 167);HaveUseText = new Text(mainComposite, SWT.BORDER | SWT.READ_ONLY | SWT.H_SCROLL | SWT.V_SCROLL

28、| SWT.CANCEL);HaveUseText.setForeground(SWTResourceManager.getColor(0, 0, 205);HaveUseText.setBackground(SWTResourceManager.getColor(SWT.COLOR_WHITE);HaveUseText.setBounds(310, 183, 316, 189);HaveUseLabel = new Label(mainComposite, SWT.CENTER);HaveUseLabel.setBackground(SWTResourceManager.getColor(S

29、WT.COLOR_YELLOW);HaveUseLabel.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN);HaveUseLabel.setFont(SWTResourceManager.getFont(微软雅黑, 12, SWT.NORMAL);HaveUseLabel.setBounds(624, 183, 40, 188);HaveUseLabel.setText(内n存n占n用n情n况n信n息); /createContentspublic void AllocateResources(int size)b

30、oolean success=false;if(SpareTLength=1) int AddressTemp=SpareTable0.getAddress(); int SizeTemp=SpareTable0.getSize(); if(SizeTempsize & SizeTemp-sizeMinLimitSize) AddBusyTable(AddressTemp, size); SpareTable0.setAddress(AddressTemp+size); SpareTable0.setSize(SizeTemp-size); success=true; if(SizeTemps

31、ize & SizeTemp-size=MinLimitSize) AddBusyTable(AddressTemp, SizeTemp); SpareTable0.setAddress(AddressTemp+SizeTemp); SpareTable0.setSize(0); success=true; else for(int a=0;asize & NewSize-sizeMinLimitSize) int NewAddr=SpareTablea.getAddress(); AddBusyTable(NewAddr, size); SpareTablea.setAddress(NewA

32、ddr+size); SpareTablea.setSize(NewSize-size); success=true; break; if(NewSizesize & NewSize-size=MinLimitSize) AddBusyTable(SpareTablea.getAddress(), SpareTablea.getSize(); for(int b=a;bSpareTLength-1;b+) SpareTableb.Copy(SpareTableb+1); SpareTLength-; success=true; break; /for/elseif(!success)infor

33、mationText.setText();informationText.insert(申请内存大小:+size+n);informationText.insert(内存分配失败!n);elsesuccess=false;informationText.setText();informationText.insert(申请内存大小:+size+n);informationText.insert(内存分配成功!n);ShowCanUseInfor();ShowHaveUseInfor();public void Consume(int ConsumeAddress)String s=String

34、.valueOf(ConsumeAddress);for(int k=0;kBusyTLength;k+)if(BusyTablek.getAddress()=ConsumeAddress)BusyTablek.setISConsume(true);consumeCombo.remove(s);recoverCombo.add(s);informationText.setText();informationText.insert(资源运转完毕!n);informationText.insert(释放内存地址:+ConsumeAddress+n);informationText.insert(释

35、放内存大小:+BusyTablek.getSize()+KBn);ShowHaveUseInfor();break;public void Recover(int RecoverAddress)int RecoverSize = 0;for(int y=0;yBusyTLength;y+)/找出要回复的内存的大小if(BusyTabley.getAddress()=RecoverAddress)RecoverSize=BusyTabley.getSize();break;int FistAddress=SpareTable0.getAddress();if(RecoverAddress0;q-

36、)SpareTableq.Copy(SpareTableq-1); SpareTable0.setAddress(RecoverAddress); SpareTable0.setSize(RecoverSize); recoverCombo.remove(String.valueOf(RecoverAddress); informationText.setText(); informationText.insert(回收内存地址:+RecoverAddress+ 大小:+RecoverSize+KBn); informationText.insert(新的内存地址:+RecoverAddres

37、s+ 大小:+RecoverSize+KBn); ReduceBusyTable(RecoverAddress); else/else1 for(int x=1;xSpareTLength;x+)int Xaddr=SpareTablex.getAddress();if(RecoverAddressXaddr)/if1int XSize=SpareTablex.getSize();if(Xaddr-RecoverSize=RecoverAddress & RecoverAddress-SpareTablex-1.getSize()=SpareTablex-1.getAddress()int N

38、ewSize=SpareTablex-1.getSize();SpareTablex-1.setSize(XSize+RecoverSize+NewSize);for(int z=x;zx;q-)SpareTableq.Copy(SpareTableq-1);SpareTablex.setAddress(RecoverAddress);SpareTablex.setSize(RecoverSize);recoverCombo.remove(String.valueOf(RecoverAddress);informationText.setText();informationText.inser

39、t(回收内存地址:+RecoverAddress+ 大小:+RecoverSize+KBn);informationText.insert(新的分区如下:n);informationText.insert(新的内存地址:+RecoverAddress+ 大小:+RecoverSize+KBn);ReduceBusyTable(RecoverAddress);break;/if1 /else1ShowCanUseInfor();ShowHaveUseInfor();public void AddBusyTable(int Address,int Size) informationText.setText();if(BusyTLength=0)BusyTable0=new BusyNode( Address,Size);BusyTable0.setISConsume(false);BusyTLength=1;consumeCombo.add(String.valueOf(Address);else /else1if(Address0;w-) BusyTablew.Copy(BusyTablew-1); Bu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论