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

📄 mosdisk.java

📁 本程序是在软件模拟的计算机系统上设计一个多道程序的操作系统MOS
💻 JAVA
字号:
//已调试;
public class MosDisk {
	byte[] disk_data = new byte[FinalVar.DISK_MAX_CAP];
	byte[] disk_malloc_table = new byte[FinalVar.DISK_PAGE_MAXCAP];
	byte[] disk_in_table = new byte[FinalVar.SPOOLING_BUFFER_SIZE];
	byte[] disk_out_table = new byte[FinalVar.SPOOLING_BUFFER_SIZE];
	private MosVar var = null;
	String s1 = "";
	
	public MosDisk(MosVar var) {
		this.var = var;
	}
	
//	按作业的大小申请输入井/输出井空间,若有足够的空间则返回申请到的块地址,失败则返回空;
//	page_size为所要申请的输入井/输出井大小,addr为输入井始址或输出井始址;
	public byte[] diskMalloc(byte page_size,byte addr){
		byte free_size = 0;
		byte[] pro = new byte[page_size];
		for(byte i = addr; i < addr + FinalVar.SPOOLING_BUFFER_SIZE;i++){
			if(0 == disk_malloc_table[i]){
				disk_malloc_table[i] = 1;
				pro[free_size] = i;
				free_size++;
			}
					
			if (free_size == page_size) {
				break;
			}
		}
		if(free_size == page_size)
			return pro;
		else {
			for(byte i = 0;i < free_size;i++){
				disk_malloc_table[pro[i]] = 0;
			}
			return null;
		}
	}
	
//	写入时,需传递所要写入的内容msg以及磁盘的始址addr;
	public void diskWrite(byte[] msg,byte addr){
//		System.out.println("");
		int disk_addr=addr*10*4;
//		System.out.print("disk addr" + disk_addr);
		for(int i = 0;i < msg.length;i++){
			disk_data[disk_addr+i]=msg[i];
		}
		showDiskState();
	}
	
//	读出数据时,需要传递所要读出的地址(以块为单位),以及要读出块的大小;
	public byte[] diskRead(byte addr){
		int disk_addr = addr*10*4;
		byte[] value = new byte[40];
		for(int i = 0;i < 40;i++){
			value[i]=disk_data[disk_addr+i];
		}
		return value;
	}
	
	private void showDiskState() {
		var.disk_area.setText("");
		for(int i = 0; i < 100; i++) {
	    	if(i < 1) {
	    		for(int j = 0; j < 10; j++) {
	    			s1 = "";
	    			int k ;
	    			if((this.disk_data[i * 40 + j * 4] != 0)||(this.disk_data[i * 40 + j * 4 + 1] != 0)
	    					||(this.disk_data[i * 40 + j * 4 +2] != 0)||(this.disk_data[i * 40 + j * 4 + 3] != 0)) 
		    			for(k = 0; k < 4; k++) {
		    				s1 = s1 + (char)this.disk_data[i * 40 + j * 4 + k];
		    			}
		    		else
		    			for(k = 0; k < 4; k++) {
	    				s1 = s1 + this.disk_data[i * 40 + j * 4 + k];
	    			}
	    			var.disk_area.append("   000" + j + "     " + s1 + "\n");
	    			
	    		}
	    	}
	    	else if(i < 10) {
	    		for(int j = 0; j < 10; j++) {
	    			s1 = "";
	    			int k ;
	    			if((this.disk_data[i * 40 + j * 4] != 0)||(this.disk_data[i * 40 + j * 4 + 1] != 0)
	    					||(this.disk_data[i * 40 + j * 4 + 2] != 0)||(this.disk_data[i * 40 + j * 4 + 3] != 0))
		    			for(k = 0; k < 4; k++)
		    				s1 = s1 + (char)this.disk_data[i * 40 + j * 4 + k];
	    			else
		    			for(k = 0; k < 4; k++) {
	    				s1 = s1 + this.disk_data[i * 40 + j * 4 + k];
	    			}
	    			var.disk_area.append("   00" + (i * 10 + j) + "     " + s1 + "\n");
	    		}
	    	}
	    	else if(i < 100) {
	    		for(int j = 0; j < 10; j++) {
	    			s1 = "";
	    			int k ;
	    			if((this.disk_data[i * 40 + j * 4] != 0)||(this.disk_data[i * 40 + j * 4 + 1] != 0)
	    					||(this.disk_data[i * 40 + j * 4 + 2] != 0)||(this.disk_data[i * 40 + j * 4 + 3] != 0))
		    			for(k = 0; k < 4; k++)
		    				s1 = s1 + (char)this.disk_data[i * 40 + j * 4 + k];
	    			else
		    			for(k = 0; k < 4; k++) {
	    				s1 = s1 + this.disk_data[i * 40 + j * 4 + k];
	    			}
		    		var.disk_area.append("   0" + (i * 10 + j) + "     " + s1 + "\n");
	    		}
	    	}
	    }
	}
//	释放磁盘空间,需传递要释放的块数以及始址;
	public void diskFree(byte page_size,byte addr){
//		int disk_start_addr = addr * 10 * 4;
//		int disk_end_addr = disk_start_addr + page_size * 10 * 4;
//		for(int i = disk_start_addr;i < disk_end_addr;i++){
//			disk_data[i] = 0;
//		}
		for(byte i = 0;i < page_size;i++){
			disk_malloc_table[addr+i]=0;
		}
	}	
}

⌨️ 快捷键说明

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