Beispiel #1
0
        public bool EsLaCantidadMenor(double _cant)
        {
            double?   cantidadMenor = null;
            Particion actual        = Primera;

            while (actual != null)
            {
                if (!actual.Ocupada)
                {
                    if (cantidadMenor == null && actual.Size >= _cant)
                    {
                        cantidadMenor = actual.Size;
                    }
                    else
                    {
                        if (actual.Size <= cantidadMenor && actual.Size >= _cant)
                        {
                            cantidadMenor = actual.Size;
                        }
                    }
                }
                actual = actual.Siguiente;
            }
            if (_cant <= cantidadMenor)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
Beispiel #2
0
        public Particion TraerUltimo()
        {
            Particion actual = Primera;

            while (actual.Siguiente != null)
            {
                actual = actual.Siguiente;
            }
            return(actual);
        }
Beispiel #3
0
        public Particion CrearParticion(double _size, bool _estado, string _titulo)
        {
            double value = (_size * 100) / Size;

            value = Nucleo.Truncate(value, 0);
            double porcentaje = 0;

            if (value.ToString().Length == 1)
            {
                porcentaje = double.Parse(".0" + value.ToString());
            }
            else
            {
                porcentaje = double.Parse("." + value.ToString());
            }

            double    height    = porcentaje * Height;
            int       heightInt = (int)height;
            Particion P         = new Particion(_size, heightInt, _estado, _titulo);

            return(P);
        }
Beispiel #4
0
        public IEnumerator GetEnumerator()
        {
            if (modo == "particiones")
            {
                Particion actual = Ultima;
                while (actual != null)
                {
                    yield return(actual);

                    actual = actual.Anterior;
                }
            }
            else if (modo == "tareas")
            {
                Particion actual = Primera;
                while (actual != null)
                {
                    if (actual.Ocupada)
                    {
                        yield return(actual);
                    }
                    actual = actual.Siguiente;
                }
            }
            else if (modo == "libres")
            {
                Particion actual = Ultima;
                while (actual != null)
                {
                    if (!actual.Ocupada)
                    {
                        yield return(actual);
                    }
                    actual = actual.Anterior;
                }
            }
        }
Beispiel #5
0
        /// <summary>
        /// Agrega el sistema operativo
        /// </summary>
        /// <param name="_size">Tamaño dado en KB</param>
        /// <returns></returns>
        public bool AgregarSO(double _size)
        {
            if (_size <= (Size * .3))
            {
                double value = (_size * 100) / Size;
                value = Dinamica.Nucleo.Truncate(value, 0);
                double porcentaje = 0;
                if (value.ToString().Length == 1)
                {
                    porcentaje = double.Parse(".0" + value.ToString());
                }
                else
                {
                    porcentaje = double.Parse("." + value.ToString());
                }

                double height    = porcentaje * Height;
                int    heightInt = (int)height;
                if (_size <= (Size * .3))
                {
                    SO                 = new Particion(_size, heightInt);
                    SO.SO              = true;
                    MemoriaDisponible -= SO.Size;
                    AgregarParticion(MemoriaDisponible, false, "Sistema operativo");
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            else
            {
                return(false);
            }
        }
Beispiel #6
0
        public static Particion operator +(Particion _p1, Particion _p2)
        {
            Particion _resultante = new Particion((_p1.Size + _p2.Size), (_p1.Height + _p2.Height));

            return(_resultante);
        }
Beispiel #7
0
        public bool Librear(int _cont)
        {
            bool      liberado   = false;
            bool      encontrado = false;
            Particion actual     = Primera;
            int       count      = -1;

            while (actual != null && !encontrado)
            {
                if (actual.Ocupada)
                {
                    count++;
                }

                //MessageBox.Show($"-->({count}) id: {actual.id} ");
                if (count == _cont)
                {
                    encontrado = true;
                    //en caso de que tenga los dos espacios libres
                    if (actual.Anterior != null && !actual.Anterior.Ocupada && actual.Siguiente != null && !actual.Siguiente.Ocupada)
                    {
                        //MessageBox.Show("Dos espacios libres para combinar");
                        double    SizeTotal = actual.Anterior.Size + actual.Size + actual.Siguiente.Size;
                        Particion p         = CrearParticion(SizeTotal, false);
                        p.Siguiente = actual.Siguiente.Siguiente;
                        if (actual.Siguiente.Siguiente != null)
                        {
                            actual.Siguiente.Siguiente.Anterior = p;
                        }
                        else
                        {
                            Ultima = p;
                        }
                        p.Anterior = actual.Anterior.Anterior;
                        if (actual.Anterior.Anterior != null)
                        {
                            actual.Anterior.Anterior.Siguiente = p;
                        }
                        else
                        {
                            Primera = p;
                        }
                    }
                    else if ((actual.Anterior != null && !actual.Anterior.Ocupada) || (actual.Siguiente != null && !actual.Siguiente.Ocupada))
                    {
                        //En caso de que tenga un espacio liberado anterior
                        if (actual.Anterior != null && !actual.Anterior.Ocupada)
                        {
                            //   MessageBox.Show($"Espacio libre a anterior de {actual.id} detectado");
                            //En caso de que se trate del primer elemento
                            if (actual.Anterior.Anterior == null)
                            {
                                double    SizeTotal = actual.Anterior.Size + actual.Size;
                                Particion p         = CrearParticion(SizeTotal, false);
                                p.Siguiente = actual.Siguiente;
                                if (actual.Siguiente != null)
                                {
                                    actual.Siguiente.Anterior = p;
                                }
                                actual.Anterior = p;
                                Primera         = p;
                                encontrado      = true;
                            }
                            else
                            {
                                double    SizeTotal = actual.Anterior.Size + actual.Size;
                                Particion p         = CrearParticion(SizeTotal, false);
                                p.Siguiente = actual.Siguiente;
                                if (actual.Siguiente != null)
                                {
                                    actual.Siguiente.Anterior = p;
                                }
                                else
                                {
                                    Ultima = p;
                                }
                                p.Anterior = actual.Anterior.Anterior;
                                actual.Anterior.Anterior.Siguiente = p;
                                encontrado = true;
                            }
                        }
                        //En caso de que tenga un espacio liberado siguiente
                        if (actual.Siguiente != null && !actual.Siguiente.Ocupada)
                        {
                            // MessageBox.Show("Espacio libre al siguiente detectado");                            //En caso de que se trate del primer elemento
                            if (actual.Anterior == null)
                            {
                                double    SizeTotal = actual.Size + actual.Siguiente.Size;
                                Particion p         = CrearParticion(SizeTotal, false);
                                p.Siguiente = actual.Siguiente.Siguiente;
                                if (actual.Siguiente.Siguiente != null)
                                {
                                    actual.Siguiente.Siguiente.Anterior = p;
                                }
                                else
                                {
                                    Ultima = p;
                                }
                                Primera    = p;
                                liberado   = true;
                                encontrado = true;
                            }
                            else
                            {
                                double    SizeTotal = actual.Size + actual.Siguiente.Size;
                                Particion p         = CrearParticion(SizeTotal, false);
                                p.Siguiente = actual.Siguiente.Siguiente;
                                if (actual.Siguiente.Siguiente != null)
                                {
                                    actual.Siguiente.Siguiente.Anterior = p;
                                }
                                else
                                {
                                    Ultima = p;
                                }

                                p.Anterior = actual.Anterior;
                                actual.Anterior.Siguiente = p;
                                liberado   = true;
                                encontrado = true;
                            }
                        }
                    }
                    //No tiene espaciso libres a los lados
                    else
                    {
                        //MessageBox.Show("Aqui entra");
                        Particion na = new Particion(actual.Size, actual.Height);
                        na.Ocupada   = false;
                        na.Siguiente = actual.Siguiente;
                        na.Anterior  = actual.Anterior;
                        if (actual.Siguiente != null || actual.Anterior != null)
                        {
                            if (actual.Anterior != null)
                            {
                                actual.Anterior.Siguiente = na;
                            }
                            else
                            {
                                Primera = na;
                            }
                            if (actual.Siguiente != null)
                            {
                                actual.Siguiente.Anterior = na;
                            }
                            else
                            {
                                Ultima = na;
                            }
                        }


                        liberado = true;
                    }
                }
                else
                {
                    actual = actual.Siguiente;
                }
            }

            //Agregar los del StandBy
            if (encontrado)
            {
                bool      bandera = false;
                Particion pAux    = null;
                foreach (Particion p in StandBy)
                {
                    actual = Primera;
                    while (actual != null)
                    {
                        if (!actual.Ocupada)
                        {
                            if (p.Size <= actual.Size && !bandera)
                            {
                                p.Siguiente = actual.Siguiente;
                                p.Anterior  = actual.Anterior;
                                pAux        = p;
                                bandera     = true;
                            }
                        }
                        actual = actual.Siguiente;
                    }

                    if (pAux != null)
                    {
                        break;
                    }
                }
                //Verifica si uno de los del StandBy puede entrar
                if (bandera)
                {
                    nombresUsados.Remove(pAux.id);
                    AgregarParticion(pAux.Size, pAux.Ocupada, pAux.id);
                    StandBy.Remove(pAux);
                }
            }

            return(liberado);
        }
Beispiel #8
0
        public bool AgregarParticion(double _size, bool _estado, string _titulo)
        {
            bool      encontradoTitulo = false;
            Particion actual           = Primera;

            while (actual != null && !encontradoTitulo)
            {
                if (actual.id == _titulo)
                {
                    encontradoTitulo = true;
                    MessageBox.Show("El nombre de la tarea ya existe");
                }
                actual = actual.Siguiente;
            }
            if (!encontradoTitulo)
            {
                foreach (string x in nombresUsados)
                {
                    if (x == _titulo)
                    {
                        encontradoTitulo = true;
                        MessageBox.Show("El nombre de la tarea ya ha sido utilizado con anterioridad");
                    }
                }
            }
            if (!encontradoTitulo)
            {
                //En caso de no existir ninguna particion
                if (Primera == null)
                {
                    if (_size <= MemoriaDisponible)
                    {
                        Particion P = CrearParticion(_size, _estado, _titulo);
                        Primera = P;
                        Ultima  = TraerUltimo();
                        nombresUsados.Add(_titulo);
                        return(true);
                    }
                    else
                    {
                        MessageBox.Show("No hay memoria disponible");
                        return(false);
                    }
                }
                else
                {
                    bool insertado = false;
                    actual = Primera;
                    //En caso de tener solo 1 particion
                    if (actual.Siguiente == null)
                    {
                        if (!actual.Ocupada)
                        {
                            if (_size <= actual.Size)
                            {
                                insertado = true;
                                if ((actual.Size - _size) != 0)
                                {
                                    Particion P = CrearParticion(_size, _estado, _titulo);
                                    nombresUsados.Add(_titulo);
                                    Particion next = CrearParticion((actual.Size - _size), false);
                                    next.Anterior = P;
                                    P.Siguiente   = next;
                                    Primera       = P;
                                    Ultima        = TraerUltimo();
                                }
                                else
                                {
                                    Particion P = CrearParticion(_size, _estado, _titulo);
                                    nombresUsados.Add(_titulo);
                                    Primera = P;
                                    Ultima  = TraerUltimo();
                                }
                            }
                        }
                    }
                    while (actual != null && !insertado)
                    {
                        if (actual.Ocupada)
                        {
                            actual = actual.Siguiente;
                        }
                        else
                        {
                            if (_size <= actual.Size)
                            {
                                if (EsLaCantidadMenor(actual.Size))
                                {
                                    //Tiene un anterior
                                    if (actual.Anterior != null)
                                    {
                                        //Particion con la tarea
                                        Particion P = CrearParticion(_size, _estado, _titulo);
                                        nombresUsados.Add(_titulo);
                                        Particion anterior = actual.Anterior;

                                        if ((actual.Size - _size) != 0)
                                        {
                                            //Particion con  el espacio libre
                                            Particion aux = CrearParticion((actual.Size - _size), false);
                                            aux.Siguiente = actual.Siguiente;
                                            aux.Anterior  = P;
                                            P.Siguiente   = aux;
                                            P.Anterior    = anterior;
                                            if (actual.Siguiente != null)
                                            {
                                                actual.Siguiente.Anterior = aux;
                                            }
                                            anterior.Siguiente = P;
                                            Ultima             = TraerUltimo();
                                            insertado          = true;
                                        }
                                        else
                                        {
                                            //Solo la particion completa
                                            P.Siguiente = actual.Siguiente;
                                            P.Anterior  = anterior;
                                            if (actual.Siguiente != null)
                                            {
                                                actual.Siguiente.Anterior = P;
                                            }
                                            anterior.Siguiente = P;
                                            Ultima             = TraerUltimo();
                                            insertado          = true;
                                        }
                                    }
                                    else
                                    {
                                        if ((actual.Size - _size) != 0)
                                        {
                                            MessageBox.Show("x1");
                                            Particion P = CrearParticion(_size, _estado, _titulo);
                                            nombresUsados.Add(_titulo);
                                            P.Siguiente = CrearParticion((actual.Size - _size), false).Siguiente = actual.Siguiente;
                                            Primera     = P;
                                            Ultima      = TraerUltimo();
                                        }
                                        else
                                        {
                                            MessageBox.Show("x2");
                                            Particion P = CrearParticion(_size, _estado, _titulo);
                                            P.Siguiente = actual.Siguiente;
                                            if (actual.Siguiente != null)
                                            {
                                                actual.Siguiente.Anterior = P;
                                            }
                                            nombresUsados.Add(_titulo);
                                            actual  = P;
                                            Primera = P;
                                            Ultima  = TraerUltimo();
                                        }
                                    }
                                }
                                else
                                {
                                    actual = actual.Siguiente;
                                }
                            }
                            else
                            {
                                actual = actual.Siguiente;
                            }
                        }
                    }
                    if (!insertado)
                    {
                        //Agregar al StandBy
                        if (_size <= (MemoriaTotal - SO.Size))
                        {
                            Particion P = CrearParticion(_size, _estado, _titulo);
                            nombresUsados.Add(_titulo);
                            StandBy.Add(P);
                        }
                        else
                        {
                            MessageBox.Show("No hay espacio disponible");
                        }
                    }
                    return(insertado);
                }
            }
            else
            {
                MessageBox.Show("Titulo utilizado");
                return(false);
            }
        }