Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Problemas de la concurrencia

13/21
Recursos

Aportes 31

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Una solución alternativa que se me podría ocurrir para el caso de los filósofos… (es algo raro y asqueroso pero… jaja)
.
Podrían ser filósofos que tengan cierta sincronización al comer, cuando un filósofo se mete la comida a la boca, este deja los palillos en la mesa y otro filósofo aprovecha a tomar uno de los palillos para meterse su porción de comida y después dejar los palillos en la mesa y después otro filósofo aprovecha a tomar uno de los palillos… y así sucesivamente hasta que el primer filósofo trague su pedazo de comida y pueda tomar de nuevo su palillo que ya debió de haber sido liberado antes 🤔

Hola Platzinauta. 👋
Te comparto mis apuntes para que #NuncaParesDeAprender. 👀✍

Problemas de concurrencia

Carreras (Critical races)

Sucede cuando dos o más hilos desean acceder a un recurso lo más pronto posible. Podemos ver este ejemplo, tenemos una variable C, inicializamos en 0, pero después en alguna parte del código a C, le asignamos el valor de C + 1, entonces un hilo llegará primero y al ver que vale 0, le agregará el valor de 1, almacena ese dato y ahora C vale 1. Pero sí otro hilo llega después, pensará que C vale 1, entonces añadirá otro 1, almacenará ese dato y entonces C vale 2. Esto puede ser un problema en un sistema automatizado de dosificación de medicamentos. Sí el sistema es concurrente, ¿Entonces que hará? ¿Le dará una dosis o dos dosis? ¿Cómo se resuelve?.

Puntos muertos (deadlock)

Ocurre cuando un hilo espera por un evento que nunca sucederá.

Para que suceda un punto muerto deben de cumplirse 4 condiciones:

  • Los hilos deben tener derechos exclusivos a los recursos.
  • Los hilos deben contener algunos recursos mientras esperan otros.
  • Los recursos no se pueden eliminar de los hilos en espera.
  • Existe una cadena circular de hilos en las que cada uno contiene uno o más recursos del siguiente hilo.

Problema de los filósofos

El problema plantea que hay una mesa redonda donde hay 5filósofos que están conversando, frente a ellos hay un plato de comida, a su derecha y a su izquierda, hay otros filósofos y hay un palillo chino a la derecha y otro a la izquierda, para comer se necesitan ambos palillos chinos, eso significa que habrá una persona que no comerá. Hay muchas formas de abordar el problema, pero esas soluciones pueden dar otros problemas, podría ser un sistema de turnos, pero entonces algunos se quedarían esperando hasta que la comida esté fría o tenga mucha hambre. Podríamos hacer que se alternen los turnos de comida.

Estrategias

Evitar que se cumpla alguna de las condiciones

  • Semáforos: Funcionarían como una variable de tipo entero, asociado a un mecanismo de cola de hilos. Si el semáforo toma valores de “0” y “1”, es binario. En caso contrario es un “semáforo contador”.
  • Monitores: Estructuras de datos abstractas basados en los monitores o kernel de los S.O.

Los monitores tienen 4 componentes principales:

  • Inicialización: Contiene código a ser ejecutado.
  • Datos privados: Procedimientos que se utilizan desde dentro del monitor.
  • Métodos del monitor: Procedimientos que se pueden llamar desde fuera.
  • Cola de entrada: Hilos que llaman a algún método del monitor pero no tienen permiso para ejecutarse aún.

Algunos lenguajes

  • JavaScript
  • C#
  • Golang
  • Rust
  • Elixir
  • Haskell

¿Esto puede ser lo que se llama vulgarmente cuello de botella? Lo pregunto cuando recuerdo el caso de, por ejemplo, el programa se ralentiza porque le estamos mandando mucha información a la grafica y hay poca memoria, con lo que el programa tiene que ir mandando poco a poco los datos. ¿estoy en lo correcto?

partir los palillos así todos los filósofos comen

⚠️ Al lidiar con varias tareas, los programas concurrentes pueden presentar varios problemas como las critical races, deadlock, aplazamiento indefinido e injusticia.

Los filósofos deberán implementar un sistema de turnos dobles en el que en cada turno comerán dos filósofos separados entre ellos por otro filósofo. Para que haya orden empezarían el 1 y 3, mientras 2, 4 y 5 hablan, terminan, le toca al 2 y 4 (wácatela compartir ols palillos 😝) mientras 1,3 y 5 hablan, terminan, luego 3 y 5, terminan (aquí el 3 ya comió dos veces), luego el 4 y 1 (ya comieron los dos dos veces) y así sucesivamente hasta que se termine la comida. Estoy segura que debe haber una forma matemática de expresar esto 🤔

