操作系统模拟实验——处理器调度 c#模拟

一、实习内容

选择一个调度算法,实现处理器调度。

二、实习目的

本实习模拟在单处理器环境下的处理器调度,加深了解处理器调度的工作。

三、实习题目

设计一个按时间片轮转法实现处理器调度的程序
[提示]:
(1)假定系统有5个进程,每个进程用一个PCB来代表。PCB的结构为:
·进程名——如Q1~Q5。
·指针——把5个进程连成队列,用指针指出下一个进程PCB的首地址。
·要求运行时间——假设进程需要运行的时间单位数。
·已运行时间——进程已运行的时间单位数,初始值为0。
·状态——假设两种状态,就绪和结束,用R表示就绪,用E表示结束。初始状态都为就绪状态。
(2) 运行之前,为每个进程确定它的“要求运行时间”。通过键盘输入这些参数。
(3) 把5个进程按顺序排成循环队列,用指针指出队列连接情况。用一个标志单元记录轮到运行的进程。处理器调度总是选择标志单元指示的进程运行,对所指的进程,将其“已运行时间”加1。
(4) 进程运行一次后,若“要求运行时间”等于“已运行时间”,则将状态改为“结束”,退出队列,否则将继续轮转。
(5) 若就绪队列为空,结束,否则转到(3)重复。
要求能接受键盘输入的进程要求运行时间,能显示每次进程调度的情况,如哪个进程在运行,哪些进程就绪。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CaoZuoXiTong1
{
    class Program
    {

       public static PCB[] pcb = new PCB[5];
       public static  int number=0;//进程号
        static void Main(string[] args)
        {
            try
            {
                for (int i = 0; i < 5; i++)//初始化
                {
                    string name = "Q" + i;
                    pcb[i] = new PCB(name);
                    Console.WriteLine("请输入进程" + name + "的要求运行时间:");
                    pcb[i].RTime = Convert.ToDouble(Console.ReadLine());
                }
                Program.work();
            }
            catch
            {
                Console.WriteLine("输入错误");
            }

        }

        static public void work()
        {
            if (pcb[0].judge == PCB.IsOrNot.E && pcb[1].judge == PCB.IsOrNot.E && pcb[2].judge == PCB.IsOrNot.E && pcb[3].judge == PCB.IsOrNot.E && pcb[4].judge == PCB.IsOrNot.E)
            {
                Console.WriteLine("进程全部运行结束");
            }
            else
            {
                if (pcb[number % 5].judge == PCB.IsOrNot.R)
                {
                    Console.WriteLine("进程" + pcb[number % 5].Name + "正在运行,此时所有进程的状态为:\n");
                    Console.WriteLine("Q0:" + pcb[0].judge.ToString());
                    Console.WriteLine("Q1:" + pcb[1].judge.ToString());
                    Console.WriteLine("Q2:" + pcb[2].judge.ToString());
                    Console.WriteLine("Q3:" + pcb[3].judge.ToString());
                    Console.WriteLine("Q4:" + pcb[4].judge.ToString() + "\n\n");
                    pcb[number % 5].CTime += 1;//进程运行一次
                    if (pcb[number % 5].CTime == pcb[number % 5].RTime) pcb[number % 5].judge = PCB.IsOrNot.E;
                    number += 1;
                }
                else number += 1;
                work();

            }
        }

    }


    
    class PCB
    {
        public string Name { set; get; }//进程名
        public double RTime { set; get; }//要求运行时间
        public double CTime { set; get; }//已经完成运行时间
        public enum IsOrNot
        {
            R,E     //R未完成,E已完成
        }


        public IsOrNot judge;
        public PCB(string name)
        {
            Name = name;
            CTime = 0;
            RTime = 0;
            judge= IsOrNot.R;
        }
    }
}

才疏学浅,如有错误请多指正

转载请注明出处

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值