Beispiel #1
0
        //选择一个要释放的进程
        private void ReleaseProcessButton_Click(object sender, EventArgs e)
        {
            //检查是否已选择
            if (chooseReleaseNoListBox.SelectedItem != null)
            {
                //检查是否已到调度列表规模上限
                if (processList.Count < maxProcessListSize)
                {
                    //从选择调出进程列表栏中选取到要释放的进程,添加进调度列表,更新选择调出进程列表栏信息
                    int           chooseNo      = (int)chooseReleaseNoListBox.SelectedItem;
                    Process       process       = processes[chooseNo - 1];
                    ProcessAction processAction = new ProcessAction(process, false);
                    processList.Add(processAction);
                    chooseReleaseNoListBox.Items.Remove(chooseNo);

                    processListTextBox.AppendText("进程" + chooseNo + " 释放\r\n");
                }
                else
                {
                    MessageBox.Show("进程列表已满(30)", "提示");
                }
            }
            else
            {
                MessageBox.Show("未选择任何进程", "提示");
            }
        }
Beispiel #2
0
        //添加一个调入进程
        private void AddProcessButton_Click(object sender, EventArgs e)
        {
            //检查数据规范性
            if (string.IsNullOrEmpty(getPSizeTextBox.Text))
            {
                MessageBox.Show("数据未填写", "提示");
            }
            else if (int.TryParse(getPSizeTextBox.Text, out int getProcessSize) && getProcessSize >= 25 * memSize / 1000 && getProcessSize <= 300)
            {
                //检查是否已到调度列表规模上限
                if (processList.Count < maxProcessListSize)
                {
                    //创建一个调入进程并添加进调度列表,更新选择调释放进程列表栏信息
                    Process       process       = new Process(nextProcessNoInCreate, getProcessSize);
                    ProcessAction processAction = new ProcessAction(process, true);
                    processes.Add(process);
                    processList.Add(processAction);
                    chooseReleaseNoListBox.Items.Add(nextProcessNoInCreate);

                    nextProcessNoInCreate++;
                    processListTextBox.AppendText("进程" + process.processNo + " 申请" + getProcessSize + "K\r\n");
                }
                else
                {
                    MessageBox.Show("进程列表已满(30)", "提示");
                }
            }
            else
            {
                MessageBox.Show("需要填入" + (25 * memSize / 1000) + "~300之间的数字", "提示");
            }
            getPSizeTextBox.Text = string.Empty;
        }
Beispiel #3
0
        //单步执行函数
        private void RunOneStep()
        {
            //检查进程列表是否为空
            if (processList.Count == 0)
            {
                MessageBox.Show("进程列表为空", "提示");
                return;
            }
            //确定执行的进程及其操作
            ProcessAction processAction = processList.First();

            if (processAction.op)
            {
                //记录下一个未调度的进程序号
                nextProcessNo++;
                AddProcess(processAction.process);
            }
            else
            {
                ReleaseProcess(processAction.process);
            }
            //移除进程列表已执行的项(首项)
            processList.RemoveAt(0);
            //检查是否执行完毕
            if (processList.Count == 0)
            {
                MessageBox.Show("执行完成\r\n\r\n进程调入失败次数:" + falseNum, "提示");
                ClearProcessList();
            }
        }
Beispiel #4
0
        //随机创建进程列表
        private void CreateRandomListButton_Click(object sender, EventArgs e)
        {
            //检查数据规范性
            if (string.IsNullOrEmpty(getRandomNumTextBox.Text))
            {
                MessageBox.Show("数据未填写", "提示");
            }
            else if (int.TryParse(getRandomNumTextBox.Text, out int randomNum) && randomNum >= 3 && randomNum <= 30)
            {
                //初始化(清除)调度进程列表
                ClearProcessList();
                //获取剩余空间大小
                int freeMemInRd = freeMem;
                //储存可释放的进程的编号
                List <int> rdCreatedProcess = new List <int>();
                //随机数引擎
                Random rd         = new Random();
                bool   isRdAction = false;
                //将目前在内存中的进程的编号添加进可释放的进程的编号的列表
                foreach (var process in processes)
                {
                    if (process.processStarting != -1)
                    {
                        rdCreatedProcess.Add(process.processNo);
                    }
                }

                for (int i = 0; i < randomNum; i++)
                {
                    bool rdAction;
                    //随机状态下创建新调入进程的概率为(剩余内存空间 / 总内存空间 * 1.2)
                    //生成随机队列时先让内存充满至大于70%,再进行随机操作
                    if (isRdAction)
                    {
                        rdAction = rd.Next(0, memSize) < freeMemInRd * 1.2;
                    }
                    else
                    {
                        rdAction = true;
                    }
                    if (rdAction)
                    {
                        //创建新进程,加入创建进程列表
                        int rdProcessSize = rd.Next(25 * memSize / 10000 + 1, 30) * 10;

                        Process       process       = new Process(nextProcessNoInCreate, rdProcessSize);
                        ProcessAction processAction = new ProcessAction(process, rdAction);
                        processes.Add(process);
                        //添加进调度进程列表,添加进可释放进程列表,更新选择调出进程列表栏信息
                        processList.Add(processAction);
                        rdCreatedProcess.Add(nextProcessNoInCreate);
                        chooseReleaseNoListBox.Items.Add(nextProcessNoInCreate);
                        //更新下一个被创建的进程的编号,更新(随机创建状态下)剩余内存容量
                        nextProcessNoInCreate++;
                        freeMemInRd -= rdProcessSize;

                        processListTextBox.AppendText("进程" + process.processNo + " 申请" + rdProcessSize + "K\r\n");

                        if (!isRdAction)
                        {
                            if (freeMemInRd < memSize * 0.3)
                            {
                                isRdAction = true;
                            }
                        }
                    }
                    else
                    {
                        //从可释放的进程中随机选择一个进程进行释放操作
                        int rdReleaseProcess = rd.Next(0, rdCreatedProcess.Count);

                        Process       process       = processes[rdCreatedProcess[rdReleaseProcess] - 1];
                        ProcessAction processAction = new ProcessAction(process, rdAction);

                        //添加进调度进程列表,从可释放进程列表中剔除,更新选择调出进程列表栏信息,更新(随机创建状态下)剩余内存容量
                        processList.Add(processAction);
                        rdCreatedProcess.RemoveAt(rdReleaseProcess);
                        chooseReleaseNoListBox.Items.Remove(process.processNo);
                        freeMemInRd += process.size;

                        processListTextBox.AppendText("进程" + process.processNo + " 释放\r\n");
                    }
                }
            }
            else
            {
                MessageBox.Show("需要填入3~30之间的数字", "提示");
                getRandomNumTextBox.Text = string.Empty;
            }
        }