Пример #1
0
        // 调度函数
        #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);
        }
Пример #2
0
 // 进程的终止
 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);
 }
Пример #3
0
 // 初始化空白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--;
 }
Пример #4
0
 // 内存回收
 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; // 内存块颜色更改
         }
     }
 }
Пример #5
0
 // 执行完毕,回收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;
 }
Пример #6
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);
                }
            }
        }