CONCEPTOS DE PLANIFICACION

:
La planificación hace referencia a un conjunto de políticas y mecanismos incorporados al
SO que gobiernan el orden en que se ejecutan los trabajos que deben ser completados
por el sistema informático.
Un planificador es un módulo del SO que selecciona el siguiente trabajo a admitir en el
sistema y el siguiente proceso que tomara el control sobre el procesador.
El objetivo primario optimizar el rendimiento del sistema.

Medidas de Rendimiento y los Criterios de Optimización.
UTILIZACIÓN DEL PROCESADOR:
La utilización del procesador es la fracción de tiempo durante la cual el procesador se
encuentra activo ejecutando algún proceso de usuario del propio SO.
El objetivo es mantener al procesador ocupado tanto tiempo como sea posible. De esta
forma, se conseguirá que los factores de utilización de los restantes componentes
también sean elevados obteniéndose con ello buenas medidas de rendimiento.

PRODUCTIVIDAD:
La productividad se refiere a la cantidad de trabajo completada por unidad de tiempo.
Un modo de expresarla es definiéndola como el número de trabajos de usuario
ejecutados por una unidad de tiempo. Cuanto mayor sea este número, más trabajo
aparentemente está siendo ejecutado por el sistema.

TIEMPO DE RETORNO:
El tiempo de retorno TR se define como el tiempo que transcurre desde el momento en
que un trabajo o programa es remitido al sistema hasta que es totalmente completado por
el mismo.
Es decir, el tiempo de retorno TR es el tiempo consumido por el proceso dentro del
sistema y puede ser expresado como la suma del tiempo de servicio o tiempo de
ejecución + el tiempo de espera.
TR=TS+TE
TIEMPO DE ESPERA:
El tiempo de espera TE es el tiempo que un proceso o trabajo espera de la asignación de
algún recurso o de que tenga lugar algún evento.

b. Generalmente también se le denomina tiempo de respuesta de terminal. Lo . S4: w = c + 1. Resulta conveniente revisar primero lo referente a las instrucciones. Suponga que se dispone de un procesador con varias unidades funcionales para realizar las instrucciones o simplemente se tienen múltiples CPU y se desean ejecutar en grupo de instrucciones pertenecientes a un programa. El término programación concurrente o simplemente concurrencia se refiere a la ejecución paralela de instrucciones o procesos (aunque sea pseudo-paralela se deberán tener en cuenta las mismas consideraciones).En este tiempo también se incluyen el periodo de espera por la obtención del propio procesador debido a la competencia con otros procesos en un sistema con multiprogramación. Grafos de precedencia.b no puede ser ejecutada hasta que no hayan sido realizadas la S1 y la S2 de forma tal que los valores de a y b hayan sido calculados. Lógicamente la instrucción c = a . el tiempo de respuesta es esencialmente una latencia y se define como el tiempo que transcurre desde el momento en que un suceso interno o externo es señalado hasta que se ejecuta la primera instrucción de su correspondiente rutina de servicio. S2: b = z + 1. TIEMPO DE RESPUESTA: El tiempo de respuesta en sistemas interactivos se define como el tiempo que transcurre desde el momento en que se introduce el último carácter de una orden que desencadena la ejecución de un programa o transacción hasta que aparece el primer resultado en el terminal. A este tiempo suele denominársele tiempo de respuesta al proceso. Programación Concurrente. S1: a = x + y. En sistemas en tiempo real. S3: c = a .

en las instrucciones antes indicadas se tendría: Otro ejemplo de grafo de precedencia podría ser: . Un grafo de precedencia es un grafo dirigido y sin ciclos donde los nodos corresponden a instrucciones. Por ejemplo. Para esquematizar estas situaciones se hace uso de los llamados grafos de precedencia.mismo ocurre con S4 con respecto a S3. Lo importante de notar en este ejemplo es que dentro de un proceso existen restricciones de precedencia entre las distintas instrucciones. y b = z + 1 se pueden ejecutar concurrentemente debido a que una no depende de la otra. En cambio las instrucciones a = x + y. Un arco desde un nodo Si a un nodo Sj significa que la instrucción Sj solo puede ser ejecutada después que se realice la Si.

