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;
        }
    } 
    //**********************************************************************************
}

 

1 0