C#版操作系统实验—CPU调度
来源:互联网 发布:淘宝买二手东西在哪 编辑:程序博客网 时间:2024/06/06 00:42
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text.RegularExpressions;
namespace Operating_System_Process_Manage
{
//窗口界面类
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//内存设置按钮
int memory = 0; //内存容量设置
public void enter(ListView L) //新建进程进入队列中
{
ListViewItem List = new ListViewItem(pro.name);
List.SubItems.Add(pro.need_time);
List.SubItems.Add(pro.priority);
List.SubItems.Add(pro.need_memery);
L.Items.Add(List);
}
public void Transfer(ListView L) //时间片到了,进程被赶下去,进入就绪或后备队列
{
ListViewItem List = new ListViewItem(listView_occupy.Items[0].SubItems[0].Text);
List.SubItems.Add(listView_occupy.Items[0].SubItems[1].Text);
List.SubItems.Add(listView_occupy.Items[0].SubItems[2].Text);
List.SubItems.Add(listView_occupy.Items[0].SubItems[3].Text);
L.Items.Add(List);
}
public void finishPro(ListView L) //CPU上进程执行完后进入完成队列
{
ListViewItem List = new ListViewItem(listView_occupy.Items[0].SubItems[0].Text);
List.SubItems.Add(time_number.ToString());
List.SubItems.Add(listView_occupy.Items[0].SubItems[2].Text);
List.SubItems.Add(listView_occupy.Items[0].SubItems[3].Text);
L.Items.Add(List);
}
public void wakePro(ListView L) //阻塞进程被唤醒进入就绪队列
{
ListViewItem List = new ListViewItem(listView_break.SelectedItems[0].SubItems[0].Text);
List.SubItems.Add(listView_break.SelectedItems[0].SubItems[1].Text);
List.SubItems.Add(listView_break.SelectedItems[0].SubItems[2].Text);
List.SubItems.Add(listView_break.SelectedItems[0].SubItems[3].Text);
L.Items.Add(List);
}
public void move(ListView L) //后备队列的进程进入就绪队列中
{
ListViewItem List = new ListViewItem(listView_ready2.Items[0].SubItems[0].Text);
List.SubItems.Add(listView_ready2.Items[0].SubItems[1].Text);
List.SubItems.Add(listView_ready2.Items[0].SubItems[2].Text);
List.SubItems.Add(listView_ready2.Items[0].SubItems[3].Text);
L.Items.Add(List);
}
public void runPro() //从就绪队列中选择作业到CPU中
{
int select = 0;
if (listView_ready1.Items.Count == 0)
{
timeSlice = 0;
timer1.Enabled = false;
MessageBox.Show("所有就绪队列中进程执行结束");
}
if (listView_ready1.Items.Count == 1)
{
ListViewItem item = new ListViewItem(listView_ready1.Items[select].SubItems[0].Text);
item.SubItems.Add(listView_ready1.Items[select].SubItems[1].Text);
item.SubItems.Add(listView_ready1.Items[select].SubItems[2].Text);
item.SubItems.Add(listView_ready1.Items[select].SubItems[3].Text);
listView_occupy.Items.Add(item);
listView_ready1.Items.Remove(listView_ready1.Items[select]); //删除就绪队列中选中的进程
}
if (listView_ready1.Items.Count == 2)
{
int a = int.Parse(listView_ready1.Items[0].SubItems[2].Text);
int b = int.Parse(listView_ready1.Items[1].SubItems[2].Text);
if (b > a)
select = 1;
ListViewItem item = new ListViewItem(listView_ready1.Items[select].SubItems[0].Text);
item.SubItems.Add(listView_ready1.Items[select].SubItems[1].Text);
item.SubItems.Add(listView_ready1.Items[select].SubItems[2].Text);
item.SubItems.Add(listView_ready1.Items[select].SubItems[3].Text);
listView_occupy.Items.Add(item);
listView_ready1.Items.Remove(listView_ready1.Items[select]); //删除就绪队列中选中的进程
}
if (listView_ready1.Items.Count == 3)
{
int a = int.Parse(listView_ready1.Items[0].SubItems[2].Text);
int b = int.Parse(listView_ready1.Items[1].SubItems[2].Text);
int c = int.Parse(listView_ready1.Items[2].SubItems[2].Text);
int temp = a;
if (b > temp)
{
temp = b;
select = 1;
}
if (c > temp)
{
temp = c;
select = 2;
}
ListViewItem item = new ListViewItem(listView_ready1.Items[select].SubItems[0].Text);
item.SubItems.Add(listView_ready1.Items[select].SubItems[1].Text);
item.SubItems.Add(listView_ready1.Items[select].SubItems[2].Text);
item.SubItems.Add(listView_ready1.Items[select].SubItems[3].Text);
listView_occupy.Items.Add(item);
listView_ready1.Items.Remove(listView_ready1.Items[select]); //删除就绪队列中选中的进程
}
if (listView_ready1.Items.Count == 4)
{
int a = int.Parse(listView_ready1.Items[0].SubItems[2].Text);
int b = int.Parse(listView_ready1.Items[1].SubItems[2].Text);
int c = int.Parse(listView_ready1.Items[2].SubItems[2].Text);
int d = int.Parse(listView_ready1.Items[3].SubItems[2].Text);
int temp = a;
if (b > temp)
{
temp = b;
select = 1;
}
if (c > temp)
{
temp = c;
select = 2;
}
if (d > temp)
{
temp = d;
select = 3;
}
ListViewItem item = new ListViewItem(listView_ready1.Items[select].SubItems[0].Text);
item.SubItems.Add(listView_ready1.Items[select].SubItems[1].Text);
item.SubItems.Add(listView_ready1.Items[select].SubItems[2].Text);
item.SubItems.Add(listView_ready1.Items[select].SubItems[3].Text);
listView_occupy.Items.Add(item);
listView_ready1.Items.Remove(listView_ready1.Items[select]); //删除就绪队列中选中的进程
}
}
private void button_memory_set_Click(object sender, EventArgs e) //内存容量设置按钮
{
bool a = Regex.IsMatch(textBox_memory_set.Text, @"^\d+\d$+");
if (a == true)
memory = int.Parse(textBox_memory_set.Text);
else
MessageBox.Show(" 内存信息非法,请重新输入!");
}
Process pro;
private void button_pro_set_Click(object sender, EventArgs e) //新建进程按钮
{
if (textBox_name.Text == "" || textBox_time.Text == "" || textBox_priority.Text == "" || textBox_memory.Text == "")
MessageBox.Show("进程属性不完整,创建失败!");
else
{
bool a = Regex.IsMatch(textBox_name.Text, @"^[a-zA-Z]+\d$+");
bool b = Regex.IsMatch(textBox_time.Text, @"^\d+\d$+");
bool c = Regex.IsMatch(textBox_priority.Text, @"^\d+\d$+");
bool d = Regex.IsMatch(textBox_memory.Text, @"^\d+\d$+");
if (a == true && b == true && c == true && d == true)
{
if (int.Parse(textBox_memory.Text) > memory)
MessageBox.Show(" 内存资源不够,创建失败!");
else
{
memory -= int.Parse(textBox_memory.Text); //内存被使用,容量减小
pro = new Process(textBox_name.Text, textBox_time.Text, textBox_priority.Text, textBox_memory.Text);
if (listView_ready1.Items.Count < 3)
enter(listView_ready1);
else
enter(listView_ready2);
textBox_name.Text = "";
textBox_time.Text = "";
textBox_priority.Text = "";
textBox_memory.Text = "";
}
}
else
MessageBox.Show("进程信息非法,请正确输入!");
}
}
private void button_break_pro_Click(object sender, EventArgs e) //阻塞按钮
{
timer1.Enabled = false;
finishPro(listView_break);
listView_occupy.Items.Clear();
runPro();
if (listView_occupy.Items.Count > 0)
timer1.Enabled = true;
}
private void button_begin_Click(object sender, EventArgs e) //CPU开始工作按钮
{
runPro();
timer1.Enabled = true;
}
//***********************************************************//时间片定时器
bool flag = true;
int time_number = 0;
int timeSlice = 3;//时间片
int count = 0; //逐步增长,用于判断一个时间片是否结束
private void timer1_Tick(object sender, EventArgs e)
{
if (listView_ready2.Items.Count > 0)
{
if (listView_ready1.Items.Count < 3)
{
move(listView_ready1);
listView_ready2.Items.Remove(listView_ready2.Items[0]); //删除之前在后备队列中的进程
}
}
if (flag) //正常运行进程
{
int i = int.Parse(listView_occupy.Items[0].SubItems[1].Text);
int j = int.Parse(listView_occupy.Items[0].SubItems[2].Text);
i--;
if(j > 0)
j--;
listView_occupy.Items[0].SubItems[1].Text = i.ToString();
listView_occupy.Items[0].SubItems[2].Text = j.ToString();
count++; //逐步增长
time_number++;
}
if (int.Parse(listView_occupy.Items[0].SubItems[1].Text) == 0) //进程执行完进入完成队列
{
flag = false;
finishPro(listView_finish);
listView_occupy.Items.Clear();
}
else if (count == timeSlice) //时间片到了,进程被赶下去
{
flag = false;
Transfer(listView_ready1);
listView_occupy.Items.Clear();
}
if (flag == false && listView_ready1.Items.Count > 0) //针对时间片到了,进程被赶下去的措施
{
runPro(); //选择新的进程到CPU中
count = 0;
flag = true;
}
if(flag == false && listView_ready1.Items.Count == 0)
timer1.Enabled = false;
}
private void button_pause_Click(object sender, EventArgs e) //CPU工作暂停
{
timer1.Enabled = false;
}
private void button_continue_Click(object sender, EventArgs e) //CPU工作继续
{
timer1.Enabled = true;
}
private void button_rid_Click(object sender, EventArgs e) //唤醒在等待队列中的进程
{
//MessageBox.Show(listView_break.SelectedItems.Count.ToString());
if(listView_break.SelectedItems.Count > 0)
{
if (listView_ready1.Items.Count < 3)
wakePro(listView_ready1);
else
wakePro(listView_ready2);
listView_break.Items.Remove(listView_break.Items[0]);
}
}
private void button_reset_Click(object sender, EventArgs e) //重置,一键还原初始状态
{
textBox_memory_set.Text = "";
textBox_name.Text = "";
textBox_time.Text = "";
textBox_priority.Text = "";
textBox_memory.Text = "";
timer1.Enabled = false;
listView_occupy.Items.Clear();
listView_ready1.Items.Clear();
listView_ready2.Items.Clear();
listView_finish.Items.Clear();
listView_break.Items.Clear();
time_number = 0;
memory = 0;
count = 0;
}
private void button_exit_Click(object sender, EventArgs e) //退出程序按钮
{
Application.Exit();
}
}
//进程PCB类******************************************************************
public class Process
{
public string name; //进程名
public string need_time; //所需执行时间
public string priority; //优先级
public string need_memery; //所需内存大小
public string state; //进程状态 执行为0、就绪为1、被阻塞等待为2、完成为3
public Process() { }
public Process(string namePro, string need_timePro, string priorityPro, string need_memeryPro)
{
this.name = namePro;
this.need_time = need_timePro;
this.priority = priorityPro;
this.need_memery = need_memeryPro;
}
}
//**********************************************************************************
}
- C#版操作系统实验—CPU调度
- 操作系统面试—cpu调度
- 操作系统--CPU调度
- 操作系统之CPU调度
- 操作系统之CPU调度
- 操作系统---CPU调度
- 操作系统之CPU调度
- 操作系统CPU调度知识点
- 操作系统之CPU调度
- 操作系统-CPU调度
- 操作系统:CPU调度
- 操作系统04-CPU调度
- 操作系统实验——处理器调度
- 操作系统 调度算法实验
- 操作系统实验------处理机调度
- 操作系统中cpu调度算法
- 操作系统学习笔记:CPU调度
- 操作系统学习笔记:CPU调度
- 支付宝数据流程
- 欢迎使用CSDN-markdown编辑器
- 如何筛选APP推送平台来提升APP运营效果
- cocos2dx笔记之单例模式
- 导入连连支付demo到myeclipse10的三个问题
- C#版操作系统实验—CPU调度
- ServletContextListener
- mysql数据库优化(转载)
- javaWeb 复习系列(四)---- 多个请求映射到同一个 Servlet
- 设置nginx和PHP上传文件大小限制
- LightOJ 1370 Bi-shoe and Phi-shoe
- iptables详解
- 集合分解
- 为Fragment中的ListView添加Adapter