Conjunto de políticas y mecanismos incorporados al sistema operativo. . que debe decidir cuál de los procesos en condiciones de ser ejecutado conviene ser despachado primero y qué orden de ejecución debe seguirse. Esto debe realizarse sin perder de vista su principal objetivo que consiste en el máximo aprovechamiento del sistema. la eficacia. lo que implica proveer un buen servicio a los procesos existentes en un momento dado.  Equidad: Todos los procesos deben ser atendidos.  Tiempo de respuesta: El tiempo empleado en dar respuesta a las solicitudes del usuario debe ser el menor posible.  Eficacia: El procesador debe estar ocupado el 100% del tiempo.POLITICAS DE PLANIFICACION: Planificación de procesos en Sistemas Operativos. el tiempo de regreso y el rendimiento. a través de un módulo denominado planificador. el tiempo de respuesta. Objetivos de la Planificación de procesos La Planificación de procesos tiene como principales objetivos la equidad.

y de acuerdo con esa prioridad será el orden en que se atienda cada proceso. . Rendimiento: Maximizar el número de tareas que se procesan por cada hora. Planificación por prioridad: En este tipo de planificación a cada proceso se le asigna una prioridad siguiendo un criterio determinado. y se irá ejecutando el que tenga un menor tiempo asignado. Round Robin: A cada proceso se le asigna un tiempo determinado para su ejecución. o sea. Prioridad al más corto: Su nombre es SJF (Shortest Job First). no tendrá un tiempo de ejecución determinado para el proceso. En caso de que un proceso no pueda ser ejecutado completamente en ese tiempo se continuará su ejecución después de que todos los procesos restantes sean ejecutados durante el tiempo establecido. Este algoritmo emplea una cola de procesos. Este es un algoritmo basado en FCFS que trata la cola de procesos que se encuentran en estado de listos como una cola circular. el mismo tiempo para todos.  Tiempo de regreso: Reducir al mínimo el tiempo de espera de los resultados esperados por los usuarios por lotes. Algoritmos de Planificación Primero en llegar primero en ser servido: Conocido como FCFS (First Come First Served). Si se da el caso de que dos procesos tengan igual valor en ese aspecto emplea el algoritmo FCFS. El proceso que se encuentra en ejecución cambiará de estado voluntariamente. Cuando un proceso comienza a ejecutarse no se interrumpe su ejecución hasta que termina de hacerlo. A cada proceso se le asigna el tiempo que usará cuando vuelva a estar en ejecución. asignando un lugar a cada proceso por el orden de llegada. Cuando el proceso llega es puesto en su lugar en la cola después del que llegó antes que él y se pone en estado de listo.

Tiempo de retorno del proceso: Es el tiempo que transcurre desde la creación de un proceso hasta que termina la ejecución del programa que le dio lugar. Planificación de Colas Múltiples: El nombre se deriva de MQS (Multilevel Queue Schedulling). por lo que pueden entrar en inanición. En algoritmos FCFS este tiempo suele ser bastante largo. Tiempos: En la Planificación de procesos se tiene en cuenta diferentes tiempos que pueden ser calculados. . Cada cola puede manejar un algoritmo de planificación diferente a las demás. Para dar solución a este problema el envejecimiento de un programa eleva su prioridad. Para un número "n" de usuarios se asignará a cada uno un tiempo de ejecución igual a 1/n. pues se estarán ejecutando constantemente los procesos más cortos y los más largos se encontrarán constantemente en espera.Planificación garantizada: Para realizar esta planificación el sistema tiene en cuenta el número de usuarios que deben ser atendidos. Tiempo de espera medio: Es el promedio de tiempos en que los procesos están en estado de listos. En este algoritmo la cola de procesos que se encuentran en estado de listos es dividida en un número determinado de colas más pequeñas. Los procesos son clasificados mediante un criterio para determinar en qué cola será colocado cada uno cuando quede en estado de listo. En algoritmos SJF para los procesos largos este tiempo suele ser muy grande. el "Tiempo de retorno del proceso" y el "Tiempo de retorno medio". En Planificación por prioridad los procesos de prioridad baja podrían no ejecutarse nunca. Tiempo de retorno medio: Es la suma de los tiempos de retorno de cada uno de los procesos dividida entre la cantidad de procesos. como son el "Tiempo de espera medio".

