Procesos en Un Sistema Operativo:transferencia de Mensajes
Procesos en Un Sistema Operativo:transferencia de Mensajes
Procesos en Un Sistema Operativo:transferencia de Mensajes
Solucin:
Nmeros consecutivos en cada mensaje.
La autenticacin:
Es otro aspecto de los sistemas con mensaje, para esto,
es til el ciframiento de mensajes con una clave que slo
conozcan los usuarios autorizados.
Productor y consumidor:
Tanto el productor como el consumidor crearan
buzones con el tamao suficiente para N mensajes.
Productor enva mensajes con datos al buzn del
consumidor y el consumidor enva mensajes vacos al
buzn del productor.}
El buzn destino almacena los mensajes enviados al
proceso de destino pero tales que no hayan sido
recibidos todava.
Equivalencia de primitivas
Reed y Kanodia (1979) describieron otro mtodo de
comunicacin entre procesos llamado de
secuenciadores.
Campbell y Habberman(1974) analizaron el mtodo de
expresiones de trayectorias.
Atkinson y Hewitt(1979) introdujeron los
serializadores.
Todos los mtodos son en esencia equivalentes, se
puede utilizar cualquiera de ellos para construir los
dems.
NO Solucin
#define N 5
void filosofo(int i)
/* nmero de filsofos */
/* i: nmero de filsofo, de 0 a 4 */
{
while(TRUE){
pensar();
tomar_tenedor(i);
tomar_tenedor((i+1) % N);
*/
comer();
poner_tenedor(i);
poner_tenedor((i+1) % N);
Posible solucin
Problema
#define N 5
/* nmero de filsofos */
#define IZQUIERDO (i+N-1)%N
/* nmero del vecino izquierdo de i */
#define DERECHO (i+1)%N
/* nmero del vecino derecho de i */
#define PENSANDO
/* el filsofo est pensando */
#define HAMBRIENTO 1
/*el filsofo trata de obtener los tenedores */
#define COMIENDO 2
/* el filsofo est comiendo */
typedef int semaforo;
/* los semforos son un tipo especial de int */
int estado[N];
/* arreglo que lleva registro del estado de todos*/
semaforo mutex = 1;
/* exclusin mutua para las regiones crticas */
semaforo s[N];
/* un semforo por filsofo */
void filosofo(int i)
/* i: nmero de filsofo, de 0 a N1 */
{
while(TRUE){
/* se repite en forma indefinida */
pensar();
/* el filsofo est pensando */
tomar_tenedores(i);
/* adquiere dos tenedores o se bloquea */
comer();
/* come espagueti */
poner_tenedores(i);
/* pone de vuelta ambos tenedores en la mesa */
}
}
void tomar_tenedores(int i)
/* i: nmero de filsofo, de 0 a N1 */
{
down(&mutex);
/* entra a la regin crtica */
estado[i] = HAMBRIENTO
/* registra el hecho de que el filsofo i est hambriento */
probar(i);
/* trata de adquirir 2 tenedores */
up(&mutex);
/* sale de la regin crtica */
down(&s[i]);
/* se bloquea si no se adquirieron los tenedores */
}
void poner_tenedores(i)
/* i: nmero de filsofo, de 0 a N1 */
{
down(&mutex);
/* entra a la regin crtica */
estado[i] = PENSANDO;
/* el filsofo termin de comer */
probar(IZQUIERDO);
/* verifica si el vecino izquierdo puede comer ahora */
probar(DERECHO);
/* verifica si el vecino derecho puede comer ahora */
up(&mutex);
/* sale de la regin crtica */
}
void probar(i)
/* i: nmero de filsofo, de 0 a N1 */
{
if (estado[i] == HAMBRIENTO && estado[IZQUIERDO] != COMIENDO && estado[DERECHO] != COMIENDO) {
estado[i] = COMIENDO;
up(&s[i]);
}
}
SOLUCI
N
FINAL
Solucin final
Utiliza un arreglo estado para llevar un registro de la
actividad de un filsofo(pensando, comiendo o
hambriento).
Un filsofo puede comer slo si los vecinos no estn
comiendo.
Los vecinos del i-simo filsofo se definen en los macros
IZQUIERDO y DERECHO.
El programa utiliza un arreglo de semforos , uno por
cada filsofo, de manera que los filsofos hambrientos
pueden bloquearse si los tenedores necesarios estn
ocupados.
Problema
Se puede aceptar que varios procesos
lean la base de datos al mismo
tiempo, pero si uno de los procesos
est escribiendo(modificando) la base
de datos, ninguno de los dems
procesos debera tener acceso a sta,
ni siquiera los lectores.
Solucin
El primer lector que obtiene el
acceso a la base de datos lleva
acabo un DOWN en el semforo
db. Los siguientes lectores
simplemente incrementan un
contador llamado cl.
A medida que los lectores van
saliendo, decrementan el
contador y el ltimo realiza una
operacin up en el semforo,
para permitir que un escritor
bloqueado (si lo hay) entre.
/* use su imaginacin */
/* controla el acceso a cl */
/* controla el acceso a la base de datos */
/* # de procesos que leen o desean hacerlo */
/* se repite de manera indefinida */
/* obtiene acceso exclusivo a cl */
/* ahora hay un lector ms */
/* si este es el primer lector ... */
/* libera el acceso exclusivo a cl */
/* accede a los datos */
/* obtiene acceso exclusivo a cl */
/* ahora hay un lector menos */
/* si este es el ltimo lector ... */
/* libera el acceso exclusivo a cl */
/* regin no crtica */
Problema
Suponga que mientras un lector utiliza la
base de datos, llega otro lector. Como no
es un problema tener dos lectores al
mismo tiempo, el segundo lector es
admitido. Tambin se pueden
admitir ms lectores, si es que llegan.
Ahora suponga que aparece un escritor. Tal
vez ste no sea admitido a la base de
datos, ya que
los escritores deben tener acceso
exclusivo y por ende, el escritor se
suspende. Ms adelante aparecen
lectores adicionales. Mientras que haya un
lector activo, se admitirn los siguientes
lectores.
El escritor estar suspendido hasta que no
haya un lector presente.
Solucin
Para evitar esta situacin, el programa
se podra escribir de una manera
ligeramente distinta:
Cuando llega un lector y hay un
escritor en espera, el lector se
suspende detrs del escritor, en vez
de ser admitido de inmediato.
De esta forma, un escritor tiene que
esperar a que terminen los lectores
que estaban activos cuando lleg,
pero no tiene que esperar a los
lectores que llegaron despus de l.