Saltar al contenido

Imposibilidad de Representar datos en tablas según los algoritmos de ejecucón de procesos


Recommended Posts

publicado

Hola a todos

En la asignatura de Programación de Servicios y Procesos, me piden representar en unas tablas los tiempos de ejecución de los procesos, los tiempos de espera y el orden de llegada.

Se me ocurrió intentar hacerlo, pero programado en vba. Lamentablmente, me pasa como en mis anteriores proyectos, lo imagino, pero no logro llevarlo a la práctica.

Tengo una matriz, donde meto los datos de los procesos:

Orden de llegada ordenados por número de proceso del 1 al 9 y que identifican cada proceso en una fila diferente.

Tiempo de llegada, que será la celda desde donde se comenzará a ejecutar el proceso, o sea, si llega en 3 milisegundos, empezará a ejecutarse en la tercera celda de la tabla

Tiempo de ejecución, que serán  los milisegundos que se estarán ejecutando, representados por una "E", que se escribirá desde la celda de llegada el número de celdas que represente dicho tiempo. O sea, si tiene 3 de tiempo de llegada y 6 de tiempo de ejecución, se escribirán seis "E", desde la celda 3, hasta la celda 9 y en la fila que corresponda el número del proceso

 

he conseguido hacerlo, si solo fuera un proceso y utilizamos una sola línea. Pero cuando ya intento incluir una línea por proceso e incluyo unos cuántos, me pierdo.

Lo he intentado con varios array, con varios for, con while. Pero no tengo aún los conocimientos que me permiten hacerlo funcionar.

He creado el array de los datos de entrada:

Dim A_Datos(1 To 3, 1 To 9)
Dim i As Integer, j As Integer
For i = 1 To 3
   For j = 1 To 9
      If ("E" & (j) <> " ") Then
         A_Datos(i, j) = Cells(5 + i, 5 + j).Value
      End If
   Next j
Next i

Luego he creado los array de las tablas donde representaría esos datos:

'Algoritmo FCFS (Primero en llegar, primero en servir
'Los procesos se ejecutan por orden de llegada y el resto se va poniendo a la cola
Dim A_Fifo(1 To 31, 1 To 9)
Dim fi As Integer, fj As Integer
For fi = 1 To 31
   For fj = 1 To 9
      A_Fifo(fi, fj) = Cells(17 + fi, 2 + fj).Value
   Next fj
Next fi

'Algoritmo SJF --> El más corto primero
'Se van ejecutando los procesos con menos tiempo de ejecución.
'Los demás se van poniendo a la cola y ejecutando los más cortos primero
Dim A_Sjf(1 To 31, 1 To 9)
Dim Si As Integer, Sj As Integer
For Si = 1 To 31
   For Sj = 1 To 9
      A_Sjf(Si, Sj) = Cells(30 + Si, 2 + Sj).Value
   Next Sj
Next Si

Pero lamentablemente, no se muy bien, como hacer ahora para que los datos del primer array, se escriban en las tablas de los arrays correspondientes

Estoy totalmente perdido

Alguien me podría hechar una mano ?

Muchas gracias

Procesos.xlsm

publicado

@el_trasgu , ¿Por qué no subes tu fichero con un ejemplo hecho a mano (o dando indicaciones)? Con tu explicación no he conseguido entender qué necesitas. Además en tu macro solo llenas matrices, pero luego no pasas ningún dato a las tablas, así que es imposibke seguir el proceso

publicado

A ver si logro explicarme mejor, los datos de entrada, están en la primera tabla de mi fichero, y recojo los datos con el primer array A_Datos.

Sería tipo al siguiente ejercicio, yo los procesos los he identificado con números en lugar de letras.

El primer proceso A si inicia en 0, o sea, en la celda B17, que se corresponde con A0 en la tabla de abajo. y tiene una duración de 3 milisegundos, de ahí las tres "E"

El segundo proceso B, se inicia en 1, sería la celda C18, se corresponde con B1 en la tabla de abajo. pero como se está ejecutando el proceso anterior, tiene que pasar al estado de listo, que se representa con L1.

Cuando se acaba de ejecutar el proceso A, se empezará a ejecutar éste segundo proceso B, que se iniciará en lugar del instante 1 (C18), en el instante 3 (E18), y tendrá una duración de 6 milisegundos, se ahí las 6 "E"

El tercer proceso C, llega en el milisegundo 3, que está ocupado por el proceso B, por lo tanto pasará al estado de listo (L1 - primer poceso en espera).

