// 调度函数 #region getPcbFromFreequeue // 从空白PCB队列中取出一个空白的PCB块 // 每次取free队列的第一个PCB public int getPcbFromFreequeue(Free _free, CPU _cpu) { int pcb_num = 0; if (_free.num > 0) // 有剩余的空白PCB,取出 { pcb_num = _free.PCBqueue[0].num; _cpu.tempPCB = _free.PCBqueue[0];// 将要取出的pcb存在tempPCB里 // 如果取出后,空白PCB队列不为空,就把后面的PCB块往前挪,最后一个复制空PCB块置空 if (_free.num > 1) { for (int i = 0; i < _free.num; i++) { if (i < _free.num - 1) { _free.PCBqueue[i] = _free.PCBqueue[i + 1]; } else { _free.PCBqueue[i] = _free.PCBqueue[8]; } } } _free.num--; } return(pcb_num); }
// 进程的终止 public void destroy(int pcb_num, Free _free, Execute _execute, Label[] label_storage, Storage _storage, CPU _cpu) { // 将结果写入out文件 // 回收主存 _storage.recovery(pcb_num, _free, _execute, label_storage, _storage); // 回收进程控制块; _cpu.fromExecuteToFree(_execute, _free); }
// 初始化空白PCB队列的方法 public void initFreePCB(Free _free) { for (int i = 0; i <= 8; i++) { // 将PCB放入空白PCB队列 _free.num++; _free.PCBqueue[i] = PCBarray[i]; // 将第i号PCB块放入空白PCB队列 _free.PCBqueue[i].state = ProcessState.free; // 进程状态设置为free } _free.num--; }
// 内存回收 public void recovery(int pcb_num, Free _free, Execute _execute, Label[] label_storage, Storage _storage) { for (int i = 0; i < 128; i++) { if (_storage.pcbStorage[i] == pcb_num) { _storage.pcbStorage[i] = 0; // 将这个进程占用的内存块清空 _storage.freeStorage[i] = 0; label_storage[i].BackColor = Color.Aquamarine; // 内存块颜色更改 } } }
// 执行完毕,回收PCB块到Free队列队尾 public void fromExecuteToFree(Execute _execute, Free _free) { // 当前进程位于执行队列中,执行队列只有一个块 _free.PCBqueue[_free.num] = _execute.PCBqueue[0]; //_free.PCBqueue[_free.num].state = ProcessState.free; // 修改进程状态 _free.PCBqueue[_free.num] = _free.PCBqueue[8]; // 格式化处理 _free.PCBqueue[_free.num].num = _execute.PCBqueue[0].num; _free.PCBqueue[_free.num].name = _execute.PCBqueue[0].name; // _free.PCBqueue[_free.num - 1].next = _free.num; _free.num++; _execute.PCBqueue[0] = _execute.PCBqueue[1]; // 格式化处理 _execute.num = 0; }
// 进程管理函数 #region 创建进程Create // 创建进程 public void create(Free _free, Ready _ready, Label[] label_storage, Storage _storage, CPU _cpu, string instructions) // 创建进程时输入指令 { // 申请空白进程控制块,得到空闲PCB的内部标识符 int pcb_num = _cpu.getPcbFromFreequeue(_free, _cpu); if (pcb_num == 0) { MessageBox.Show("无可用空闲PCB块", "创建进程失败", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation); } else { // 主存申请,程序装入模拟主存 _storage.allocate(pcb_num, instructions, _storage, label_storage); // 更改进程状态为ready _cpu.tempPCB.state = ProcessState.ready; // 将进程链入就绪队列 // 如果是第一个 if (_ready.num == 0) { _ready.PCBqueue[_ready.num] = _cpu.tempPCB; // 创建进程时,将所有指令存在instructions字符串中 _ready.PCBqueue[_ready.num].instructions = instructions; _ready.num++; } else if (_ready.num >= 1 && _ready.num < 8) { _ready.PCBqueue[_ready.num] = _cpu.tempPCB; // 创建进程时,将所有指令存在instructions字符串中 _ready.PCBqueue[_ready.num].instructions = instructions; // 修改next,使头尾相接,成环形链 //_ready.PCBqueue[_ready.num - 1].next = _ready.num; //_ready.PCBqueue[_ready.num].next = 0; _ready.num++; } else { MessageBox.Show(_ready.num.ToString(), "创建进程失败", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation); } } }