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

📄 mainstore.java

📁 使用java模拟实现操作系统一些功能
💻 JAVA
字号:
/*
实习二  主存空间的分配和回收

第一题:可变分区管理方式下采用首次适应算法实现主存分配和回收
[提示]:
(1)	可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存容量查看是否有足够的空闲空间,
若有,则按需分配,否则,作业无法装入。假定内存大小为128K,空闲区说明表格式为:
起始地址——指出空闲区的起始地址;
长度——一个连续空闲区的长度;
状态——有两种状态,一种是“未分配”状态;另一种是“空表目”状态,表示该表项目前没有使用。
(2)	采用首次适应算法分配回收内存空间。运行时,输入一系列分配请求和回收请求。
要求程序的用户界面友好,能显示分区分配及回收后的内存布局情况。

*/


//<applet code=MainStore.class width=320 height=450>
//</applet>

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;

public class MainStore extends Applet implements ActionListener
{
	public TextArea info;
	public Button action1,action2;
    public TextField psize,pname;
	public Label lb1,lb2;
	public Panel panel1,panel2;
	public Vector block = new Vector();
	public Vector run = new Vector();
	public int pNum,i,j;
	public String nowtext,temp1,temp2;
	public runblock runtemp,isRun;
	public free freetemp,ftemp;
	//初始化 空闲区数组 128k,
    //空闲区数据结构, 0序号、1起始地址、2空闲长度、3状态
	
	public class free
	{
		public int no,startAddr,freesize,stat;
		public free (int no,int startAddr,int freesize)
	    {
			this.no = no;
			this.startAddr = startAddr;
			this.freesize = freesize;
	        this.stat = 0;
		
		}
		public free (int no)
        {
			this.no = no;
			this.startAddr = 0;
			this.freesize = 0;
	        this.stat = 0;
		}
	   public void addsize (int size)
	   {
		   this.freesize=this.freesize+size;
	   }
	   public void decsize (int size)
	   {
           this.freesize=this.freesize-size;
	   }
       public int no() 
		{
            return this.no;
        }	
       public int startAddr() 
		{
            return this.startAddr;
        }
       public int freesize() 
		{
            return this.freesize;
        }
       public int stat() 
		{
            return this.stat;
        }
       
	}
	
	//主存部分
	public class runblock
	{
		public int rname,rstart,rsize;
		public runblock(int rname,int rstart,int rsize)
		{
			this.rname=rname;
			this.rstart=rstart;
			this.rsize=rsize;
		}
		public int rname() 
		{
            return this.rname;
        }
		public int rstart() 
		{
            return this.rstart;
        }
		public int rsize() 
		{
            return this.rsize;
        }
	} 

	
	public void init()
    {
	  info=new TextArea("主存调度算法空间分配回收程序\n\nIniting...Over\n请在上列方格中输入分配进程的大小(单位:1k)或回收的进程序号\n",20,40,TextArea.SCROLLBARS_VERTICAL_ONLY);
      action1=new Button("分配");
	  action2=new Button("回收");

	  psize=new TextField("");
	  pname=new TextField("");

	  lb1=new Label("分配请求:(大小k)");
	  lb2=new Label("回收请求:(进程名)");

      panel1=new Panel(new GridLayout(1,3));
      panel2=new Panel(new GridLayout(1,3));
     
      //布局设置
       panel1.add(lb1);panel1.add(psize);panel1.add(action1);
	   panel2.add(lb2);panel2.add(pname);panel2.add(action2);
	   add(panel1);add(panel2);
	   add(info);

	   //监听
	   action1.addActionListener(this);
	   action2.addActionListener(this);

	   //数据实例化,默认128k序号1,起始地址0
	   block.add(new free(1,0,128));


     } 
	
	//重新排序函数
	public void resort(int no,int start,int len)
	{
        int ii=0,ssum=0;
		//获取位置
		for(ii=0;ii<block.size();ii++)
		{
			free stemp=(free) block.get(ii);
			if(len>=stemp.freesize()) 
			{
				ssum++;
			}else{
			    break;
			}
		}
       //插入向量
	   block.add(ssum,new free(no,start,len));
	
	}

