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; }
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(); } }
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 }