Para que dos conjuntos de instrucciones Si y Sj se puedan ejecutar concurrentemente. como el conjunto de lectura del conjunto de instrucciones Sk y que está formado por todas las variables cuyos valores son referenciados (se leen) durante la ejecución de las instrucciones en Sk. • E (Sk) = {a1.b. L ( S 1 ) ∩ E ( S 2 ) =Ø . se definen en primer lugar los siguientes conjuntos: • L (Sk) = {a1. S3 → a. E ( S i ) ∩ E ( Sj ) = Ø Como ejemplo supongamos que tenemos: S1 → a. b} E (S3) = {c} L (S4) = {c} E (S4) = {w} Ahora aplicamos las condiciones de Bernstein a cada par de sentencias: Entre S1 y S2: 1. a2.…. = x + y. en primer lugar calculamos los conjuntos de lectura y escritura: L (S1) = {x. L ( S i ) ∩ E ( S j ) =Ø 2. = a . se tiene que cumplir que: 1.. a2. como el conjunto de escritura del conjunto de instrucciones Sk y que está formado por todas las variables cuyos valores son referenciados (se escriben) durante la ejecución de las instrucciones en Sk.CONDICIONES DE BERNSTEIN Para poder determinar si dos conjuntos de instrucciones se pueden ejecutar de forma concurrente. = z ...an}. Utilizando las condiciones de Bernstein veremos qué sentencias pueden ejecutarse de formas concurrentes y cuáles no.1.an}. S2 → a. y} E (S1) = {a} L (S2) = {z} E (S2) = {b} L (S3) = {a.…. = c + 1. S4 → a. Para ello. E ( S i ) ∩ L ( S j ) =Ø 3.

L ( S 2 ) ∩ E ( S4 ) =Ø 2. L ( S 1 ) ∩ E ( S 4 ) =Ø 2.2. E ( S 1 ) ∩ L ( S 3 ) =Ø 3. E ( S 2 ) ∩ E ( S4 ) =Ø Entre S2 y S3: 1. L ( S 3 ) ∩ E ( S4 ) =Ø 2. E ( S 2 ) ∩ E ( S3 ) =Ø Entre S3 y S4: 1. L ( S 1 ) ∩ E ( S 3 ) =Ø 2. E ( S 3 ) ∩ L ( S4 ) =Ø . E ( S 1 ) ∩ E ( S 3 ) =Ø Entre S1 y S4: 1. E ( S 1 ) ∩ L ( S2 ) =Ø 3. E ( S 1 ) ∩ E ( S 2 ) =Ø Entre S1 y S3: 1. E ( S 2 ) ∩ L ( S4 ) =Ø 3. E ( S 2 ) ∩ L ( S3 ) =Ø 3. E ( S 1 ) ∩ L ( S 4 ) =Ø 3. L ( S 2 ) ∩ E ( S3 ) =Ø 2. E ( S 1 ) ∩ E ( S 4 ) =Ø Entre S2 y S4: 1.

la productividad y la eficiencia del procesador. La figura 8. La creación de un nuevo proceso parte de la decisión de si añadir un proceso al conjunto de procesos activos. de forma que se cumplan objetivos del sistema tales como el tiempo de respuesta.1 relaciona las funciones de planificación con el diagrama de transición de es.3. La planificación a largo plazo se lleva a cabo al crear un proceso nuevo. medio y corto plazo.tados de un proceso. La planificación a medio plazo forma parte del proceso de intercambio y tiene como origen la decisión de añadir un proceso . Los nombres hacen referencia a la frecuencia relativa con la que son ejecutadas estas funciones. la actividad de planificación se divide en tres funciones in-dependientes: planificación a largo. se hace necesario algún tipo de notación para especificar qué partes de un programa pueden ejecutarse concurrentemente y qué partes no. E ( S 3 ) ∩ E ( S4 ) =Ø De todo esto se deduce la siguiente tabla en la que puede verse qué pares de sentencias pueden ejecutarse de forma concurrente: Una vez que sabemos qué se puede y qué no se puede ejecutar concurrentemente. En muchos sistemas. TIPOS DE PLANIFICACIÓN El afán de la planificación del procesador consiste en asignar los procesos al procesador o los procesadores para que sean ejecutados en algún momento.

3. La planificación afecta al rendimiento del sistema. La planificación a corto plazo es la decisión de qué proceso en estado Listo será el que ejecute a continuación. por tanto. . Fundamentalmente. la planificación no es sino una gestión de dichas colas que minimice la espera y optimice el rendimiento del entorno. Este punto de vista es el que se presenta en la figura 8. pues determina qué proceso esperará y qué proceso continuará.2 se reorganiza el diagrama de transición de estados para representar gráficamente el anidamiento de las funciones de planificación. en memoria principal y. En la figura 8. disponibles para ejecutar.a los que se encuentran. al menos parcialmente. que muestra las colas involucradas en las transiciones de estado de un proceso.

el planificador debe decidir qué trabajos son aceptados y se convierten en procesos. Así pues. Cuantos más procesos se crean. un proceso recién creado comienza en situación de descargado de la memoria principal. De este modo. por el grado de multiprogramación. se controla el grado de multiprogramación. un trabajo o un programa de usuario se convierten en un proceso y es añadido a la cola del planificador a corto plazo. Primero. El planificador a largo plazo creará procesos a partir de la cola cuando sea posible. el planificador puede tomar la decisión de añadir uno o más trabajos" nuevos. en cuyo caso se añade a la cola del planificador a medio plazo. Segundo. Además. el planificador debe decidir si el sistema operativo puede acoger algún proceso más. los procesos recién incorporados se encaminan hacia el disco y permanecen detenidos en una cola de procesamiento por lotes. La decisión de cuándo crear un nuevo proceso viene dada. Cada vez que finaliza un trabajo. menor es el porcentaje de tiempo en el que cada proceso puede ejecutar.Planificación a largo plazo: La planificación a largo plazo determina cuáles son los programas admitidos en el sistema. Una vez admitido. en general. Dos decisiones entran en juego en este sistema. si la fracción de tiempo que el procesador está . el planificador a largo plazo puede limitar el grado de multiprogramación para ofrecer un servicio satisfactorio al conjunto de procesos actual. En algunos sistemas. En un sistema de proceso por lotes o bien en la parte de proceso por lotes de un sistema operativo de propósito general. Considérense un momento estas dos decisiones.

tiempos de ejecución esperados y exigencias de E/S. el planificador puede intentar mantener una combinación de procesos con mayor carga de E/S. El planificador a corto plazo. Los usuarios de tiempo compartido no pueden ser puestos simplemente en cola y hacerles esperar hasta que el sistema pueda aceptarlos. En un sistema que no emplee memoria virtual.desocupado excede un cierto umbral. tomando una primera decisión sobre si tomar o no un nuevo proceso y cuál tomar. la decisión de carga en memoria tendrá en cuenta las necesidades de memoria del proceso descargado. si se encuentra disponible la información. es el de ejecución más frecuente y toma decisiones con un mayor detalle sobre el proceso que se ejecutará a continuación. las solicitudes de conexión se responden con un mensaje que indica que el sistema está completo y que debe intentarse más tarde. la decisión puede tomarse de. la decisión de cargar un proceso en memoria principal se basa en la necesidad de controlar el grado de multiprogramación. El planificador a corto plazo se ejecuta cuando ocurre un suceso que puede conducir a la interrupción del proceso actual o que ofrece la oportunidad de expulsar de la ejecución al proceso actual en favor de otro. Los temas relacionados se tratan en los capítulos 3 y 6. La decisión de cuál va a ser el siguiente proceso a admitir puede basarse en un simple algoritmo primero en llegar/primero en servirse (FCFS. First-come. el sistema operativo acepta todas las llegadas autorizadas hasta que el sistema se sature de acuerdo con alguna medida predefinida. también conocido como distribuidor (dispatcher). Para programas interactivos en un sistema de tiempo compartido. cuando un usuario intenta conectarse al sistema. El criterio empleado puede tener en cuenta prioridades. First-served) o bien puede basarse en alguna herramienta de gestión de la actividad del sistema. se puede volver a invocar al planificador a largo plazo. se genera una solicitud de crear un proceso. El planificador a medio plazo se ejecuta con algo más de frecuencia. Además. Planificación a medio plazo: La planificación a medio plazo forma parte de la función de intercambio. en un intento de equilibrar el uso de la E/S. Llegado este punto. Como ejemplos de estos sucesos se tienen:  Interrupciones del reloj . Planificación a corto plazo: El planificador a largo plazo se ejecuta con relativa poca frecuencia. para tomar la decisión del intercambio. Por el contrario. Generalmente. Por ejemplo. Así pues. la gestión de memoria también es un punto a tratar.pendiendo del recurso de E/S que se solicite.

El principal problema de la programación concurrente corresponde a no saber en qué orden se ejecutan los programas (en especial los programas que se comunican). La palabra cobegin indica el comienzo de la ejecución concurrente de los procesos que se señalan hasta la sentencia coend. Se debe tener especial cuidado en que este orden no afecte el resultado de los programas. Veamos un ejemplo: . Cobegin y Coend.   Interrupciones de E/S Llamadas al sistema operativo Señales Programación Concurrente 1. 2. ¿Qué es la programación concurrente? Se conoce por programación concurrente a la rama de la informática que trata de las técnicas de programación que se usan para expresar el paralelismo entre tareas y para resolver los problemas de comunicación y sincronización entre procesos. La ejecución concurrente de los procesos la indicaremos mediante la estructura cobegin/coend.

y no se puede ejecutar en paralelo con nada. Se denomina Sección Crítica a . COBEGIN Print J. luego de ejecutado S1 •S4 se ejecutará al terminar S2 y S3. por lo cual el programa es inconsistente. COEND Print J. El resultado no es el mismo. Si se ejecutara primero la sentencia Print J entonces se imprimiría “10 1000”. Sección crítica y mutua exclusión El método más sencillo de comunicación entre los procesos de un programa concurrente es el uso común de unas variables de datos. S3. a errores en el programa ya que el acceso concurrente puede hacer que la acción de un proceso interfiera en las acciones de otro de una forma no adecuada. •S2 y S3 se pueden ejecutar en paralelo. J= 10. COBEGIN S2. COEND S4. Esto quiere decir que: •Primeramente se debe ejecutar S1. J = 1000. Veamos un ejemplo de un programa no consistente: el orden de ejecución de las sentencias afecta el resultado.S1. Esta forma tan sencilla de comunicación puede llevar. no obstante. y no se puede ejecutar en paralelo con nada. Pero si se ejecutara primero la sentencia J=1000 entonces se imprimiría “1000 10”. Para evitar este tipo de errores se pueden identificar aquellas regiones de los procesos que acceden a variables compartidas y dotarlas de la posibilidad de ejecución como si fueran una única instrucción. 3.

Semáforos: Concepto Dijkstra dio en 1968 una solución al problema de la exclusión mutua con la introducción del concepto de semáforo binario. Un semáforo binario es un indicador (S) de condición que registra si un recurso está disponible o no. para un semáforo binario. Para conseguir dicha exclusión se deben implementar protocolos software que impidan o el acceso a una sección crítica mientras está siendo utilizada por un proceso. val): inicializa al semáforo en el valor val (0 ó 1) •P(S): if S = 1 then S := 0 else Suspender la tarea que hace la llamada y ponerla en la cola de tareas •V(S): if la cola de tareas está vacía then S := 1 else Reanudar la primera tarea de la cola de tareas La operación INIT se debe llevar a cabo antes de que comience la ejecución concurrente de los procesos ya que su función exclusiva es dar un valor inicial al semáforo. entonces otro proceso no puede entrar a ejecutar una región crítica en la que acceda a variables compartidas con el anterior. Si. que desde otro proceso se ven como si fueran una única instrucción. . Un semáforo binario sólo puede tomar dos valores: 0 y 1.aquellas partes de los procesos concurrentes que no pueden ejecutarse de forma concurrente o. Así pues. también. Está técnica permite resolver la mayoría de los problemas de sincronización entre procesos y forma parte del diseño de muchos sistemas operativos. si S = 0 el recurso no está disponible y el proceso debe esperar. Las secciones críticas se pueden mutuo excluir. Esto quiere decir que si un proceso entra a ejecutar una sección crítica en la que se accede a unas variables compartidas. con una cola de tareas asociada y con sólo tres operaciones para actuar sobre él: •INIT (S. un semáforo binario se puede definir como un tipo de datos especial que sólo puede tomar los valores 0 y 1. Los semáforos se implementan con una cola de tareas a la cual se añaden los procesos que están en espera del recurso. S = 1 entonces el recurso está disponible y la tarea lo puede utilizar. 4.

En este caso el semáforo se inicializa con el número total de recursos disponibles (N) y las operaciones P y V se diseñan de modo que se impida el acceso al recurso protegido por el semáforo cuando el valor de éste es menor o igual que cero. else Suspender la tarea que hace la llamada y ponerla en la cola de tareas •V(S): if la cola de tareas está vacía then S = S +1. Semáforos: mutua exclusión La exclusión mutua se realiza fácilmente utilizando semáforos. lo pone a 0 y prosigue su ejecución. process P1: P (S) . pero cuando lo que hay que proteger es un conjunto de recursos similares.Un proceso que corre la operación P y encuentra el semáforo a 1. Cuando se ejecuta la operación V puede haber varios procesos en la lista o cola. El proceso que la dejará para pasar al estado listo dependerá del esquema de gestión de la Cola. La operación P se usará como procedimiento de bloqueo antes de acceder a una sección crítica y la operación V como procedimiento de desbloqueo. val): inicializa al semáforo en el valor val (puede ser cualquier valor) •P(S): if S > 0 then S = S -1. con algunas diferencias en su semántica: •INIT (S. else Reanudar la primera tarea de la cola de tareas 5. El semáforo binario resulta adecuado cuando hay que proteger un recurso que pueden compartir varios procesos. Se utilizarán tantos semáforos como clases de secciones críticas se establezcan. se puede usar una versión más general de semáforo que lleve la cuenta del número de recursos disponibles. Si no hay ningún proceso en espera del semáforo este se deja libre (S := 1) para el primero que lo requiera. el semáforo se decrementa y se incrementa cuando que uno de ellos se libera. Sección Crítica V (S) . Si el semáforo está a 0 el proceso queda en estado de bloqueado hasta que el semáforo se libera. Cada vez que se solicita y obtiene un recurso. . Las operaciones que tenemos son las mismas.

consumiéndose en el orden en que es producida.m). Sección Crítica V (S) . Cuando el primer proceso termine la sección crítica. porque ambos. . ejecutará V(S). process Principal: INIT(S. COBEGIN P1. y no quisiéramos que se ejecuten más de m secciones críticas simultáneamente. COEND end Principal. pueden modificarlo. el primer proceso que ejecute P(S) pone a S en cero. Para ello se considera un buffer común. basta con cambiar INIT(S. Semáforos: Problema Productor – Consumidor Este problema aparece en distintos lugares de un sistema operativo y caracteriza a aquellos problemas en los que existe un conjunto de procesos que producen información que otros procesos consumen. 6. hace necesario que se establezca una sincronización entre los procesos de manera que la información no se pierda ni se duplique. Se debe mutuo-excluir. liberando al otro proceso bloqueado y permitiéndole ejecutar su sección crítica. (* resto del proceso *) end P2. Este desajuste en las velocidades. Si tuviéramos n procesos. cuando quiera acceder a la sección critica. pasa a ejecutar la sección crítica y generará que el otro proceso. process P2: P (S) . productor y consumidor. Con esta estructura. siendo diferentes las velocidades de producción y consumo de la información.(* resto del proceso *) end P1.1). se bloquee. del que el consumidor toma datos y donde el productor los coloca. P2.

Tamaño_Buffer). V(ocupados). P(libres). d = SacarDato(). consumirDato(d). P(S).Cuando el productor desea colocar un dato en el buffer y este está lleno. process Consumidor: repeat P(ocupados). process Productor: repeat d= producirDato(). V(S). 5 process Principal: INIT(libres. . end Consumidor. V(libres). el consumidor se quedará bloqueado hasta que exista algún dato disponible en el buffer. end Productor. INIT(S. AgregarBuffer(d). Forever. INIT(ocupados. 0). Cuando el consumidor desea tomar un dato en el buffer y este está vacío.1). P(S). V(S). el productor se quedará bloqueado hasta que exista espacio disponible en el buffer. Forever.

Semáforos: Problema Lector . Al salir los lectores. V(wrt).Escritor Otro problema famoso es el de los lectores y escritores. . •Libres será el semáforo que contabilizará la cantidad de lugares libres que le restan al buffer. ni siquiera los lectores. y queda al menos un lector accediendo a la base de datos. •Ocupados será el semáforo que contabilizará la cantidad de datos que hay en el buffer. Una hipótesis implícita en esta solución es que los lectores tienen prioridad sobre los escritores.COBEGIN Productor Consumidor COEND end Principal. En esta solución. 7. el escritor deberá esperar hasta que no haya más lectores interesados en la base de datos. ocupados y libres. y el último en salir realiza un V sobre el semáforo. que representarán: •S será el semáforo para mutuo-excluir la sección crítica correspondiente a modificar el buffer. Se necesitarán como variables compartidas los semáforos S.. el primer lector que obtiene el acceso a la base de datos realiza un P sobre el semáforo wrt. Pero si aparecen nuevos lectores. Cant_Lectores. Supongamos una base de datos. Escribir(). Forever. pero si uno de los procesos está escribiendo (es decir. que modela el acceso a una base de datos. Se puede permitir que varios procesos lean de la base de datos al mismo tiempo. con muchos procesos que compiten por leer y escribir en ella. Los lectores siguientes sólo incrementan un contador. Si surge un escritor mientras varios lectores se encuentran en la base de datos el escritor debe esperar. process Escritor: repeat P(wrt). lo que permite entrar a un escritor bloqueado. modificando) la base de datos. éstos decrementan el contador. si existe. ninguno de los demás debería tener acceso a ésta.

…. end Lector. INIT(S.end Escritor. process Principal: INIT(wrt. Escritor. If (Cant_Lectores == 0) V(wrt). …. If (Cant_Lectores == 1) P(wrt). Leer(). COEND end Principal. Cant_Lectores --. 1). P(S). Cant_Lectores ++. Lector. process Lector: repeat P(S). V(S). V(S). Escritor.1). Int Cant_Lectores = 0. COBEGIN Lector. Forever. .

y uno de ellos se queda sin comer. 8. porque alguien debe liberar el tenedor que les falta. i<4. entonces todos se quedarán esperando eternamente. que representarán: •S será el semáforo para mutuoexcluir la sección critica correspondiente a modificar la variable compartida Cant_Lectores. con el tenedor en la mano. se produce una condición de carrera: ambos compiten por tomar el mismo tenedor. Si dos filósofos adyacentes intentan tomar el mismo tenedor a una vez. i++) INIT(tenedor[i]. Si cualquier filósofo coge un tenedor y el otro está ocupado. COBEGIN Filósofo (0). Semáforos: Problema de los filósofos que cenan Cinco filósofos se sientan alrededor de una mesa y pasan su vida cenando y pensando. 1). Nadie lo hará porque todos se encuentran en la misma situación (esperando que alguno deje sus tenedores). Filósofo (2).Se necesitarán como variables compartidas los semáforos S y wrt. Filósofo (4). 4). se quedará esperando. Veamos una posible Solución: process Principal: INIT(Comedor. Si todos los filósofos cogen el tenedor que está a su derecha al mismo tiempo. Este bloqueo mutuo se denomina interbloqueo o deadlock. Para comer los fideos son necesarios dos tenedores y cada filósofo sólo puede tomar los que están a su izquierda y derecha. hasta que pueda coger el otro tenedor. Entonces los filósofos se morirán de hambre. para luego empezar a comer. . Cada filósofo tiene un plato de fideos y un tenedor a la izquierda de su plato. Filósofo (3). Filósofo (1). •Wrt será el semáforo que indicará cuando se habilita a escribir y cuando se debe esperar. El problema consiste en encontrar un algoritmo que permita que los filósofos nunca se mueran de hambre. For (int i=0.

podrían generarse deadlocks. •cada semáforo del arreglo representa si el tenedor está o no siendo usado por algún filósofo (el de su izquierda o derecha). der = (identidad + 1) mod 5 repeat Pensar(). Se necesitarán como variables compartidas los semáforos Comedor y el arreglo de Semáforos tenedor (de largo 5). der.COEND end Principal. que representarán: •Comedor se utiliza para permitir que estén en la mesa a lo sumo 4 filósofos. izq = identidad. Comer(). . V(tenedor[der]). Si todos estuvieran en la mesa a la vez. P(tenerdor[der]). P(Comedor). Notar que los filósofos reciben como parámetro su identidad para saber que tenedores deben tomar. y a todos les da hambre. P(tenedor[izq]). forever end Filósofo. V(Comedor). V(tenedor[izq]). process Filósofo(int identidad): int izq.