⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bestmemalloc.java

📁 用JAVA实现的模拟内存管理程序
💻 JAVA
字号:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.LinkedList;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextArea;

/*
 * Created on 2004-5-19 
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */

/**
 * @author 李秋军(010200)
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class BestMemAlloc extends JPanel implements Runnable
{
	LinkedList memList = new LinkedList(); //用于存放整个内存信息的链表
	LinkedList spaceMemList = new LinkedList(); //用于存放空闲内存信息的链表
	MemAreaInfo memAreaInfo;
	JTextArea text = new JTextArea(20, 12);
	JButton bt = new JButton("最佳适应算法演示");
	private boolean controlFlag = false;
	private boolean stopFile = false;
	PrintStream ps;

	public BestMemAlloc()
	{
		init();
		bt.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0)
			{
				if (!controlFlag)
				{
					text.setText("");
					memList.clear();
					spaceMemList.clear();
					stopFile = true;
					init();
					controlFlag = true;
					repaint();
				}
			}
		});

		this.add(text); //将文本区加入面板
		this.add(bt); //将按钮加入面板

	}

	//	初始化链表和文件
	void init()
	{
		memAreaInfo = new MemAreaInfo(0, 640, false, -1);
		memList.add(memAreaInfo);
		spaceMemList.add(memAreaInfo);
		if (stopFile)
		{
			try
			{
				ps =
					new PrintStream(
						new BufferedOutputStream(
							new FileOutputStream("bestMem.txt")));
			} catch (IOException e)
			{
				System.out.println(e);
			}
			ps.println("                       最佳适应算法\r\n");
			print("内存初始状态");
		}
	}

	//分配内存
	public boolean alloc(int memSize, int id)
	{
		MemAreaInfo mem;
		for (int i = 0; i < spaceMemList.size(); i++)
		{
			mem = (MemAreaInfo) (spaceMemList.get(i));
			if (mem.getLength() >= memSize)
			{
				if (mem.getLength() == memSize)
				{
					mem.setAlloc(true);
					mem.setId(id);
					spaceMemList.remove(i);
				} else
				{
					MemAreaInfo newMem =
						new MemAreaInfo(mem.getStartAddr(), memSize, true, id);
					mem.setStartAddr(mem.getStartAddr() + memSize);
					mem.setLength(mem.getLength() - memSize);
					spaceMemList.remove(i);
					insertMemList(newMem);
					insertSpaceMemList(mem);
				}
				break;
			}
		}
		if (stopFile)
		{
			print("作业" + id + "分配" + memSize + "M内存后");
		}
		repaint();
		return true;
	}

	//向内存链表里插入一条内存信息
	void insertMemList(MemAreaInfo mem)
	{
		MemAreaInfo mai;
		boolean flg = true;
		for (int i = 0; i < memList.size(); i++)
		{
			mai = (MemAreaInfo) (memList.get(i));
			if (mem.getStartAddr() <= mai.getStartAddr())
			{
				memList.add(i, mem);
				flg = false;
				break;
			}
		}

		if (flg)
		{
			memList.addLast(mem);
		}
	}

	//向空闲内存链表里插入一条内存信息
	void insertSpaceMemList(MemAreaInfo mem)
	{
		MemAreaInfo mai;
		boolean flag = true;
		for (int i = 0; i < spaceMemList.size(); i++)
		{
			mai = (MemAreaInfo) (spaceMemList.get(i));
			if (mem.getLength() <= mai.getLength())
			{
				spaceMemList.add(i, mem);
				flag = false;
				break;
			}
		}
		if (flag)
		{
			spaceMemList.add(mem);
		}
	}

	//	向空闲内存链表里删除一条内存信息
	void deleteFromSpaceMemList(MemAreaInfo mem)
	{
		MemAreaInfo mai;
		for (int i = 0; i < spaceMemList.size(); i++)
		{
			mai = (MemAreaInfo) (spaceMemList.get(i));
			if (mem.getStartAddr() == mai.getStartAddr()
				&& mem.getLength() == mai.getLength())
			{
				spaceMemList.remove(i);
				break;
			}
		}
	}

	//释入内存
	public boolean dealloc(int id)
	{
		int a = 0, b = 0;
		MemAreaInfo mem = null, preMem = null, nextMem = null;
		for (int i = 0; i < memList.size(); i++)
		{
			mem = (MemAreaInfo) memList.get(i);
			if (mem.getId() == id)
			{
				mem.setAlloc(false);
				mem.setId(-1);
				if (i > 0
					&& !(preMem = (MemAreaInfo) memList.get(i - 1)).isAlloc())
				{
					deleteFromSpaceMemList(preMem);
					mem.setStartAddr(preMem.getStartAddr());
					mem.setLength(mem.getLength() + preMem.getLength());
					a = i - 1;
				}

				if (i < memList.size() - 1
					&& !(nextMem = (MemAreaInfo) memList.get(i + 1)).isAlloc())
				{
					deleteFromSpaceMemList(nextMem);
					mem.setLength(mem.getLength() + nextMem.getLength());
					b = i + 1;
				}
				break;
			}
		}
		if (b > 0)
		{
			memList.remove(b);
			if (a > 0)
			{
				memList.remove(a);
				a = 0;
			}
		}
		if (a > 0)
		{
			memList.remove(a);
		}
		insertSpaceMemList(mem);

		if (stopFile)
		{
			print("作业" + id + "释放内存后");
		}
		repaint();
		return true;

	}

	//绘图函数
	public void paintComponent(Graphics g)
	{
		g.setColor(Color.pink);
		g.fillRect(0, 0, 1024, 768);
		g.setColor(Color.magenta);
		g.drawString("作业情况:", 230, 90);
		text.setBackground(new Color(192, 123, 152));
		text.setLocation(220, 100);
		bt.setLocation(120, 20);

		for (int i = 0; i < memList.size(); i++)
		{
			memAreaInfo = (MemAreaInfo) memList.get(i);

			if (memAreaInfo.isAlloc())
			{
				g.setColor(Color.blue);
				g.fillRect(
					50,
					(memAreaInfo.getStartAddr() + 100) * 2 / 3,
					120,
					memAreaInfo.getLength() * 2 / 3);
			} else
			{
				g.setColor(Color.white);
				g.fillRect(
					50,
					(memAreaInfo.getStartAddr() + 100) * 2 / 3,
					120,
					memAreaInfo.getLength() * 2 / 3);
			}

			g.setColor(Color.magenta);
			g.drawString(
				String.valueOf(memAreaInfo.getStartAddr()) + "M",
				180,
				(memAreaInfo.getStartAddr() + 110) * 2 / 3);
		}
		g.drawString("640M", 180, (640 + 110) * 2 / 3);

		g.setColor(Color.blue);
		g.fillRect(50, 510, 60, 20);
		g.drawString("已分配内存", 120, 523);
		g.setColor(Color.white);
		g.fillRect(50, 540, 60, 20);
		g.drawString("空闲内存", 120, 553);

	}

	//线程的run()函数
	public void run()
	{
		while (true)
		{

			try
			{
				Thread.sleep(100);
			} catch (InterruptedException e)
			{
				System.out.println(e);
			}
			if (controlFlag)
			{
				repaint();
				try
				{
					alloc(130, 1);
					text.append("作业1申请130K\n");
					Thread.sleep(1000);
					alloc(60, 2);
					text.append("作业2申请60K\n");
					Thread.sleep(1000);
					alloc(100, 3);
					text.append("作业3申请100k\n");
					Thread.sleep(1000);
					dealloc(2);
					text.append("作业2释放60K\n");
					Thread.sleep(1000);
					alloc(200, 4);
					text.append("作业4申请200K\n");
					Thread.sleep(1000);
					dealloc(3);
					text.append("作业3释放100K\n");
					Thread.sleep(1000);
					dealloc(1);
					text.append("作业1释放130K\n");
					Thread.sleep(1000);
					alloc(140, 5);
					text.append("作业5申请140K\n");
					Thread.sleep(1000);
					alloc(60, 6);
					text.append("作业6申请60K\n");
					Thread.sleep(1000);
					alloc(50, 7);
					text.append("作业7申请50K\n");
					Thread.sleep(1000);
					dealloc(6);
					text.append("作业6释放60K\n");
					if (stopFile)
					{
						ps.close();
						stopFile = false;
					}

					text.append("\n详细内存分区信息在\n文件(bestMem.txt)中");

				} catch (InterruptedException e)
				{
					System.out.println(e.toString());
				}
				controlFlag = false;
			}
		}

	}

	void print(String s)
	{
		ps.print("\r\n-----------------" + s + "-----------------\r\n");
		ps.println(" 起始地址          长度\t\t目前状态\r\n");
		for (int i = 0; i < memList.size(); i++)
		{
			MemAreaInfo m = (MemAreaInfo) memList.get(i);
			ps.println(m);
		}
		ps.println("\r\n");
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -