예제 #1
0
        private void New_Alloc(Process proc)                                   //método que nos permitirá alojar nuevas particiones en memoria
        {
            var dummypart = new Partition(proc.Get_size(), Size_Calc(), proc); //creamos una nueva partición
            int placeholder = 0, tam = 0, dir = 0;

            foreach (var element in memory)
            {
                if (element.Get_status() && element.Get_process().Get_size() >= proc.Get_size()) //esto es el algoritmo first-fit, encontraremos el primer elemento que sea de tamaño mayor o igual al proceso a insertar
                {
                    dir         = element.Get_dir();
                    tam         = element.Get_process().Get_size() - proc.Get_size();
                    placeholder = memory.IndexOf(element);
                    break;
                }
            }
            if (placeholder == 0)
            {
                var tem = new QueueObj(proc);
                queue2.Add(tem);
                queue.Remove(tem);
                //hacer nada o mover proceso a otra cola para mayor prioridad
            }
            else if (placeholder != 0)

            {
                dummypart.Set_dir(dir);
                var temp = new Partition(tam, dummypart.Get_end_dir(), 0);
                temp.Set_status(true);
                memory.RemoveAt(placeholder);
                memory.Insert(placeholder, dummypart);
                if (tam != 0)
                {
                    memory.Insert(placeholder + 1, temp);
                }
            }

            /*
             * var lastinlist = memory[memory.Count - 1]; //obtenemos la partición vacía
             * lastinlist.Get_process().Set_size(lastinlist.Get_process().Get_size() - proc.Get_size()); //Modificamos el tamaño de la localidad vacía, se le resta el tamaño de la nueva localidad creada
             * lastinlist.Set_dir(dummypart.Get_end_dir()); //modificamos la dirección de la memoria vacía, ahora está en donde termina la partición introducida
             * memory.RemoveAt(memory.Count - 1); //eliminamos el último elemento de la lista, es decir, la partición vacía
             * memory.Add(dummypart); //añadimos la nueva partición
             * memory.Add(lastinlist); //volvemos a incluir la partición vacía
             * this.Update_Table(); // actualizamos la tabla de particiones
             * button1.Enabled = true; //activamos el botón para dar otro paso
             */
            this.Update_Table();    // actualizamos la tabla de particiones
            this.Update_Memory();
            button1.Enabled = true; //activamos el botón para dar otro paso
            button4.Enabled = true;
        }
예제 #2
0
        private void button7_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrWhiteSpace(textBox4.Text)) //verificamos que las entradas no sean nulas
            {
                MessageBox.Show("Ingrese el número de procesos a simular");
                return;
            }

            int.TryParse(textBox4.Text, out int numProcesos);

            if (numProcesos > 10000)  //verificamos que las entradas no sean nulas
            {
                MessageBox.Show("Excede la cantidad máxima de procesos (10000)");
                return;
            }


            Random rnd = new Random(Guid.NewGuid().GetHashCode());

            string posibles = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
            int    longitud = posibles.Length;
            char   letra;
            int    longitudnuevacadena = 3;

            for (int j = 0; j < numProcesos; j++)
            {
                string nuevacadena = "";
                for (int i = 0; i < longitudnuevacadena; i++)
                {
                    letra        = posibles[rnd.Next(longitud)];
                    nuevacadena += letra.ToString();
                }


                var proc   = new Process(nuevacadena, decimal.ToInt32(rnd.Next(40, 400)), decimal.ToInt32(rnd.Next(10000, 50000)), decimal.ToInt32(rnd.Next(1, 5))); //creamos un nuevo proceso con los datos introducidos
                var result = memory.Find(x => x.Get_process().Get_size() >= proc.Get_size() && x.Get_status() == true);
                if (result != null)                                                                                                                                  //si hay suficiente memoria disponible
                {
                    New_Alloc(proc);                                                                                                                                 //Alojamos en memoria el nuevo proceso
                }
                else
                {
                    var tem = new QueueObj(proc);
                    queue.Add(tem); //lo metemos a la cola
                }
                Update_Memory();
            }
        }
예제 #3
0
        private void button2_Click(object sender, EventArgs e)                                                                                    //cuando se detecte el click del botón Añadir, esto ocurrirá
        {
            if (string.IsNullOrWhiteSpace(textBox1.Text) || string.IsNullOrWhiteSpace(textBox2.Text) || string.IsNullOrWhiteSpace(textBox3.Text)) //verificamos que las entradas no sean nulas
            {
                MessageBox.Show("Asegúrese de llenar todos los campos");
                return;
            }
            if (textBox2.Text == "0" || textBox3.Text == "0") //verificamos que el tiempo ni tamaño sean cero
            {
                MessageBox.Show("No puede haber procesos de tamaño ni tiempo nulo");
                return;
            }
            int.TryParse(textBox2.Text, out int time); //convertimos a int tiempo y tamaño
            int.TryParse(textBox3.Text, out int tamaño);
            //Debug.WriteLine(tamaño);
            //Debug.WriteLine(this.memorysize);
            if (tamaño > this.memorysize)  //si se intenta alojar una partición más grande que la memoria
            {
                MessageBox.Show("Se está intentando alojar un proceso de tamaño mayor a la memoria disponible");
                return;
            }
            var proc   = new Process(textBox1.Text, tamaño, time, decimal.ToInt32(numericUpDown1.Value)); //creamos un nuevo proceso con los datos introducidos
            var result = memory.Find(x => x.Get_process().Get_size() >= proc.Get_size() && x.Get_status() == true);

            if (result != null)  //si hay suficiente memoria disponible
            {
                New_Alloc(proc); //Alojamos en memoria el nuevo proceso
            }
            else
            {
                var tem = new QueueObj(proc);
                queue.Add(tem); //lo metemos a la cola
            }
            Update_Memory();
            textBox1.Text = textBox2.Text = textBox3.Text = null; //limpiamos los cuadros de texto
            decimal.TryParse("1", out decimal dumm);              //limpiamos el numericalupdown
            numericUpDown1.Value = dumm;                          //limpiamos el numericalupdown
        }