加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

模拟进程调度管理[C#]

(2010-12-07 18:48:47)
标签:

操作系统

模拟进程调度

校园

分类: 编程之美

//***********************为进程创建的类Process.cs*************************
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
namespace 我们的实验  
    public class Process  
         
            public string name;   //进程名  
            public int arrive_time;      //到达时间  
            public int need_time;      //估计所需执行时间  
            public int wait_time;      //等待时间              
            public int need_memery;      //所需内存大小  
            public int need_printer;      //所需打印机数量  
            public int more_time;       //还需要执行的时间             
            public int state; //表示执行为0、就绪为1、被阻塞等待为2、完成为3  
            public int rank ; //处于哪个就绪队列1,2,3                     
            public Process() { }  
            public Process(string namePro,int arrive_timePro,int need_timePro,   
                    int need_memeryPro,int need_printerPro,int more_timePro)  
            
                this.name = namePro;  
                this.arrive_time = arrive_timePro;  
                this.need_time = need_timePro;  
                this.need_memery = need_memeryPro;  
                this.need_printer = need_printerPro;  
                this.more_time = more_timePro;  
            
    
 
//***********************类Form1.cs*************************
using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Linq;  
using System.Text;  
using System.Windows.Forms;  
namespace 我们的实验  
public partial class Form1 : Form  
      public Form1()  
        { InitializeComponent(); }  
private void button4_Click(object sender, EventArgs e)  //退出  
        
            this.Close();  
           
      static int totalMem =0;  
      static int totalPrinter=0;   //剩余的共有的资源数量     

      private void initial_set_Click(object sender, EventArgs e)  //初始化设置           
      { Form2 form2 = new Form2(this.text1, this.text2);  
            try 
            { form2.ShowDialog(this); }  
            finally 
             form2.Dispose();}  
            totalMem = int.Parse(this.text1.Text);  
            totalPrinter = int.Parse(this.text2.Text);   
                    
    public void newPro(ListView L)   //新建进程进入就绪队列1中  
        ListViewItem List = new ListViewItem(pro.name);  
            List.SubItems.Add(pro.arrive_time.ToString());  
            List.SubItems.Add(pro.need_time.ToString());  
            List.SubItems.Add(pro.need_memery.ToString());  
            List.SubItems.Add(pro.need_printer.ToString());  
            List.SubItems.Add(pro.more_time.ToString());  
            L.Items.Add(List);  
            new_pro_name.Text = "";  
            in_time.Text = "";  
            need_t.Text = "";  
            req_mem.Text = "";  
            req_printer.Text = "";  
       
    public void Transfer(Process p)  //时间片到了但没有执行完,进入就绪队列2  
        
            ListViewItem item = new ListViewItem(p.name);  
            item.SubItems.Add(p.arrive_time.ToString());  
            item.SubItems.Add(p.need_time.ToString());  
            item.SubItems.Add(p.need_memery.ToString());  
            item.SubItems.Add(p.need_printer.ToString());  
            item.SubItems.Add(p.more_time.ToString());  
            listView5.Items.Add(item);  
        
     public void finishPro(Process f)   //进程执行完后进入完成队列  
        
            ListViewItem item = new ListViewItem(f.name);  
            item.SubItems.Add(f.arrive_time.ToString());  
            item.SubItems.Add(f.need_time.ToString());  
            item.SubItems.Add(f.need_memery.ToString());  
            item.SubItems.Add(f.need_printer.ToString());  
            item.SubItems.Add(f.more_time.ToString());  
            listView3.Items.Add(item);  
        
     public void occupyCPU()   //正在占用CPU的进程  
        
            if (listView7.Items.Count != 0)  
                listView7.Items.Remove(listView7.Items[0]);  
            ListViewItem item = new ListViewItem(process.name);  
            item.SubItems.Add(process.arrive_time.ToString());  
            item.SubItems.Add(process.need_time.ToString());  
            item.SubItems.Add(process.need_memery.ToString());  
            item.SubItems.Add(process.need_printer.ToString());  
            item.SubItems.Add(process.more_time.ToString());  
            listView7.Items.Add(item);  
        
    public void wakePro(Process w)   //被唤醒的进程进入就绪队列3中  
        
            ListViewItem item = new ListViewItem(w.name);  
            item.SubItems.Add(w.arrive_time.ToString());  
            item.SubItems.Add(w.need_time.ToString());  
            item.SubItems.Add(w.need_memery.ToString());  
            item.SubItems.Add(w.need_printer.ToString());  
            item.SubItems.Add(w.more_time.ToString());  
            listView6.Items.Add(item);  
        
 public void blockPro(Process b)  //被阻塞的进程进入等待队列   
        
            ListViewItem item = new ListViewItem(b.name);  
            item.SubItems.Add(b.arrive_time.ToString());  
            item.SubItems.Add(b.need_time.ToString());  
            item.SubItems.Add(b.need_memery.ToString());  
            item.SubItems.Add(b.need_printer.ToString());  
            item.SubItems.Add(b.more_time.ToString());  
            listView2.Items.Add(item);  
          
        Process pro;  
       private void new_job_Click(object sender, EventArgs e) //新建进程  
        { try 
            { if (new_pro_name.Text != null && in_time.Text != null)  
                  
 pro = new Process(new_pro_name.Text, int.Parse(in_time.Text), int.Parse(need_t.Text), int.Parse(req_mem.Text), int.Parse(req_printer.Text), int.Parse(need_t.Text));  
         if ((int.Parse(req_printer.Text) > totalPrinter) || (int.Parse(req_mem.Text) > totalMem))  
           
 MessageBox.Show("内存和打印机资源不够", "创建进程失败", MessageBoxButtons.OK, MessageBoxIcon.Information);  
               return;  
             
          else 
             
               newPro(listView1);  
                newPro(listView4);  
                totalMem = totalMem - pro.need_memery;  
                 totalPrinter = totalPrinter - pro.need_printer;  
                 return;  
                  
              
           else 
              
                    MessageBox.Show("输入进程名", "创建进程失败", MessageBoxButtons.OK, MessageBoxIcon.Information);  
                    return;  
                
            
            catch 
            { MessageBox.Show(""); }  
          
private void button3_Click(object sender, EventArgs e)  //exit  
        
            this.Close();  
           
  Process process = new Process(null, 0, 0, 0, 0, 0);  
    public void runPro()      //多级反馈轮转调度算法  
                  
            int ready =0;  
            if (listView1.Items.Count != 0)  
            
          ready = 1;  
          process.rank = 1;   process.state = 1;  
          process.name = listView1.Items[0].SubItems[0].Text;  
          process.arrive_time = int.Parse(listView1.Items[0].SubItems[1].Text);  
          process.need_time = int.Parse(listView1.Items[0].SubItems[2].Text);  
          process.need_memery = int.Parse(listView1.Items[0].SubItems[3].Text);  
         process.need_printer = int.Parse(listView1.Items[0].SubItems[4].Text);  
         process.more_time = int.Parse(listView1.Items[0].SubItems[5].Text);  
                listView1.Items.Remove(listView1.Items[0]);  
            
            else if (listView5.Items.Count != 0)  
            
         ready = 2;  
         process.rank = 2;     process.state = 1;  
         process.name = listView5.Items[0].SubItems[0].Text;  
         process.arrive_time = int.Parse(listView5.Items[0].SubItems[1].Text);  
         process.need_time = int.Parse(listView5.Items[0].SubItems[2].Text);  
         process.need_memery = int.Parse(listView5.Items[0].SubItems[3].Text);  
         process.need_printer = int.Parse(listView5.Items[0].SubItems[4].Text);  
         process.more_time = int.Parse(listView5.Items[0].SubItems[5].Text);     
         listView5.Items.Remove(listView5.Items[0]);  
            
else if (listView6.Items.Count != 0)  
            
         ready = 3;  
         process.rank = 3;  process.state = 1;  
         process.name = listView6.Items[0].SubItems[0].Text;  
         process.arrive_time = int.Parse(listView6.Items[0].SubItems[1].Text);  
         process.need_time = int.Parse(listView6.Items[0].SubItems[2].Text);  
         process.need_memery = int.Parse(listView6.Items[0].SubItems[3].Text);  
         process.need_printer = int.Parse(listView6.Items[0].SubItems[4].Text);  
         process.more_time = int.Parse(listView6.Items[0].SubItems[5].Text);  
         listView6.Items.Remove(listView6.Items[0]);  
            
            if (ready == 0)  
            process.name = "";  
                process.arrive_time = 0;  
                process.need_time = 0;  
                process.need_memery = 0;  
                process.need_printer = 0;  
                process.more_time = 0;  
            
            else 
                process.state = 0;  
       if (listView7.Items.Count != 0)  
listView7.Items.Remove(listView7.Items[0]);  
                 ListViewItem item = new ListViewItem(process.name);  
                  item.SubItems.Add(process.arrive_time.ToString());  
                  item.SubItems.Add(process.need_time.ToString());  
                  item.SubItems.Add(process.need_memery.ToString());  
                  item.SubItems.Add(process.need_printer.ToString());  
                 listView7.Items.Add(item);  
       int c = ready;  

   
            if (ready == 1)  //就绪队列1为新建的进程  
               timeSlice = 2;  
            else if (ready == 2)  //就绪队列2为时间片到了但没有执行完的进程  
                timeSlice = 3;  
            else if (ready == 3)  //就绪队列3是从等待队列中被唤醒的进程  
                timeSlice = 4;  
            else   
             
                timeSlice = 0;  
               timer1.Enabled = false;             
               MessageBox.Show("所有就绪队列中进程执行结束", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information);  
            
        
     public void runFCFS() //先进先服务调度算法  
        
            if (listView1.Items.Count != 0)  
            
          process.name = listView1.Items[0].SubItems[0].Text;  
          process.arrive_time = int.Parse(listView1.Items[0].SubItems[1].Text);  
          process.need_time = int.Parse(listView1.Items[0].SubItems[2].Text);  
          process.need_memery = int.Parse(listView1.Items[0].SubItems[3].Text);  
         process.need_printer = int.Parse(listView1.Items[0].SubItems[4].Text);  
         process.more_time = int.Parse(listView1.Items[0].SubItems[5].Text);  
         listView1.Items.Remove(listView1.Items[0]);  
            
            else 
            
                MessageBox.Show("没有就绪状态的进程", "消息", MessageBoxButtons.OK,MessageBoxIcon.Information);  
            
          
        int timeSlice=0;  
        bool flag=true  
        int count = 0;  
   private void timer1_Tick(object sender, EventArgs e) //时间片的控制  
        
            if (flag)  
            
                process.more_time--;  
                count++;  
            
            if (process.more_time == 0)  
            
                flag = false;  
                process.state = 3;  
                finishPro(process);  
            
            else if (count ==timeSlice)  
            
                flag = false;  
                Transfer(process);  
            
           occupyCPU();  
            if (flag == false && process.name!= null)  
            
                runPro();  
                count = 0;  
                flag = true;  
            
            if (process.name== null)              
 
            MessageBox.Show("全部就绪队列已经执行完毕!!!", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information);  
        
     private void start_Click_1(object sender, EventArgs e) //开始模拟  
        
            if (radioButton1.Checked)  
            
                runPro();  
                occupyCPU();  
                timer1.Enabled = true;  
            
            else  if (radioButton2.Checked)  
            
                runFCFS();  
                occupyCPU();  
                timer1.Enabled = true;  
            
            else 
            
                MessageBox.Show("请选择调度算法", "消息", MessageBoxButtons.OK,  
                   MessageBoxIcon.Information);  
            
        
     private void button1_Click(object sender, EventArgs e) //阻塞进程  
        
            timer1.Enabled = false;  
            process.state = 2;  
            blockPro(process);  
            runPro();  
            if (timeSlice!=0)  
                timer1.Enabled = true;  
            else      
                MessageBox.Show("没有就绪状态的进程", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information);  
        
        int index = 0;  
private void button2_Click(object sender, EventArgs e) //唤醒等待队列中的进程    
        
            if (listView2.Items.Count != 0)  
            
 Process p1=new Process(listView2.Items[index].SubItems[0].Text, int.Parse(listView2.Items[0].SubItems[1].Text),  
                    int.Parse(listView2.Items[0].SubItems[2].Text), int.Parse(listView2.Items[0].SubItems[3].Text),                    int.Parse(listView2.Items[0].SubItems[4].Text),  
int.Parse(listView2.Items[0].SubItems[5].Text));  
                wakePro(p1);    //唤醒进程  
               listView2.Items.Remove(listView2.Items[index]);  
                if (int.Parse(listView7.Items[0].SubItems[1].Text) == 0)  
                    runPro();  
                timer1.Enabled = true;  
            
            else 
            MessageBox.Show("没有进程阻塞", "消息", MessageBoxButtons.OK,  
                  MessageBoxIcon.Information);  
        
        private void reset_Click(object sender, EventArgs e) //重置  
        
            listView1.Items.Clear();  
            listView2.Items.Clear();  
            listView3.Items.Clear();  
            listView4.Items.Clear();  
            listView5.Items.Clear();  
            listView6.Items.Clear();  
            listView7.Items.Clear();  
            text1.Text = "";  
            text2.Text = "";  
            new_pro_name.Text = "";  
            in_time.Text = "";  
            need_t.Text = "";  
            req_mem.Text = "";  
            req_printer.Text = "";  
            radioButton1.Checked = false;  
            radioButton2.Checked = false;  
        
        private void button5_Click(object sender, EventArgs e) //重置  
        
            listView3.Items.Clear();  
            listView4.Items.Clear();  
        
        private void button6_Click(object sender, EventArgs e) //暂停  
        
            timer1.Enabled = false;  
        
        private void button7_Click(object sender, EventArgs e) //继续  
        
            timer1.Enabled = true;  
        
    

http://hi.csdn.net/attachment/201009/7/3402867_12838695524K1i.png

http://hi.csdn.net/attachment/201009/7/3402867_1283869545Qc9o.png

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有