📄 fss.cs
字号:
/******************************************************************************************
*
* 公平共享调度模拟程序
*
* 0572192
* 薛研歆
*
******************************************************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace FSS
{
public partial class FSS : Form
{
private Int32 processNum = 1;
private process[] processDetail = new process[100];
public FSS()
{
InitializeComponent();
}
/******************************************************************************************
*
* 添加进程按钮
*
* 读取text框中的进程信息,并对相应格式信息进行检查
*
******************************************************************************************/
private void addProcess_Click(object sender, EventArgs e)
{
String Name = null;
Int32 Time = 0;
Int32 Group = 0;
Int32 Priority = 0;
char b = '%';
Int16 a = (Int16)b;
Name = processNameText.Text;
if (Name == "")
{
MessageBox.Show("请输入进程名字", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
for (Int32 i = 1; i < processNum; i++)
if (processDetail[i].getProcessName().Equals(Name))
{
MessageBox.Show("进程名字重复", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (Int32.TryParse(processTimeText.Text, out Time))
{
Time = Int32.Parse(processTimeText.Text);
}
else
{
MessageBox.Show("请输入进程需时必须为数字", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (Int32.TryParse(processGroupText.Text, out Group))
{
Group = Int32.Parse(processGroupText.Text);
}
else
{
MessageBox.Show("请输入进程组别必须为数字", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (Int32.TryParse(processPriorityText.Text, out Priority))
{
Priority = Int32.Parse(processPriorityText.Text);
}
else
{
MessageBox.Show("请输入进程优先级必须为数字", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
// get basic informatin from window
processDetail[processNum] = new process();
processDetail[processNum].setProcessName(Name);
processDetail[processNum].setProcessGroup(Group);
processDetail[processNum].setProcessTime(Time);
processDetail[processNum].setTimeRemain(Time);
processDetail[processNum].setProcessPriority(Priority);
processDetail[processNum].setPriorityNow(Priority);
// add process information to list
String Item = processDetail[processNum].getProcessName().PadLeft(7) + " " + processDetail[processNum].getProcessTime().ToString().PadLeft(8) + " " + processDetail[processNum].getProcessGroup().ToString().PadLeft(8) + " " + processDetail[processNum].getProcessPriority().ToString().PadLeft(10);
ProcessList.Items.Insert(processNum, Item);
processNum++;
}
/******************************************************************************************
*
* 删除进程按钮
*
* 删除ListBox框中被选中的进程信息
*
******************************************************************************************/
private void deleteProcess_Click(object sender, EventArgs e)
{
Int32 select = ProcessList.SelectedIndex;
if (select == -1)
{
MessageBox.Show("请输选择进程", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
for (Int32 i = select; i < processNum; i++)
processDetail[i] = processDetail[i + 1];
processNum--;
processDetail[processNum] = null;
ProcessList.Items.RemoveAt(select);
}
/******************************************************************************************
*
* 运行进程按钮
*
* 模拟公平共享调度的进程运行信息,将相应内容写入ListBox中
*
******************************************************************************************/
private void runProcess_Click(object sender, EventArgs e)
{
Int32 CPUTime = 0;
Int32 TeamNum = 0;
Boolean finish = false;
if (processNum == 1)
{
MessageBox.Show("请输入进程", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
setProcess();
RunList.Items.Clear();
RunList.Items.Add("CPU时间 执行进程 进程组别 进程优先级");
while (!finish)
{
TeamNum = getTeamNum();
updateProcessPriority(TeamNum);
Int32 priorityBiggestProcess = findBiggestPriority();
if (priorityBiggestProcess == 0)
break;
String outInfo = CPUTime.ToString().PadLeft(7) +" " + processDetail[priorityBiggestProcess].getProcessName().PadLeft(7) + " " + processDetail[priorityBiggestProcess].getProcessGroup().ToString().PadLeft(8) + " " + processDetail[priorityBiggestProcess].getProcessPriority().ToString().PadLeft(10);
RunList.Items.Add(outInfo);
CPUTime++;
updataProcessTime(priorityBiggestProcess);
}
RunList.Items.Add("运行结束");
}
/******************************************************************************************
*
* 作者信息
*
******************************************************************************************/
private void info_Click(object sender, EventArgs e)
{
MessageBox.Show("The Program is writen by\n0572192 XueYanxin", "作者信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/******************************************************************************************
*
* 更新进程时间
*
* 在进程运行之后更新此次进程的CPUTime以及GroupTime
*
******************************************************************************************/
private void updataProcessTime(Int32 processID)
{
Int32 oneSeconde = 60;
Int32 GroupID = processDetail[processID].getProcessGroup();
processDetail[processID].setCPUTime(processDetail[processID].getCPUTime() + oneSeconde);
for (Int32 i = 1; i < processNum; i++)
if (processDetail[i].getProcessGroup() == GroupID)
processDetail[i].setGCPUTime(processDetail[i].getGCPUTime() + oneSeconde);
processDetail[processID].setTimeRemain(processDetail[processID].getTimeRemain() - 1);
}
/******************************************************************************************
*
* 更新进程优先级
*
* 运行进程之前,将上次运行的进程的CPUTiem,GroupTime和优先级进行更新
*
******************************************************************************************/
private void updateProcessPriority(Int32 TeamNum)
{
for (Int32 i = 1; i < processNum; i++)
{
processDetail[i].setCPUTime(processDetail[i].getCPUTime() / 2);
processDetail[i].setGCPUTime(processDetail[i].getGCPUTime() / 2);
processDetail[i].setPriorityNow(processDetail[i].getProcessPriority() + processDetail[i].getCPUTime() / 2 + processDetail[i].getGCPUTime() * TeamNum / 4);
}
}
/******************************************************************************************
*
* 获取未完成进程的组的总数
*
******************************************************************************************/
private Int32 getTeamNum()
{
Int32 result = 0;
Int32[] team = new Int32[100];
for (Int32 i = 1; i < processNum; i++)
if (processDetail[i].getTimeRemain() > 0)
{
Int32 j = 0;
while ((j <= result) && (processDetail[i].getProcessGroup() != team[j]))
j++;
if (j > result)
{
team[j] = processDetail[i].getProcessGroup();
result++;
}
}
return result;
}
/******************************************************************************************
*
* 寻找最高优先级进程
*
******************************************************************************************/
private Int32 findBiggestPriority()
{
Int32 result = 0;
Int32 maxPriority = Int32.MaxValue;
for (Int32 i = 1; i < processNum; i++)
if ((processDetail[i].getPriorityNow() < maxPriority) && (processDetail[i].getTimeRemain() > 0))
{
result = i;
maxPriority = processDetail[i].getPriorityNow();
}
return result;
}
/******************************************************************************************
*
* 运行初始化
*
******************************************************************************************/
private void setProcess()
{
for (Int32 i = 1; i < processNum; i++)
{
processDetail[i].setTimeRemain(processDetail[i].getProcessTime());
processDetail[i].setPriorityNow(processDetail[i].getProcessPriority());
processDetail[i].setCPUTime(0);
processDetail[i].setGCPUTime(i);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -