1、操作系统实验 内存管理操作系统实验报告 计算机学院 (院、系) 网络工程 专业 082 班 组 课学号 20 姓名 区德智 实验日期 教师评定 实验四 内存管理一、实验目的通过实验使学生了解可变式分区管理使用的主要数据结构,分配、回收的主要技术,了解最优分配、最坏分配、最先分配等分配算法。基本能达到下列具体的目标:1、 掌握初步进程在内存中的映像所需要的内存需求。2、 内存的最先分配算法首先实现,再逐步完成最优和最坏的分配算法。二、实验内容1、 在进程管理的基础上实现内存分配。2、 运用java实现整体的布局与分配内存时的动态图画显示。三、实验步骤 1.构建一个Process的对象类,每分配一
2、次内存就实例化一个对象。这对象包含分配内存的名字,内存大小(byte),绘画的起点像素,绘画的终点像素。 主要代码:public class Process private String name; private int size; private int beginPx; private int endPx; public int getBeginPx() return beginPx; public void setBeginPx(int beginPx) this.beginPx = beginPx; public int getEndPx() return endPx; public
3、 void setEndPx(int endPx) this.endPx = endPx; public String getName() return name; public void setName(String name) this.name = name; public int getSize() return size; public void setSize(int size) this.size = size; 2.根据用户输入而分配内存的大小,若输入的大小大于目前可分配内存的大小则拒绝分配操作,否则增加一个新进程入链表中,并在已分配表中增加进程的名字,更新剩余内存大小。分配内
4、存流程图:绘画paint()方法的主要代码:public void paint(Graphics g) super.paint(g);/刷新页面 Color c=g.getColor(); g.setColor(Color.WHITE); g.fillRect(20, 400, 450, 50); /若已有分配内存 if(myList.size()!=0) g.setColor(Color.BLACK); /从已分配的内存中循环获取像素起点位置和像素的大小 for(int i=0;imyList.size();i+) g.fillRect(myList.get(i).getBeginPx(),
5、 400,myList.get(i).getEndPx()-myList.get(i).getBeginPx(), 50); g.setColor(c); 显示已分配进程名字的showListName()方法主要代码: public void showListName(ArrayList myList) Process newProcess=null; showList.removeAll(); for(int i=0;i(m*1024*1024+k*1024+b) JOptionPane.showMessageDialog(null,所剩内存不足,警告对话框,JOptionPane.WARN
6、ING_MESSAGE); else String name=JOptionPane.showInputDialog(null,输入进程名字,输入对话框,JOptionPane.PLAIN_MESSAGE);/获得分配内存名字 Process newProcess=new Process(); newProcess.setName(name); newProcess.setSize(Integer.parseInt(mbField.getText()*1024*1024+Integer.parseInt(kbField.getText()*1024+Integer.parseInt(byteF
7、ield.getText(); size=newProcess.getSize(); fsize=size;/把size转成float类型计算,小数计算必须要化成整形 px=(int)(450/p*fsize);/获得像素的长度 newProcess.setBeginPx(index); newProcess.setEndPx(index+px); index=index+px; myList.add(newProcess);/把进程添加到链表中 /绘图 repaint(); showListName(myList);/显示所用进程的名字 /三个输入框清空 mbField.setText();
8、 kbField.setText(); byteField.setText(); /更改剩余内存值 int leftSize=(m*1024*1024+k*1024+b)-size; m=leftSize/(1024*1024); k=leftSize/1024%1024; b=leftSize%1024; notice2.setText(可分配最大内存:+m+MB +k+KB +b+Byte); 输入要分配的内存大小:图1 分配内存输入名字:图2 输入名字分配两个内存:图3 分配两个内存3.用户选择已分配的内存名字而回收相应的内存模块: 回收流程图:回收内存主要代码:public class
9、 CollectMemoryListener implements ActionListener public void actionPerformed(ActionEvent arg0) int num=showList.getSelectedIndex();/获得被选中的序号 /更新剩余内存值 int releaseSize=myList.get(num).getSize(); m=m+releaseSize/(1024*1024); k=k+releaseSize/1024%1024; b=b+releaseSize%1024; notice2.setText(可分配最大内存:+m+MB
10、 +k+KB +b+Byte); /从链表中删去该进程 myList.remove(num); showListName(myList); repaint(); 回收第一个内存后,绘图更新,剩余内存更新:图4 回收第一个已分配的内存重新整合内存主要代码:public class RefreshMemoryListener implements ActionListener public void actionPerformed(ActionEvent e) if(myList.size()!=0) index=20; for(int i=0;imyList.size();i+) size=my
11、List.get(i).getSize(); fsize=size;/把size转成float类型计算 px=(int)(450/p*fsize);/获得像素的长度 myList.get(i).setBeginPx(index); myList.get(i).setEndPx(index+px); index=index+px; repaint(); 图5 重新整合内存四、实验总结通过本次实验,加深了对内存管理的理解。并掌握了单链表应用的重要方法。运用java的GUI为客户端整体布局,并且运用paint()方法来表示内存分配的状态。一个已分配的内存表示一个对象,所有对象都存放在链表中,当回收内存时则把改对象在链表中移除。每次绘图都是根据链表中存在的对象而绘画。由于对象中存放有起点的像素和终点的像素,因而实现起来简单。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1