合肥工业大学操作系统课程设计 动态分区分配存储管理java版.docx
《合肥工业大学操作系统课程设计 动态分区分配存储管理java版.docx》由会员分享,可在线阅读,更多相关《合肥工业大学操作系统课程设计 动态分区分配存储管理java版.docx(62页珍藏版)》请在冰豆网上搜索。
合肥工业大学操作系统课程设计动态分区分配存储管理java版
课程设计
动态分区分配存储管理
2010年12月
合肥工业大学课程设计任务书
设计
题目
动态分区分配存储管理
成绩
主
要
内
容
动态分区分配存储管理
建立描述内存分配状况的数据结构;
建立描述进程的数据结构;
使用两种方式产生进程:
(a)自动产生,(b)手工输入;
在屏幕上显示内存的分配状况、每个进程的执行情况;
建立分区的分配与回收算法,支持紧凑算法;
时间的流逝可用下面几种方法模拟:
(a)按键盘,每按一次可认为过一个时间单位;(b)响应WM_TIMER;
将一批进程的执行情况存入磁盘文件,以后可以读出并重放;
支持算法:
首次适应算法、循环首次适应算法、最佳适应算法:
最坏适应算法。
指
导
教
师
意
见
该生能按时完成课程设计任务书所规定的程序设计,综合运用所学知识独立分析和解决问题的能力。
程序设计方案。
论文论述,文理,格式。
程序运行结果。
程序验收时回答问题。
签名:
第一章课程设计概述
1.1设计任务:
动态分区分配存储管理
1.2设计要求
建立描述内存分配状况的数据结构;
建立描述进程的数据结构;
使用两种方式产生进程:
(a)自动产生,(b)手工输入;
在屏幕上显示内存的分配状况、每个进程的执行情况;
建立分区的分配与回收算法,支持紧凑算法;
时间的流逝可用下面几种方法模拟:
(a)按键盘,每按一次可认为过一个时间单位;(b)响应WM_TIMER;
将一批进程的执行情况存入磁盘文件,以后可以读出并重放;
支持算法:
首次适应算法、循环首次适应算法、最佳适应算法:
最坏适应算法。
1.3设计目的
旨在让我们更好的了解动态分区管理方面的知识.
第二章原理及算法描述
2.1动态分区分配算法原理
首次适应算法
*算法概述:
分配内存时,从链首开始顺序查找,找到满足的空闲分区则划出空间分配,余下的空闲空间仍保留在空闲链表中
*实现方法:
分配时从数组第一个元素开始比较,若符合条件则将该元素减去对应作业的值
循环首次适应算法
*算法概述:
由首次适应算法演变,只是每次分配改为由上一次找到的空闲分区开始查找
*实现方法:
在首次适应算法的基础上增加一个值用于记录找到的空闲分区的位置
最佳适应算法
*算法概述:
每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业
*实现方法:
我们决定每次分配先把空闲分区按从小到大的顺序排列,然后将第一个匹配分区分配给作业
最坏适应算法
*算法概述:
每次为作业分配内存时,总是挑选一个最大的空闲分区分割给作业使用
*实现方法:
算法与最佳适应算法几乎相同,仅在排序时把空闲分区表按从大到小的顺序排列,所以未作详细注释
回收分区
当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链(表)中找到相应的插入点,此时可能出现以下四种情况之一;
1)回收区与插入点的前一个空闲分区F1相邻接,此时应将回收区与插入点的前一分区合并,不必为回收区分配新表项,而只需修改其前一分区F1的大小.
2)回收分区与插入点的后一空闲分区F2相邻接,此时也可将两分区合并,形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和.
3)回收区同时与插入点的前,后两个分区邻接,此时将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和.
4)回收区既不与F1相邻接,又不与F2邻接.这时应为回收区单独建立一新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置.
紧凑算法
通过移动内存中的作业的位置,以把原来多个分散的小分区拼接成一个大分区的方法.
第三章开发环境
此程序是本人利用JAVA语言在一种JCreator的开发环境中实现的
第四章重要算法和设计思路描述
4.1设计首次适应算法
首先从内存分区的状态中找到空闲分区,若无空闲分区则不进行后面的运算,直接弹出对话框"内存中无空闲分区".
把作业所需空间的大小与按始址大小,与各个空闲分区进行比较,如果某分区大小合适,把该分区一分为二,前部为已经分配出去的分区,后者为剩余的分区,然后对内存情况进行更新,每次分区小于作业,将指示不符合次数的n加一,如果不符合次数为空闲分区数组长度,说明找遍空闲分区都无符合项,最后对作业数组进行更新,把已运行的作业去除.
4.2设计循环首次适应算法
同样根据内存分区的状态中找到空闲分区数组,令x指向上次找到空闲分区的下一个空闲分区,比较方法与首次适应算法相比,仅在此改为用x指示空闲分区在数组中的位置,每次查找空闲分区,都是从x后面那个分区开始查询,如果某分区大小合适,把该分区一分为二,前部为已经分配出去的分区,后者为剩余的分区,然后对内存情况进行更新,每次分区小于作业,将指示不符合次数的n加一,到了数组末尾后再次进行循环回到数组头,一直寻找到上次所分配的位置,转为从首位开始查找后只比较到上一次找到的匹配分区,以保证循环可结束.如果不符合次数为空闲分区数组长度,说明找遍空闲分区都无符合项,最后对作业数组进行更新,把已运行的作业去除.
4.3设计最佳适应算法和最坏适应算法
最佳适应算法的实质就是对内存分区数组进行排序后,利用首次适应算法
最坏适应算法的实质也是对内存分区数组排序后,进行首次适应算法,只不过它与最佳适应算法排序的方向刚好相反
4.4设计分区回收算法
对内存分区状态进行查找,若回收区与插入点的前一个空闲分区F1相邻接,此时应将回收区与插入点的前一分区合并,不必为回收区分配新表项,而只需修改其前一分区F1的大小.若回收分区与插入点的后一空闲分区F2相邻接,此时也可将两分区合并,形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和.若回收区同时与插入点的前,后两个分区邻接,此时将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和.若回收区既不与F1相邻接,又不与F2邻接.这时应为回收区单独建立一新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置
4.5设计紧凑算法
同样对内存分区状态进行查找,若存在空闲分区,对分区数组,把已分配的数组的位置进行移动,使已分配的分区全部相邻,这样得到的最后剩下的一个大分区就是可以分配的分区啦.
第五章程序实现---数据结构
classmemory{
privateintm1;//分区的序号
privateintm2;//分区的大小
privateintm3;//分区的起始地址
privateintm4;//是否已分配的标志
}这是定义的内存分区的结构
classprocess
{
privateintxuhao;//作业序号
privateintkongjian;//作业运行所需的空间
}这是定义的作业的结构
第六章程序实现---程序清单
importjava.awt.event.*;
importjavax.swing.*;
importjava.awt.*;
importjava.io.*;
importjava.util.*;
publicclassalgorithm
{
privateJFrameframe;
privateJTextPanememory;
privateJTextPaneprocess;
privatememorydatamd;
privateprocessdatapd;
privateintfitIndex=-1;
privateintselect;
privateJTextFieldinputField;
privateJFrameinputFrame;
publicvoidgo(){
frame=newJFrame("动态分区");
JPanelmainPanel=newJPanel();
JPanelprintPanel=newJPanel();
printPanel.setLayout(newGridLayout(2,1));
memory=newJTextPane();
process=newJTextPane();
JScrollPaneScrollerM=newJScrollPane(memory);
ScrollerM.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
ScrollerM.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
JScrollPaneScrollerP=newJScrollPane(process);
ScrollerP.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
ScrollerP.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
printPanel.add(ScrollerM);
printPanel.add(ScrollerP);
JMenuBarmenuBar=newJMenuBar();
JMenufileMenu=newJMenu("文件");
JMenudataMenu=newJMenu("数据");
JMenuFPMenu=newJMenu("分配");
JMenuHSMenu=newJMenu("回收");
JMenuJCMenu=newJMenu("紧凑");
JMenuItemFileItemM=newJMenuItem("输出内存数据");
JMenuItemFileItemP=newJMenuItem("输出作业数据");
JMenuItemMemoryItem=newJMenuItem("读入内存数据");
JMenuItemProcessItem=newJMenuItem("读入作业数据");
JMenuItemrandomdataItemM=newJMenuItem("随机内存数据");
JMenuItemrandomdataItemP=newJMenuItem("随机作业数据");
JMenuItemfenpeiItem=newJMenuItem("分配");
JMenuItemhuishouItem=newJMenuItem("回收");
JMenuItemjinchouItem=newJMenuItem("紧凑");
FileItemM.addActionListener(newOutputMemoryListener());
FileItemP.addActionListener(newOutputProcessListener());
MemoryItem.addActionListener(newInputMemoryListener());
ProcessItem.addActionListener(newInputProcessListener());
randomdataItemM.addActionListener(newrandomMemoryListener());
randomdataItemP.addActionListener(newrandomProcessListener());
fenpeiItem.addActionListener(newfenpeiListener());
huishouItem.addActionListener(newhuishouListener());
jinchouItem.addActionListener(newjinchouListener());
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(jinchouItem);
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);
}
publicclassrandomMemoryListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventac){
md=newmemorydata();
print.printM(md.m,memory);
}
}
publicclassrandomProcessListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventac){
inputFrame=newJFrame();
JPanelinputPanel=newJPanel();
JButtonsendButton=newJButton("确认");
sendButton.addActionListener(newSendButtonListener3());
inputField=newJTextField(10);
inputPanel.add(inputField);
inputPanel.add(sendButton);
inputFrame.getContentPane().add(BorderLayout.CENTER,inputPanel);
inputFrame.setSize(200,100);
inputFrame.setLocationRelativeTo(null);
inputFrame.setVisible(true);
}
}
publicclassOutputMemoryListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventac){
JFileChooserfileOpen=newJFileChooser();
fileOpen.showOpenDialog(frame);
MyFile.outputMemorydata(md,fileOpen.getSelectedFile());
}
}
publicclassOutputProcessListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventac){
JFileChooserfileOpen=newJFileChooser();
fileOpen.showOpenDialog(frame);
MyFile.outputProcessdata(pd,fileOpen.getSelectedFile());
}
}
publicclassInputMemoryListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventac){
JFileChooserfileOpen=newJFileChooser();
fileOpen.showOpenDialog(frame);
md=newmemorydata(MyFile.inputMemorydata(fileOpen.getSelectedFile()));
print.printM(md.m,memory);
}
}
publicclassInputProcessListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventac){
JFileChooserfileOpen=newJFileChooser();
fileOpen.showOpenDialog(frame);
pd=newprocessdata(MyFile.inputProcessdata(fileOpen.getSelectedFile()));
print.printP(pd.p,process);
}
}
publicclassfenpeiListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventac){
fenpeiProcess();
}
}
publicclasshuishouListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventac){
if(!
memorydata.huishou(md.m))
{
JOptionPane.showMessageDialog(frame,"内存中无可回收分区");
return;
}
waitinput();
}
}
publicclassjinchouListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventac){
if(!
memorydata.kongxian(md.m))
{
JOptionPane.showMessageDialog(frame,"内存中分区全被分配,无空闲分区");
return;
}
jincou();
}
}
publicclassSendButtonListener3implementsActionListener{
publicvoidactionPerformed(ActionEventev){
intprocessmount=Integer.parseInt(inputField.getText());
pd=newprocessdata(processmount);
print.printP(pd.p,process);
}
}
publicclassSendButtonListener2implementsActionListener{
publicvoidactionPerformed(ActionEventev){
intselectmemory=Integer.parseInt(inputField.getText());
recycle(selectmemory);
}
}
publicclassSendButtonListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventev){
intselectProcess=Integer.parseInt(inputField.getText());
if(select!
=1&&select!
=2&&select!
=3&&select!
=4)
{
JOptionPane.showMessageDialog(inputFrame,"请选择一种分配方法");
return;
}
if(selectProcess>pd.p.length)
{
JOptionPane.showMessageDialog(inputFrame,"输入错误");
return;
}
if(select==1)
{
FirstFit(selectProcess);
}elseif(select==2)
{
fitIndex=NextFit(selectProcess,fitIndex);
}elseif(select==3)
{
BestFit(selectProcess);
}elseif(select==4)
{
WorstFit(selectProcess);
}
}
}
publicclassb1ButtonListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventev){
select=1;
}
}
publicclassb2ButtonListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventev){
select=2;
}
}
publicclassb3ButtonListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventev){
select=3;
}
}
publicclassb4ButtonListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventev){