合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc

上传人:文库蛋蛋多 文档编号:3937102 上传时间:2023-03-28 格式:DOC 页数:39 大小:218.50KB
返回 下载 相关 举报
合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc_第1页
第1页 / 共39页
合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc_第2页
第2页 / 共39页
合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc_第3页
第3页 / 共39页
合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc_第4页
第4页 / 共39页
合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc》由会员分享,可在线阅读,更多相关《合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc(39页珍藏版)》请在三一办公上搜索。

1、课 程 设 计设计题目动态分区分配存储管理学生姓名号 学 号指导教师专业班级2010 年 12 月 合肥工业大学课程设计任务书设 计题 目动态分区分配存储管理成绩主要内容动态分区分配存储管理 建立描述内存分配状况的数据结构;l建立描述进程的数据结构;l使用两种方式产生进程:(a)自动产生, (b)手工输入;l在屏幕上显示内存的分配状况、每个进程的执行情况;l建立分区的分配与回收算法,支持紧凑算法;l时间的流逝可用下面几种方法模拟:(a)按键盘,每按一次可认为过一个时间单位; (b) 响应WM_TIMER;l将一批进程的执行情况存入磁盘文件,以后可以读出并重放;l支持算法:首次适应算法、循环首次

2、适应算法、最佳适应算法:最坏适应算法。指导教师意见该生能按时完成课程设计任务书所规定的程序设计,综合运用所学知识独立分析和解决问题的能力 。程序设计方案 。论文论述 ,文理 ,格式 。程序运行结果 。程序验收时回答问题 。 签名: 第一章 课程设计概述1.1 设计任务:动态分区分配存储管理1.2 设计要求建立描述内存分配状况的数据结构;l建立描述进程的数据结构;l使用两种方式产生进程:(a)自动产生, (b)手工输入;l在屏幕上显示内存的分配状况、每个进程的执行情况;l建立分区的分配与回收算法,支持紧凑算法;l时间的流逝可用下面几种方法模拟:(a)按键盘,每按一次可认为过一个时间单位; (b)

3、 响应WM_TIMER;l将一批进程的执行情况存入磁盘文件,以后可以读出并重放;l支持算法:首次适应算法、循环首次适应算法、最佳适应算法:最坏适应算法。1.3 设计目的 旨在让我们更好的了解动态分区管理方面的知识.第二章 原理及算法描述2.1动态分区分配算法原理首次适应算法 * 算法概述:分配内存时,从链首开始顺序查找,找到满足的空闲分区则划出空间分配,余下的空闲空间仍保留在空闲链表中 * 实现方法:分配时从数组第一个元素开始比较,若符合条件则将该元素减去对应作业的值循环首次适应算法 * 算法概述:由首次适应算法演变,只是每次分配改为由上一次找到的空闲分区开始查找 * 实现方法:在首次适应算法

4、的基础上增加一个值用于记录找到的空闲分区的位置最佳适应算法 * 算法概述:每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业 * 实现方法:我们决定每次分配先把空闲分区按从小到大的顺序排列,然后将第一个匹配分区分配给作业最坏适应算法 * 算法概述:每次为作业分配内存时,总是挑选一个最大的空闲分区分割给作业使用 * 实现方法:算法与最佳适应算法几乎相同,仅在排序时把空闲分区表按从大到小的顺序排列,所以未作详细注释回收分区 当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链(表)中找到相应的插入点,此时可能出现以下四种情况之一; 1)回收区与插入点的前一个空闲分区F1相邻

5、接,此时应将回收区与插入点的前一分区合并,不必为回收区分配新表项,而只需修改其前一分区F1的大小. 2)回收分区与插入点的后一空闲分区F2相邻接,此时也可将两分区合并,形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和. 3)回收区同时与插入点的前,后两个分区邻接,此时将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和. 4)回收区既不与F1相邻接,又不与F2邻接.这时应为回收区单独建立一新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置.紧凑算法 通过移动内存中的作业的位置,以把原来多个分散的小分区拼接成一个大分区的方法. 第三章