Mi solución para el problema de los filósofos es tomar un palillo, partirlo en 2 y usarlo 🤠.
.
Ya que el profesor no puso tantas limitantes…
.
Ir a comprar más
.
Preguntar por más palillos, pudo ser un error del que organizó todo en la mesa.
.
Lo más apegado a la analogía es que coman en el orden que llegaron, quizá tener un tipo de prioridad para los más de mayor edad

En lo que respecta al problema de los filósofos: Considero que cada uno debería tomar un palillo y partirlo por la mitad y así no tendría que compartir su palillo con ninguno de los demás filósofos.
(Y de esa manera no se contagian,** jajaja, es broma**)

La mejor solución seria romper los palo a la mitad

Yo sentaría a los filósofos (conforme a un reloj análogo) siendo la 1 el primer filosofo, empezaría de derecha a izquierda, un bocado por turno, dejando los palillos para que coma el otro filosofo y así hasta terminar

Pues dado que se tratan de palillos, cortaría palillo a la mitad y pues tendría 5 pares de palillos para cada filósofo, no sé si tiene sentido pero bueno es una solución 😄

creo para el problema de los filosofos hay varias manera de resolver, para mi una solucion , que uno coma mientras los otros discuten, en sentido horario, asi se ejecuraria o comeria cada uno mientras los otros discuten

No sé si es un poco floja mi solución, pero podrían partir los palillos, o podrían compartir un plato dividiendo el número de filósofos por plato, así pueden aplicar algún sistema de turnos y el tiempo de espera sería menor.

Como solamente abrían dos pares de palillos, empezarían a comer los dos primeros filósofos con diferencias de un lapso corto de tiempo, Ejm: de un min; en el momento que termine el primero (que fue el que empezó a comer primero), le pasa los palillos al tercero, y después que termine el segundo, le pasa los palillos al cuarto y así sucesivamente :p

SOLUCIÓN PROBLEMA DE LOS FILOSOFOS
Como utilizar la concurrencia en este escenario:

Cantidad filosofos = 5
Cantidad recursos palillos = 2
Cantidad operaciones simultaneas = 2

Su poniendo que dos filosofos comiencen a comer al tiempo, los recursos podrian bloquearse cuando estos empiecen a masticar, lo cual abria tiempo para que otros dos filosofos limpien los palillos y inicien a comer, y asi sucesivamente.

Se me ocurre ahora con la nueva arquitectura Alder- Lake de Intel tienen una tecnología que se llama Thread Director, es una solución a los problemas de concurrencia que pudieran existir a la hora de asignar recursos.

Lo que podríamos hacer es dividir los palitos, serían 10 por lo que cada filosofo podría comer, claro un poco más lento, pero podría. Pasándolo a un entorno tecnológico, sería como que un 5 hilo dividiera su poder en 2 para que 5 métodos que requieren 10 puedan ser ejecutados, obvio de manera más lenta pero al final se podrían ejecutar. Soy nuevo en tec, si es que he dicho algo falso con respecto a los hilos o métodos me sería de mucha ayuda su feedback

pueden romper los palillos a la mitad y cada uno tendrá dos palillos

Los semáforos permiten al programador asistir al planificador del sistema operativo en su toma de decisiones de manera que permiten sincronizar la ejecución de dos o más procesos.

Un Servidor Concurrente Un servidor concurrente atiende a varios clientes al mismo tiempo.
Se trata de crear un nuevo proceso o línea de ejecución cada vez que un cliente “llega” a pedir un servicio.

Dos procesos son concurrentes cuando se ejecutan de manera que sus intervalos de ejecución se solapan. Concurrencia aparente: Hay más procesos que procesadores. Concurrencia real: Cada proceso se ejecuta en un procesador.

¿Tiene algo que ver que sean filósofos?

Es decir, me inquieta un poco. Me hace sentir que ese dato tiene un papel importante en la solución. …

Se que solo es un ejercicio, pero es divertido hacerse esas preguntas

Lo que se me ocurrió fue dejar al que tenga menos comida, coma primero y dejar al final al que tiene mas comida.

Si a alguien le surgio la duda de que es un Kernel?
Es el nucleo de un sistema operativo la base de su funcionamiento o un estandar…
Ejemplo facil seria Linux es kerneñ base de sistemas operativos como Ubuntu, Debian, Manjaro, Kali, etc

