//选择一个要释放的进程 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("未选择任何进程", "提示"); } }
//添加一个调入进程 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; }
//单步执行函数 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(); } }
//随机创建进程列表 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; } }