6、开发环境 此程序是本人利用JAVA 语言在一种JCreator 的开发环境中实现的 第四章 重要算法和设计思路描述 4.1 设计 首次适应算法 首先从内存分区的状态中找到空闲分区, 若无空闲分区则不进行后面的运算,直接弹出对话框内存中无空闲分区. 把作业所需空间的大小与按始址大小,与各个空闲分区进行比较,如果某分区大小合适,把该分区一分为二,前部为已经分配出去的分区,后者为剩余的分区,然后对内存情况进行更新, 每次分区小于作业,将指示不符合次数的n加一, 如果不符合次数为空闲分区数组长度,说明找遍空闲分区都无符合项,最后对作业数组进行更新,把已运行的作业去除. 4.2 设计循环首次适应算法 同

7、样根据内存分区的状态中找到空闲分区数组, 令x指向上次找到空闲分区的下一个空闲分区, 比较方法与首次适应算法相比,仅在此改为用x指示空闲分区在数组中的位置,每次查找空闲分区,都是从x后面那个分区开始查询, 如果某分区大小合适,把该分区一分为二,前部为已经分配出去的分区,后者为剩余的分区,然后对内存情况进行更新, 每次分区小于作业,将指示不符合次数的n加一, 到了数组末尾后再次进行循环回到数组头, 一直寻找到上次所分配的位置, 转为从首位开始查找后只比较到上一次找到的匹配分区,以保证循环可结束. 如果不符合次数为空闲分区数组长度,说明找遍空闲分区都无符合项,最后对作业数组进行更新,把已运行的作业

8、去除.4.3 设计最佳适应算法和最坏适应算法 最佳适应算法的实质就是对内存分区数组进行排序后,利用首次适应算法 最坏适应算法的实质也是对内存分区数组排序后,进行首次适应算法,只不过它与最佳适应算法排序的方向刚好相反4.4 设计分区回收算法 对内存分区状态进行查找,若回收区与插入点的前一个空闲分区F1相邻接,此时应将回收区与插入点的前一分区合并,不必为回收区分配新表项,而只需修改其前一分区F1的大小.若回收分区与插入点的后一空闲分区F2相邻接,此时也可将两分区合并,形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和.若回收区同时与插入点的前,后两个分区邻接,此时将三个分区合并,

9、使用F1的表项和F1的首址,取消F2的表项,大小为三者之和.若回收区既不与F1相邻接,又不与F2邻接.这时应为回收区单独建立一新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置 4.5 设计紧凑算法 同样对内存分区状态进行查找,若存在空闲分区,对分区数组,把已分配的数组的位置进行移动,使已分配的分区全部相邻,这样得到的最后剩下的一个大分区就是可以分配的分区啦.第五章 程序实现-数据结构class memoryprivate int m1;/分区的序号private int m2;/分区的大小private int m3;/分区的起始地址private int m4;/是否已分

10、配的标志 这是定义的内存分区的结构class processprivate int xuhao;/作业序号privateint kongjian;/作业运行所需的空间 这是定义的作业的结构第六章 程序实现-程序清单import java.awt.event.*;import javax.swing.*;import java.awt.*;import java.io.*;import java.util.*;public class algorithmprivate JFrame frame;private JTextPane memory;private JTextPane process;

11、private memorydata md;private processdata pd;private int fitIndex=-1;private int select;private JTextField inputField;private JFrame inputFrame;public void go()frame=new JFrame(动态分区);JPanel mainPanel=new JPanel();JPanel printPanel=new JPanel();printPanel.setLayout(new GridLayout(2, 1);memory=new JTe

12、xtPane();process=new JTextPane();JScrollPane ScrollerM=new JScrollPane(memory);ScrollerM.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);ScrollerM.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);JScrollPane ScrollerP=new JScrollPane(process);Scr

