示例#1
0
        public void run()
        {
            double time = 0;

            free   = 0;
            busy   = 0;
            number = new List <int>();
            while ((listQ.Count != 0) || (queue.Count != 0))
            {
                checkQueue(time);
                cluster.voting();
                if ((listQ.Count > 0) || (cluster.freeCluster(time)))
                {
                    number.Add(listQ.Count);
                    while ((listQ.Count > 0) && (cluster.freeCluster(time)))
                    {
                        Task t = listQ.Dequeue();
                        cluster.setTask(time + quantum);
                        t.execute(time, quantum);
                        //В список решенных
                        if (t.getTime() > 0)
                        {
                            ready.Enqueue(t);
                        }
                        //На дальнейшую обработку
                        else
                        {
                            listQ.Enqueue(t);
                        }
                    }
                }
                if (!cluster.freeCluster(time))
                {
                    time = cluster.getFirstTime() + 0.00001;
                }
                else
                {
                    double initTime = double.MaxValue;
                    for (int i = 0; i < queue.Count; i++)
                    {
                        if (queue.ElementAt(i).getTimeInit() < initTime)
                        {
                            initTime = queue.ElementAt(i).getTimeInit();
                        }
                    }
                    if (initTime == double.MaxValue)
                    {
                        time = double.MaxValue;
                    }
                    else
                    {
                        time = initTime + 0.00001;
                    }
                }
            }
        }
示例#2
0
        public void checkQueue(double time)
        {
            List <int> ptr = new List <int>();

            //Загружаем задачи из плана
            for (int i = 0; i < queue.Count; i++)
            {
                Task t = queue.ElementAt(i);
                if (time > t.getTimeInit())
                {
                    listQ.Enqueue(t);
                    ptr.Add(t.getId());
                }
            }
            foreach (int p in ptr)
            {
                Task t = null;
                foreach (Task t1 in queue)
                {
                    if (t1.getId() == p)
                    {
                        t = t1;
                        break;
                    }
                }
                queue.Remove(t);
            }
            //Удаляем просроченные задачи
            ptr = new List <int>();
            for (int i = 0; i < listQ.Count; i++)
            {
                Task t = listQ.ElementAt(i);
                if (time > (t.getTimeInit() + t.getDeadline()))
                {
                    ptr.Add(t.getId());
                }
            }
            foreach (int p in ptr)
            {
                Task t = null;
                foreach (Task t1 in listQ)
                {
                    if (t1.getId() == p)
                    {
                        t = t1;
                        break;
                    }
                }
                t.setEnd(time);
                ready.Enqueue(t);
                listQ.Remove(t);
            }
        }
示例#3
0
        public RR(double lambda, List <double> t, List <int> k, int n, double quantum, int clusterNum, double a, double b, List <double> percent, double tetta, double eps, double crit)
        {
            queue = new ListQueue <Task>();
            ListQueue <Task> listQueue = new ListQueue <Task>();
            Random           random    = new Random();
            int id = 0;

            for (int i = 0; i < t.Count; i++)
            {
                double time         = 0;
                double timeDeadline = k.ElementAt(i) * t.ElementAt(i);
                for (int j = 0; j < n; j++)
                {
                    time += generateEvent(lambda);
                    double timeTaskInit = time;
                    double trust        = random.NextDouble();
                    listQueue.Enqueue(new Task(timeTaskInit, timeDeadline, t.ElementAt(i), id, trust));
                    id++;
                }
            }
            // Надо добавить идентификаторы что бы потом удобно переносить
            while (listQueue.Count != 0)
            {
                double initTime = double.MaxValue;
                int    ptr      = 0;
                for (int i = 0; i < listQueue.Count; i++)
                {
                    if (listQueue.ElementAt(i).getTimeInit() < initTime)
                    {
                        ptr      = i;
                        initTime = listQueue.ElementAt(i).getTimeInit();
                    }
                }
                queue.Enqueue(listQueue.ElementAt(ptr));
                listQueue.RemoveAt(ptr);
            }
            listQ = new ListQueue <Task>();
            ready = new ListQueue <Task>();
            //overdue = new ListQueue<Task>();
            this.quantum = quantum;
            cluster      = new Cluster(clusterNum, percent, tetta, eps, crit);
            this.a       = a;
            this.b       = b;
        }
示例#4
0
        public void run()
        {
            number = new List <int>();
            free   = 0;
            busy   = 0;
            double time = 0;

            while ((listQ.Count != 0) || (queue.Count != 0))
            {
                checkQueue(time);
                cluster.voting();
                if ((listQ.Count > 0) || (cluster.freeCluster(time)))
                {
                    number.Add(listQ.Count);
                    double nextTime = double.MaxValue;
                    while ((listQ.Count > 0) && (cluster.freeCluster(time)))
                    {
                        double T     = 0;
                        double score = double.MaxValue;
                        int    ptr   = -1;
                        for (int i = 0; i < listQ.Count; i++)
                        {
                            if (getScore(listQ.ElementAt(i), time) < score)
                            {
                                score = getScore(listQ.ElementAt(i), time);
                                ptr   = i;
                            }
                        }
                        T = listQ.ElementAt(ptr).getTime();
                        listQ.ElementAt(ptr).execute(time);
                        Task t = listQ.ElementAt(ptr);
                        listQ.Remove(t);
                        //В список решенных
                        ready.Enqueue(t);
                        //time += T;
                        //busy += T;
                        if (T < nextTime)
                        {
                            nextTime = T;
                        }
                    }
                    time += nextTime;
                }
                else
                {
                    double initTime = double.MaxValue;
                    int    ptr      = 0;
                    for (int i = 0; i < queue.Count; i++)
                    {
                        if (queue.ElementAt(i).getTimeInit() < initTime)
                        {
                            ptr      = i;
                            initTime = queue.ElementAt(i).getTimeInit();
                        }
                    }
                    if (initTime == double.MaxValue)
                    {
                        time = double.MaxValue;
                    }
                    else
                    {
                        free += (initTime + 0.00000000000001) - time;
                        time  = initTime + 0.00000000000001;
                    }
                }
            }
        }