	//返回内存使用情况 和 空闲区情况
	public void showinfo()
	{
			   nowtext=info.getText();
			   info.setText(nowtext+"内存应用状况\n进程号  起始地址  块大小 \n");
			   //内存使用部分
			   for(i=0;i<run.size();i++)
			   {
				   runtemp=(runblock) run.get(i);
				   nowtext=info.getText();
			       info.setText(nowtext+"   "+runtemp.rname()+"         "+runtemp.rstart()+"       "+runtemp.rsize()+"\n");
			   }
			   //空闲区部分
			   nowtext=info.getText();
			   info.setText(nowtext+"\n空闲区状况\n序号  起始地址  块大小  类型\n");
			   for(i=0;i<10;i++)
			   {
				   nowtext=info.getText();
				   if(i<block.size())
				   {
					   ftemp=(free) block.get(i);
					   info.setText(nowtext+"  "+(i+1)+"      "+ftemp.startAddr()+"     "+ftemp.freesize()+"    未分配\n");
				   }else{
				       info.setText(nowtext+"  "+(i+1)+"      0       0    空表目\n");
				   }
   
			   }		 
	}
	//监听动作
	public void actionPerformed(ActionEvent e)  
    {
		String event=e.getActionCommand();
		nowtext=info.getText();

		temp1=psize.getText();
		temp2=pname.getText();
		Integer psizeNum=0,i=0,j=0,freeNum=0,flag=0,pAddr=0,pName=0;
		free ftemp=(free) block.get(0);
		
		if(event=="分配")
		{
		    //对异常进行处理。 
		    try {
                psizeNum=Integer.parseInt(temp1);
		    } catch (NumberFormatException ex) {
			    info.setText("输入出错!各个进程需要的空间不能为空或0\n\n请重新输入各个进程需要的空间(单位1k)\n\n");
				showinfo();
			    return ;
		    }
			//检查空闲区
			//System.out.println(block.size());
			for(i=0;i<block.size();i++)
			{
				ftemp=(free) block.get(i);
				//检测空闲区  空闲区数据结构, 0序号、1起始地址、2空闲长度、3状态

				if(ftemp.freesize()>=psizeNum)
				{

                    //分割空闲区,并重新排列
			 
                    if(ftemp.freesize()!=psizeNum)
					{
						ftemp.decsize(psizeNum);
						//resort(ftemp);
					}
					int reno=ftemp.no();
					int restart=ftemp.startAddr();
					int resize=ftemp.freesize();
                    block.removeElementAt(i);
					resort(reno,restart+psizeNum,resize);
					pNum++;
					flag=1;
                    //加入运行队列

					run.add(new runblock(pNum,ftemp.startAddr(),psizeNum));
					break;
				
				}
				 
			}
            
			//返回显示
			
			if(flag==1)
			{
			  
               info.setText("分配成功\n\n");
 	           showinfo();
            }else{
			   info.setText("空闲区无空闲内存块满足条件,请先回收部分进程。\n分配失败\n\n");
			   showinfo();
        	}

			 
		}

		if(event=="回收")
		{
			if(run.size()==0)
			{
				info.setText("内存暂时没有可回收的进程\n\n");
				showinfo();
				return;
			
			}
			int isIn=0;
			free isFree = (free) block.get(0);
			free isFree2 = (free) block.get(0);
			runblock isRun = (runblock) run.get(0);
		    //对异常进行处理。 
		    try {
                pName=Integer.parseInt(temp2);
		    } catch (NumberFormatException ex) {
			    info.setText("输入出错!各个进程序号不能为空或0\n\n请重新输入进程序号(单位1k)\n");
			    return ;
		    }
            //检测输入的序号是否在内存内
			for(i=0;i<run.size();i++)
			{
				isRun = (runblock) run.get(i);
				if(isRun.rname()==pName)
				{
					isIn = 1;
					break;
				}
			}
			if(isIn==0)
			{
				info.setText("你输入的序号不在内存中,请确认输入\n\n");
				showinfo();
			}else{
			    info.setText("序号正确,进程在内存中。\n\n");
				//备份并删除内存中进程
                int isName=pName;
				int isStart=isRun.rstart();
				int isSize=isRun.rsize();
				int isFlag=0;
                run.removeElementAt(i);

				//恢复空闲区,整合连续片段;先检查是否可以整合,不能整合的话,按大小插入空闲区
                for(i=0;i<block.size();i++)
				{
					j=i+1;
					isFree = (free) block.get(i);
					//在空闲区前
					if(isFree.startAddr()==(isStart+isSize))
					{
						isSize=isSize+isFree.freesize();
						int isNo=isFree.no();

						block.removeElementAt(i);
						resort(isNo,isStart,isSize);
						isFlag = 1;
						System.out.println("11111111");
	                    break;
					}

                    //空闲区后
					if((isFree.startAddr()+isFree.freesize())==isStart)
					{
						//原后部分判断
						if(i==block.size())
						{
						    isSize=isSize+isFree.freesize();
						    int isNo=isFree.no();
						    isStart=isFree.startAddr();

						    block.removeElementAt(i);
							resort(isNo,isStart,isSize);
							isFlag = 1;
							break;
						}else{
						    isFree2 = (free) block.get(i+1);
							//判断是否在两空闲块之间
						    if(isFree2.startAddr()==(isStart+isSize))
						   {
								isSize=isSize+isFree.freesize()+isFree2.freesize();
								int isNo=isFree.no();
								isStart=isFree.startAddr();

								block.removeElementAt(i);
							 	block.removeElementAt(i);
								resort(isNo,isStart,isSize);
								isFlag = 1;
								break;

						   }else{
						   	    isSize=isSize+isFree.freesize();
								int isNo=isFree.no();
								isStart=isFree.startAddr();

								block.removeElementAt(i);
								resort(isNo,isStart,isSize);
								isFlag = 1;
								break;
						   }
						}
					}

				}
				if(isFlag==0)
				{
                    resort(8,isStart,isSize);
				}
				showinfo();
				nowtext=info.getText();
				info.setText(nowtext+"\n\n 回收成功!");


			}
		
		}
              pname.setText("");
			  psize.setText("");
	}

 }

⌨️ 快捷键说明

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