13、ollerP.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);ScrollerP.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);printPanel.add(ScrollerM);printPanel.add(ScrollerP);JMenuBar menuBar=new JMenuBar();JMenu fileMenu=new JMenu(文件);JMenu dataMenu=new

14、JMenu(数据);JMenu FPMenu=new JMenu(分配);JMenu HSMenu=new JMenu(回收);JMenu JCMenu=new JMenu(紧凑);JMenuItem FileItemM=new JMenuItem(输出内存数据);JMenuItem FileItemP=new JMenuItem(输出作业数据);JMenuItem MemoryItem=new JMenuItem(读入内存数据);JMenuItem ProcessItem=new JMenuItem(读入作业数据);JMenuItem randomdataItemM=new JMenuIte

15、m(随机内存数据);JMenuItem randomdataItemP=new JMenuItem(随机作业数据);JMenuItem fenpeiItem=new JMenuItem(分配);JMenuItem huishouItem=new JMenuItem(回收);JMenuItem jinchouItem=new JMenuItem(紧凑);FileItemM.addActionListener(new OutputMemoryListener();FileItemP.addActionListener(new OutputProcessListener();MemoryItem.a

16、ddActionListener(new InputMemoryListener();ProcessItem.addActionListener(new InputProcessListener();randomdataItemM.addActionListener(new randomMemoryListener();randomdataItemP.addActionListener(new randomProcessListener();fenpeiItem.addActionListener(new fenpeiListener();huishouItem.addActionListen

17、er(new huishouListener();jinchouItem.addActionListener(new jinchouListener();fileMenu.add(FileItemM);fileMenu.add(FileItemP);dataMenu.add(MemoryItem);dataMenu.add(ProcessItem);dataMenu.add(randomdataItemM);dataMenu.add(randomdataItemP); FPMenu.add(fenpeiItem); HSMenu.add(huishouItem);JCMenu.add(jinc

18、houItem);menuBar.add(fileMenu);menuBar.add(dataMenu);menuBar.add(FPMenu);menuBar.add(HSMenu);menuBar.add(JCMenu);frame.setJMenuBar(menuBar);frame.getContentPane().add(BorderLayout.CENTER,printPanel);frame.setSize(600,500);frame.setVisible(true);public class randomMemoryListener implements ActionList

19、enerpublic void actionPerformed(ActionEvent ac)md=new memorydata();print.printM(md.m,memory);public class randomProcessListener implements ActionListenerpublic void actionPerformed(ActionEvent ac)inputFrame=new JFrame();JPanel inputPanel=new JPanel();JButton sendButton=new JButton(确认);sendButton.add

20、ActionListener(new SendButtonListener3();inputField=new JTextField(10);inputPanel.add(inputField);inputPanel.add(sendButton);inputFrame.getContentPane().add(BorderLayout.CENTER,inputPanel);inputFrame.setSize(200,100);inputFrame.setLocationRelativeTo(null);inputFrame.setVisible(true);public class Out

21、putMemoryListener implements ActionListenerpublic void actionPerformed(ActionEvent ac)JFileChooser fileOpen=new JFileChooser();fileOpen.showOpenDialog(frame);MyFile.outputMemorydata(md,fileOpen.getSelectedFile();public class OutputProcessListener implements ActionListenerpublic void actionPerformed(

22、ActionEvent ac)JFileChooser fileOpen=new JFileChooser();fileOpen.showOpenDialog(frame);MyFile.outputProcessdata(pd,fileOpen.getSelectedFile();public class InputMemoryListener implements ActionListenerpublic void actionPerformed(ActionEvent ac)JFileChooser fileOpen=new JFileChooser();fileOpen.showOpe

23、nDialog(frame);md=new memorydata(MyFile.inputMemorydata(fileOpen.getSelectedFile();print.printM(md.m,memory);public class InputProcessListener implements ActionListenerpublic void actionPerformed(ActionEvent ac)JFileChooser fileOpen=new JFileChooser();fileOpen.showOpenDialog(frame);pd=new processdat

24、a(MyFile.inputProcessdata(fileOpen.getSelectedFile();print.printP(pd.p,process);public class fenpeiListener implements ActionListenerpublic void actionPerformed(ActionEvent ac)fenpeiProcess();public class huishouListener implements ActionListenerpublic void actionPerformed(ActionEvent ac)if(!memoryd

25、ata.huishou(md.m)JOptionPane.showMessageDialog(frame, 内存中无可回收分区);return;waitinput();public class jinchouListener implements ActionListenerpublic void actionPerformed(ActionEvent ac)if(!memorydata.kongxian(md.m)JOptionPane.showMessageDialog(frame, 内存中分区全被分配,无空闲分区);return;jincou();public class SendBut

26、tonListener3 implements ActionListenerpublic void actionPerformed(ActionEvent ev)int processmount=Integer.parseInt(inputField.getText();pd=new processdata(processmount);print.printP(pd.p,process);public class SendButtonListener2 implements ActionListenerpublic void actionPerformed(ActionEvent ev)int

27、 selectmemory=Integer.parseInt(inputField.getText();recycle(selectmemory);public class SendButtonListener implements ActionListenerpublic void actionPerformed(ActionEvent ev)int selectProcess=Integer.parseInt(inputField.getText();if(select!=1&select!=2&select!=3&select!=4) JOptionPane.showMessageDia

28、log(inputFrame, 请选择一种分配方法); return;if(selectProcesspd.p.length) JOptionPane.showMessageDialog(inputFrame, 输入错误); return;if(select=1)FirstFit(selectProcess);else if(select=2)fitIndex=NextFit(selectProcess,fitIndex);else if(select=3)BestFit(selectProcess);else if(select=4)WorstFit(selectProcess);publi

29、c class b1ButtonListener implements ActionListenerpublic void actionPerformed(ActionEvent ev)select=1;public class b2ButtonListener implements ActionListenerpublic void actionPerformed(ActionEvent ev)select=2;public class b3ButtonListener implements ActionListenerpublic void actionPerformed(ActionEv

30、ent ev)select=3;public class b4ButtonListener implements ActionListenerpublic void actionPerformed(ActionEvent ev)select=4;private void waitinput()inputFrame=new JFrame();JPanel inputPanel=new JPanel();JButton sendButton=new JButton(确认);sendButton.addActionListener(new SendButtonListener2();inputFie

31、ld=new JTextField(10);inputPanel.add(inputField);inputPanel.add(sendButton);inputFrame.getContentPane().add(BorderLayout.CENTER,inputPanel);inputFrame.setSize(200,100);inputFrame.setLocationRelativeTo(null);inputFrame.setVisible(true);private void fenpeiProcess()inputFrame=new JFrame();JRadioButton

32、b1 = new JRadioButton();JRadioButton b2 = new JRadioButton();JRadioButton b3 = new JRadioButton();JRadioButton b4 = new JRadioButton();ButtonGroup group = new ButtonGroup();JPanel intro = new JPanel();JLabel introJl = new JLabel();intro.add(introJl);introJl.setText( 分配算法选择 );inputFrame.add(intro);b1

33、.setText(1、首次适应算法);b2.setText(2、循环首次适应算法);b3.setText(3、最佳适应算法);b4.setText(4、最坏适应算法);b1.addActionListener(new b1ButtonListener();b2.addActionListener(new b2ButtonListener();b3.addActionListener(new b3ButtonListener();b4.addActionListener(new b4ButtonListener();group.add(b1);group.add(b2);group.add(b3

34、);group.add(b4);/ p为第二个JPanelJPanel p = new JPanel();/ 设置第二个JPanel上的jl1 JLabel初始显示信息JLabel jl1 = new JLabel();jl1.setText(输入待分配的作业序号);/ 添加该JLabel到p上p.add(jl1);/ 添加该JPanelinputFrame.add(p);/ p1为第三个Panel,此JPanel由于要显示5个算法的单选键,所以设置为5行的GridLayout布局JPanel p1 = new JPanel();p1.setLayout(new GridLayout(4, 1

35、);p1.add(b1);p1.add(b2);p1.add(b3);p1.add(b4);inputFrame.add(p1);JPanel inputPanel=new JPanel();inputField=new JTextField(5);inputPanel.add(inputField);JButton sendButton=new JButton(确认);sendButton.addActionListener(new SendButtonListener();inputPanel.add(sendButton);inputFrame.add(inputPanel);input

36、Frame.setLayout(new FlowLayout();/ 设置窗口大小,inputFrame.setSize(400, 220);/ 大小不可更改inputFrame.setLocation(300, 400);/ 显示inputFrame.setVisible(true);/ 设置窗口右上角的关闭按钮事件为结束程序inputFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);/* * * 首次适应算法 * 算法概述:分配内存时,从链首开始顺序查找,找到满足的空闲分区则划出空间分配,余下的空闲空间仍保留在空闲链表中 * 实现方法

37、:分配时从数组第一个元素开始比较,若符合条件则将该元素减去对应作业的值 * */privatevoid FirstFit(int selectProcess)print.printM(md.m,memory);/显示当前内存分区状况memory free=memorydata.Free(md.m);/对当前内存分区获取空闲分区的信息print.printF(free,memory);/显示内存空闲分区的状况print.insert(首次适应算法,memory);int xuhao=selectProcess-1;if (free.length = 0)/ 若无空闲分区则不进行后面的运算JOpt

38、ionPane.showMessageDialog(frame, 内存中无空闲分区);else int n=0;/指示分区与作业不符合的次数for(int j=0;jfree.length;j+)/与各个空闲分区进行比较print.insert(进程号+pd.pxuhao.getxuhao()+ 所需分区大小为+pd.pxuhao.getkongjian()+ 与分区号为+freej.getm1()+的空闲分区 +freej.getm2()+ 比较,memory);if(pd.pxuhao.getkongjian()freej.getm2()/分区大于作业print.insert(符合,分配,

39、memory);memory nb=new memorymd.m.length+1;int ni=freej.getm1();if(freej.getm1()=1)/如果该空闲分区是内存表头/把该分区一分为二,前部为已经分配出去的分区,后者为剩余的分区nb0=new memory(1,pd.pxuhao.getkongjian(),0,1);nb1=new memory(2,freej.getm2()-pd.pxuhao.getkongjian(),pd.pxuhao.getkongjian(),0);/把nb构造成经过分配后的内存分区数组for(int k=2;knb.length;k+)n

40、bk=new memory(nbk-1.getm1()+1,md.mk-1.getm2(),nbk-1.getm2()+nbk-1.getm3(),md.mk-1.getm4();md.m=nb;print.printM(md.m,memory);free= memorydata.Free(md.m);print.printF(free,memory);else/如果该空闲分区不是内存表头for(int k=0;kni;k+)nbk=new memory(md.mk.getm1(),md.mk.getm2(),md.mk.getm3(),md.mk.getm4();/把该分区一分为二,前部为已

41、经分配出去的分区,后者为剩余的分区nbni-1.setm2(pd.p0.getkongjian();nbni-1.setm4(1);/设置标识此分区已分配nbni=new memory(nbni-1.getm1()+1,freej.getm2()-pd.pxuhao.getkongjian(),nbni-1.getm2()+nbni-1.getm3(),0);for(int k=ni+1;knb.length;k+)nbk=new memory(nbk-1.getm1()+1,md.mk-1.getm2(),nbk-1.getm2()+nbk-1.getm3(),md.mk-1.getm4();md.m=nb;print.printM(md.m,memory);free = memorydata.Free(md.m); print.printF(free,memory);break;else if(pd.pxuhao.getkongjian()=freej.getm2() /分区等于作业print.insert( 符合,分配,memory);md.mfreej.getm1()-1.setm4(1);/把此分区标志位已分配print.printM(md.m,memory);

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

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号