Problemas de la concurrencia
Carreras (critical races): sucede por ejemplo al inicializar una variable en 1, agregarle 1 y almacenarlo. Un hilo puede llegar y pensar que la variable ya vale 1 y por eso agregarle 1 y ahora la variable sumó 2

Puntos muertos (Deadlocks)
Cuando un hilo se queda esperando un evento que nunca sucederá. Sucede cuando se dan 4 condiciones:

  1. Los hilos deben tener derechos exclusivos a los recursos
  2. Los hilos deben contener algunos recursos mientras esperan otros
  3. Los recursos no se pueden eliminar de los hilos en espera
  4. Existe una cadena circular de hilos en las que cada uno contiene uno o más recursos del siguiente hilo

Estrategias para abordar los problemas de concurrencia

  • Semáforos: puede ser binario (puede pasar o no) o contador
  • Monitores: contienen una inicialización, datos privados, métodos y una cola de entrada

El Problema De Los Filosofos

Son 5 filósofos son 5 palillos y se sabe que se comen con 2 palillos por persona así que llegamos a la conclusión que 2.5 palillos van a ser utilizado(para efectos prácticos me voy a limitar a usar numero naturales) y sabiendo que 0.5 = 1 palillo, lo descartamos ya que no se puede comer con un palillo además, a cada filosofo le vamos a asignar un nombre al filosofo 1 " f1 " al filosofo 2 " f2 " y así sucesivamente hasta llegar a 5. Teniendo esto como base pasemos a darle forma.

Primero f1 y f2 van a ser los primeros en comer, ya que seria injusto dejar a f3 y a f4 esperando mucho tiempo vamos a asignarle que f1 y f2 van de dos a tres mordidas siempre y cuando las mordida vayan a dar sean de la mis cantidad o sea, si f1 muerde 2 veces f2 morderá 2 veces, si f2 muerde 3 veces f1 morderá tres veces. Ahora supongamos que le dieron " x " mordidas (3 >= x >=2 ) entonces ahora le toca a f3 y a f4 los cuales van a heredar las mismas funciones de f1 y f2 y solo falta f5, Aquí tenemos un problema ya que para que sea todo parejo necesito que f3 o f4 sedan sus palillos pero f5 solo puede tener 1par por ende quedaría 1par no hay problema pero no el lo mas optimo por eso f4 va a dar sus palillos a f5 y 3 va dar sus palillos a f1 o f2 para efectos prácticos digamos que a f1 entonces ya no quedan palillos desperdiciados. Ahora vamos a hacer un ciclo ya que f1 y f5 ya comieron solo quedan f2 ,f3 y f4 dándole prioridad a f2 ya que es el que a pasado mas tiempo sin comer por ende f5 da su palillos a f2 y f1 le devuelve el favor y le da sus palillos a f3 ahora a que f2 y f3 ya comieron faltan f1 f4 y f5 dándole prioridad a f4 porque es el que a pasado mas tiempo sin comer y ya que f2 quiere devolverle el favor a f5 se los da a el y así sucesivamente dándole siempre prioridad al que a estado mas tiempo sin comer y devolviendo el favor hasta que todos hayan terminado quizá no al mismo tiempo pero si de la manera mas justa y optima en mi opinión.

Para el problema de los filósofos:
Removería uno de los 5 palillos, ya que no se puede hacer nada con él y agrega complejidad innecesaria. Le daría un turno a cada filósofo, de esa forma cada que un filósofo desocupe el par de palillos entre bocados, se los podrá pasar al siguiente en turno. El turno se repite hasta que terminen de comer.

El problema de los Filósofos

una forma de que puedan usar los palillos seria que el filosofo uno y tres tomen los palillos de su derecha e izquierda y como un bocado, luego los pueden dejar los palillos en sus respectivos lugares para que continúen los filósofos dos y cuatro luego seguiría el filosofo 5 y también el filosofo dos quien iría por el segundo bocado. y así sucesivamente hasta terminar la comida.

Pueden usar el plato como “cuchara” y un palillo como “tenedor”

Este problema no tiene una solución segura, a menos que se puedan conseguir mas palillos y de esta forma cada uno tenga sus palillos.

Como son filósofos están programados por el cosmos y de manera intermitente comerían sin así cruzarse palillos
Otra opción podría ser incluso al compas de un vals o de luces que indicaran el turno de tomar palillos, tomar alimento pasar bocado. Hasta la misma mesa podría tener plataformas dividas para cada filosofo y estas a su vez bajarían y subirían para dar el turno justo de alimentación .