Se ejecutará en el instante 9 (Como ves, los instantes de ejecución, son la suma de los procesos ejecutados con anterioridad (el proceso A tardo 3 milisegundos en ejecutarse, el proceso B, tardó 6. 3 + 6 = 9. El tercer proceso C, a pesar de llegar en el instante 3, no se podrá ejecutar hasta el instante 9)

imagen.thumb.png.bfdd4be4d4efb7ed6a2e17bfda0a9e2c.png

En esta segunda imagen pongo otro tipo de algoritmo. Es el SJF

En él, los procesos, en lugar de ejecutarse por orden de llegada, se ejecutan por tiempo de ejecución más corto.

El proceso A tiene 3 milisegundos de ejecución. Al llegar al micro-procesador, no hay ningún proceso más en ejecución ni en espera, por lo que al llegar se ejecuta, tardando 3 milisegundos.

Mientras se está ejecutando el proceso A, entra el proceso B, que tardará 6 milisegundos en ejecutarse, pero como el micro está ocupado, pasa al estado de espera (Listo1)

Justo al tiempo de acabar de ejecutarse el proceso A, entra el proceso C, y aunque el proceso B está listo para ejecutarse y en espera, como éste proceso C, tiene un tiempo de ejecución más corto, 3, se ejecutará primero que el proceso B, y éste seguirá a la espera. Como ves en la gráfica, aún se ejecutan dos procesos más, en E y el D antes que el B.

imagen.thumb.png.9e78250018c53001ebec35be36516cb5.png

Espero haberme expllicado mejor en ésta ocasión, aunque la verdad es que a mi me ha costando entenderlo un rato largo, jeje

Un saludo y muchas gracias

 

 

publicado

Y ahora entraría el siguiente algoritmo, el Round-Robin

Este lo que hace, es darle a cada tarea un tiempo de ejecución por defecto, que en el caso del problema de la imagen es 1.

lo que hace, es que al llegar un proceso lo ejecuta durante un milisegundo. Si al acabar no hay ningún proceso más, vuelve a ejecutar el A durante otro milisegundo. Si al acabar entra otro proceso, ejecutará éste segundo proceso durante 1 milisegundo. Al acabar mirará cuantos procesos nuevos han entrado y cuántos hay en espera. Y los irá ejecutando todos, por orden de llegada, pero durante ese milisegundo alternando entre todos los procesos.

imagen.png

publicado

Abre el adjunto y pulsa el botón FIFO_FCFS.

A ver si soy capaz de encontrar el mecanismo por el que se determinan los valores de las celdas en gris (L?), de momento, no lo he conseguido. ¿Se supone que Lx representan los procesos en espera en un instante dado?

Procesos.xlsm

publicado
Hace 2 horas, Antoni dijo:

Abre el adjunto y pulsa el botón FIFO_FCFS.

A ver si soy capaz de encontrar el mecanismo por el que se determinan los valores de las celdas en gris (L?), de momento, no lo he conseguido. ¿Se supone que Lx representan los procesos en espera en un instante dado?

Procesos.xlsm 398.85 kB · 0 descargas

Cuando un proceso "B" entra para su ejecución en el instante 2, por ejemplo, y en ese momento se está ejecutando otro proceso "A" que finalizará en el instante 6, los instantes de espera comprendidos entre el instante de llegada 2, y el instante 6 de finalización del proceso "A", serán los que esté en el estado Listo, y se representa como L1.

Si en el instante 4, entrase un proceso "C", pasaria al estado de Listo, pero en éste caso de representaría como L2, pues tiene delante al proceso "B" como L1 también en estado listo y en espera.

Un proceso "D" que entrase en el instante 5, pasaría al estado de Listo y se representaría como L3, pues tiene dos procesos en espera delante.

Al finalizar el proceso "A", estasmos en el instante 6, el proceso "B" entraría en ejecución, y pasaría al proceso "C" a L1, y al proceso "D" a L2.

El proceso "B" tiene un tiempo de ejecución de 4, entre los instantes 6 y 9. Al finalizar éste, estaríamos en el instante 10.

El proceso "C" entraría en ejecución, pasando al proceso "D" a L1. Estaría en éste estado hasta el instante 17 que finalizaría la ejecución del proceso "C".

En el instante 18 el proceso "D" entraría en ejecución, y en esos momentos no habría más procesos en espera.

En el instante 20 el proceso "D" finalizaría su ejecución, liberando el procesador en el instante 21

imagen.thumb.png.10388b35199a63c848f243fbb7611494.png

publicado

Hola Antoni, buenos días

El código que me has enviado me arroja en error si cambio el instante de llegada, y en lugar de ponerlo en cero, lo pongo en tres

imagen.thumb.png.e55ee6cf289c9d0d432091ab9c089f72.png

imagen.thumb.png.a9477aeb6a0e801f6f2bfa6c0f6e186e.png

Por otra parte, me pasa lo mismo que en las veces anteriores que me has resuelto mis dudas y solucionado mis deseos, que no me entero de tu código.

Mira que no es muy extenso, pero aún así, no lo entiendo

Sub FIFO_FCFS()

'para que la pantalla no se actualice
Application.ScreenUpdating = False


fila = 17   'Fila inicio
columna = 2 'Columna inicio
'--
Cells(fila, columna).Resize(10, 30).ClearContents                'Limpiamos
Cells(fila, columna).Resize(10, 30).Interior.ColorIndex = xlNone 'Quitamos color relleno
'--

'si la celda E5 contiene algún valor
If Range("E5") <> "" Then

   'vete leyendo hacia abajo las filas desde la celda E4 ? (Pero no entiendo porque le das a x el valor 5, y luego referencias la celda E4
   For x = 5 To Range("E4").End(xlDown).Row

      'Aquí me pierdo totalmente, porque no entiendo lo del Resize(1, ni que significa el Range("M". Y que lo haga a partir de fila = 17 y columna = 2
      Cells(fila, columna).Resize(1, Range("M" & x)) = "E"                  'Valor E según tiempo

      'Aquí entiendo que a las mismas celdas del código de arriba donde escribes la "E", las pinte de rojo
      Cells(fila, columna).Resize(1, Range("M" & x)).Interior.Color = vbRed 'Color rojo

      'Aquí me vuelve a pasar lo mismo, me pierdo en el Range("I"
      If Range("I" & x) > 0 Then

         'A partir de fila=17 y columna=2 y me vuelvo a perder en el Resize, que lo pinte de color gris
         Cells(fila, Range("I" & x) + 2).Resize(1, columna - Range("I" & x) - 2).Interior.ColorIndex = 15 'Gris
      End If

      'a la fila le sumanos 1
      fila = fila + 1

      'a la columna le sume el valor que se me escapa de Range("M" & x)
      columna = columna + Range("M" & x)
   Next
End If
End Sub

 

Un saludo y muchas gracias, como siempre, por tu tiempo de dedicación y tu ayuda

publicado

He añadido cálculos intermedios con fórmulas para facilitarte la comprensión del código.

Básicamente, tu problema reside en la comprensión de la propiedad Resize del objeto Range.

La propiedad Resize sirve para redimensionar rangos a partir de otro, generalmente a partir de una celda.

Ejemplo:

Range("A1") o Cells(1,1) hace referencia a la celda A1, pues bien, si ponemos Cells(1,1).Resize(1,3) o Range("A1").Resize(1,3),estamos diciendo que nuestro rango abarca 1 fila y 3 columnas a partir de la celda A1, o sea A1:C1, otro ejemplo, Cells(6,5).Resize(2,4) o Range("E6").Resize(2,4), haría referencia al rango E6:H7, resumiendo, la propiedad Resize permite alargar rangos en filas y columnas Range.Resize(filas,columnas).

Procesos.xlsm

publicado

Muchísimas gracias Antoni, la verdad que algo más claro el código me queda. Aunque por ahora, me sigue resultando imposible desarrollar los siguientes algoritmos, aún se me escapan trozos de código que no me quedan claros del todo.

Me pasa como con los estudios, estamos dando Java y C#, y en ésta primera evaluación ando perdido del todo, de echo, las asignaturas de programación, las he suspendido.

Por cierto, si cambio en el proceso A, el tiempo de llegada de 0 por 1, me escribe espacios en blanco en los estados de espera.

Me sorprende la capacidad de resolución que demuestras, quien pudiera.

Muchísimas gracias por todo, espero algún día poder enterarme de algo. Un saludo

publicado

Hola

Lo que estas tratando de simular no es cosa menor, VBA no tiene soporte nativo para múltiples hilos, para ellos debes de recurrir a la API de Windows, coloco un enlace donde puedes ver como se maneja dicha API

https://www.freevbcode.com/ShowCode.asp?ID=4029

Si usas C sharp ahí si lo tienes nativo y por tanto encontrarás bastantes ejemplos en la web

saludos

 

 

 

publicado
Hace 3 horas, neverdelimon1 dijo:

Si usas C sharp ahí si lo tienes nativo y por tanto encontrarás bastantes ejemplos en la web

saludos

 

 

 

Espero aprender algún día, jeje

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.