02.03.2014 Views

SO-mod 3-Procesos - Facultad de Ingeniería - Universidad Nacional ...

SO-mod 3-Procesos - Facultad de Ingeniería - Universidad Nacional ...

SO-mod 3-Procesos - Facultad de Ingeniería - Universidad Nacional ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Procesos</strong><br />

Módulo 3<br />

Departamento <strong>de</strong> Informática<br />

<strong>Facultad</strong> <strong>de</strong> <strong>Ingeniería</strong><br />

<strong>Universidad</strong> <strong>Nacional</strong> <strong>de</strong> la Patagonia “San Juan Bosco”<br />

<strong>Procesos</strong><br />

Concepto <strong>de</strong> Proceso<br />

Planificación <strong>de</strong> Proceso<br />

Operaciones sobre <strong>Procesos</strong><br />

Comunicaciones Interprocesos (IPC)<br />

Ejemplos <strong>de</strong> Sistemas <strong>de</strong> IPC<br />

Comunicación en un Sistema Cliente-<br />

Servidor<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Objetivos<br />

Introducir la noción <strong>de</strong> proceso – un programa<br />

en ejecución, el cual conforma la base <strong>de</strong> toda<br />

computación<br />

Describir varias características <strong>de</strong> procesos,<br />

incluyendo planificación, creación y<br />

terminación, y comunicación<br />

Describir la comunicación en sistemas clienteservidor<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Concepto <strong>de</strong> Proceso<br />

Un <strong>SO</strong> ejecuta una variedad <strong>de</strong> programas:<br />

Sistema Batch – jobs<br />

Sistemas <strong>de</strong> Tiempo Compartido – programas <strong>de</strong> usuario<br />

o tareas<br />

Los términos job, tarea y proceso se usan con similar sentido.<br />

Proceso – un programa en ejecución; la ejecución <strong>de</strong> los<br />

procesos <strong>de</strong>be progresar en forma secuencial.<br />

Un proceso incluye:<br />

contador <strong>de</strong> programa<br />

stack<br />

sección <strong>de</strong> datos<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


<strong>Procesos</strong> en Memoria<br />

datos<br />

texto<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Estado <strong>de</strong> los <strong>Procesos</strong><br />

En tanto que un proceso ejecuta, cambia <strong>de</strong><br />

estado<br />

nuevo: el proceso es creado.<br />

corriendo: las instrucciones están siendo<br />

ejecutadas.<br />

espera: el proceso está esperando que<br />

ocurra algún evento.<br />

listo: el proceso está esperando ser<br />

asignado a la CPU.<br />

terminado: el proceso ha finalizado su<br />

ejecución.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Diagrama <strong>de</strong> Estados <strong>de</strong> un Proceso<br />

nuevo<br />

listos<br />

evento<br />

completado<br />

<strong>de</strong>spacho<br />

interrup<br />

espera<br />

corriendo<br />

evento e/s<br />

exit<br />

terminado<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Diagrama <strong>de</strong> Estados <strong>de</strong> un Proceso<br />

Diagrama con cinco estados<br />

nuevo<br />

react<br />

susp<br />

listos<br />

<strong>de</strong>spacho<br />

evento<br />

comp<br />

interrup<br />

espera<br />

corriendo<br />

evento e/s<br />

susp<br />

exit<br />

terminado<br />

Susp-listo<br />

react<br />

evento comp<br />

Susp-esp<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Bloque <strong>de</strong> Control <strong>de</strong> <strong>Procesos</strong> (PCB)<br />

Es una estructura <strong>de</strong> dato que contiene información<br />

asociada con cada proceso.<br />

Estado <strong>de</strong> Proceso<br />

Contador <strong>de</strong> Programa<br />

Registros <strong>de</strong> CPU<br />

Información <strong>de</strong> planificación <strong>de</strong> CPU<br />

Información <strong>de</strong> administración <strong>de</strong> memoria<br />

Información contable<br />

Información <strong>de</strong> estado E/S<br />

PCB: Process Control Block<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Bloque <strong>de</strong> Control <strong>de</strong> Proceso (PCB)<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Conmutación <strong>de</strong> CPU <strong>de</strong> Proceso a Proceso<br />

ejecución<br />

P-0 <strong>SO</strong><br />

interrupción o llamada al sistema P-1<br />

salva estado en PCB-0<br />

.<br />

carga estado <strong>de</strong> PCB-1<br />

ocioso<br />

ocioso<br />

ejecución<br />

interrupción o llamada al sistema<br />

salva estado en PCB-1<br />

.<br />

carga estado <strong>de</strong> PCB-0<br />

ejecución<br />

ocioso<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Colas <strong>de</strong> Planificación <strong>de</strong> <strong>Procesos</strong><br />

Cola <strong>de</strong> Job (o tareas) – conjunto <strong>de</strong> todos los<br />

procesos en el sistema.<br />

Cola <strong>de</strong> listos – conjunto <strong>de</strong> todos los procesos<br />

resi<strong>de</strong>ntes en memoria principal, listos y esperando<br />

para ejecutar.<br />

Colas <strong>de</strong> dispositivos – conjunto <strong>de</strong> procesos<br />

esperando por una E/S en un dispositivo <strong>de</strong> E/S.<br />

Migración <strong>de</strong> procesos entre las colas.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Colas <strong>de</strong> listos y <strong>de</strong> Dispositivos <strong>de</strong> E/S<br />

cola <strong>de</strong><br />

listos<br />

inicio<br />

final<br />

reg<br />

reg<br />

cinta mag<br />

unidad 0<br />

inicio<br />

final<br />

PCB-4<br />

PCB-0<br />

PCB-7<br />

PCB-14<br />

PCB-5<br />

disco<br />

unidad 0<br />

inicio<br />

final<br />

reg<br />

reg<br />

reg<br />

terminal<br />

unidad 0<br />

inicio<br />

final<br />

reg<br />

PCB-6<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Representación <strong>de</strong> Planificación <strong>de</strong> <strong>Procesos</strong><br />

cola <strong>de</strong> listo<br />

cpu<br />

i/o<br />

join<br />

cola I/O<br />

ejecuta<br />

hijo<br />

cola espera<br />

cola recurso<br />

req I/O<br />

Expira tajada<br />

<strong>de</strong> tiempo<br />

fork hijo<br />

requiere<br />

recurso<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Planificadores <strong>de</strong> <strong>Procesos</strong><br />

Planificador <strong>de</strong> largo término ( o planificador<br />

<strong>de</strong> jobs ) – selecciona que procesos <strong>de</strong>berían<br />

ser puestos en la cola <strong>de</strong> listos.<br />

Planificador <strong>de</strong> corto término (o planificador <strong>de</strong><br />

CPU ) – selecciona que procesos <strong>de</strong>berían ser<br />

proximamente ejecutados y colocados en la<br />

CPU.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Planificación <strong>de</strong> mediano término<br />

fuera <strong>de</strong><br />

swapping<br />

procesos parcialmente<br />

ejecutados al swapping<br />

entrada en<br />

swapping<br />

cola <strong>de</strong> listos<br />

CPU<br />

fin<br />

E/S<br />

cola <strong>de</strong><br />

espera E/S<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Planificadores <strong>de</strong> <strong>Procesos</strong> (Cont.)<br />

El planificador <strong>de</strong> corto término es invocado muy<br />

frecuentemente (milisegundos) ⇒ (<strong>de</strong>be ser rápido).<br />

El planificador <strong>de</strong> largo término es invocado poco<br />

frecuentemente (segundos, minutos) ⇒ (pue<strong>de</strong> ser muy<br />

lento).<br />

El planificador <strong>de</strong> largo término controla el grado <strong>de</strong><br />

multiprogramación.<br />

Los procesos pue<strong>de</strong>n ser <strong>de</strong>scriptos como:<br />

<strong>Procesos</strong> limitados por E/S – pasa mas tiempo<br />

haciendo E/S que computaciones, ráfagas (burst) <strong>de</strong><br />

CPU muy cortas.<br />

<strong>Procesos</strong> limitados por CPU – pasa mas tiempo<br />

haciendo computaciones que E/S, ráfagas (burst) <strong>de</strong><br />

CPU muy largas.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Cambio <strong>de</strong> contexto<br />

Cuando la CPU conmuta a otro proceso, el sistema<br />

<strong>de</strong>be salvar el estado <strong>de</strong>l viejo proceso y cargar el<br />

estado para el nuevo proceso vía un cambio <strong>de</strong><br />

contexto.<br />

El contexto <strong>de</strong> un proceso está representado en el<br />

PCB<br />

El tiempo que lleva el cambio <strong>de</strong> contexto es<br />

sobrecarga; el sistema no hace trabajo útil mientras<br />

está conmutando.<br />

El tiempo <strong>de</strong>pen<strong>de</strong> <strong>de</strong>l soporte <strong>de</strong> hardware .<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Creación <strong>de</strong> <strong>Procesos</strong><br />

<strong>Procesos</strong> padres crean procesos hijos, lo cuales, a su<br />

vez crean otros procesos, formando un árbol <strong>de</strong><br />

procesos.<br />

Recursos compartidos<br />

Padres e hijos comparten todos los recursos.<br />

Hijo comparte un subconjunto <strong>de</strong> los recursos <strong>de</strong>l<br />

padre.<br />

Padre e hijo no comparten ningún recurso.<br />

Ejecución<br />

Padres e hijos ejecutan concurrentemente.<br />

Padres esperan hasta que los hijos terminan.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Creación <strong>de</strong> <strong>Procesos</strong> (Cont.)<br />

Espacio <strong>de</strong> direcciones<br />

El hijo replica el <strong>de</strong>l padre.<br />

El hijo tiene un programa cargado en él.<br />

Ejemplos <strong>de</strong> UNIX<br />

La llamada a sistema fork crea un nuevo proceso<br />

La llamada a sistema execve es usada <strong>de</strong>spués <strong>de</strong>l<br />

fork para reemplazar el espacio <strong>de</strong> memoria <strong>de</strong>l<br />

proceso con un nuevo programa.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Creación <strong>de</strong> <strong>Procesos</strong><br />

padre<br />

Se reactiva<br />

hijo<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Fork <strong>de</strong> <strong>Procesos</strong> en “C”<br />

int main()<br />

{<br />

pid_t pid;<br />

/* fork another process */<br />

pid = fork();<br />

if (pid < 0) { /* error occurred */<br />

fprintf(st<strong>de</strong>rr, "Fork Failed");<br />

exit(-1);<br />

}<br />

else if (pid == 0) { /* child process */<br />

execlp("/bin/ls", "ls", NULL);<br />

}<br />

else { /* parent process */<br />

/* parent will wait for the child to complete */<br />

wait (NULL);<br />

printf ("Child Complete");<br />

exit(0);<br />

}<br />

}<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Un Arbol <strong>de</strong> <strong>Procesos</strong> en Solaris<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Árbol <strong>de</strong> <strong>Procesos</strong> en UNIX<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Terminación <strong>de</strong> <strong>Procesos</strong><br />

El proceso ejecuta la última sentencia y espera que el <strong>SO</strong><br />

haga algo (exit).<br />

Los datos <strong>de</strong> salida <strong>de</strong>l hijo se pasan al padre (via wait).<br />

Los recursos <strong>de</strong> los procesos son liberados por el <strong>SO</strong>.<br />

El padre pue<strong>de</strong> terminar la ejecución <strong>de</strong>l proceso hijo<br />

(abort).<br />

El hijo ha excedido los recursos alocados.<br />

La tarea asignada al hijo no es mas requerida.<br />

El padre está terminando.<br />

El <strong>SO</strong> no permite a los hijos continuar si su padre<br />

termina.<br />

Terminación en cascada.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Comunicación Interprocesos (IPC)<br />

<br />

<br />

<br />

<br />

<br />

Los procesos en un sistema pue<strong>de</strong>n ser in<strong>de</strong>pendientes o<br />

cooperativo<br />

Los procesos cooperativos pue<strong>de</strong>n afectar o ser afectados por<br />

otros procesos, cuando incluyen datos compartidos<br />

Razones para procesos cooperativos<br />

Información compartida<br />

Speedup <strong>de</strong> computación<br />

Modularidad<br />

Conveniencia<br />

Los procesos cooperativos necesitan comunicación<br />

interprocesos (IPC)<br />

Dos <strong>mod</strong>elos <strong>de</strong> IPC<br />

Memoria compartida<br />

Pasaje <strong>de</strong> Mensajes<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Mo<strong>de</strong>los <strong>de</strong> Comunicación<br />

Pasaje <strong>de</strong> mensajes<br />

Memoria compartida<br />

proceso A<br />

proceso B<br />

proceso A<br />

memoria compartida<br />

proceso B<br />

kernel<br />

kernel<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

<strong>Procesos</strong> Cooperativos<br />

Un proceso in<strong>de</strong>pendiente no pue<strong>de</strong> afectar ni ser<br />

afectado por la ejecución <strong>de</strong> otro proceso.<br />

Un proceso cooperativo pue<strong>de</strong> afectar o ser afectado<br />

por la ejecución <strong>de</strong> otro proceso.<br />

Ventajas <strong>de</strong> los procesos cooperativos<br />

Información compartida<br />

Aceleración <strong>de</strong> la computación<br />

Modularidad<br />

Conveniencia<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Problema <strong>de</strong>l Productor-Consumidor<br />

Paradigma procesos cooperativos, el proceso<br />

productor produce información que es<br />

consumida por un proceso consumidor .<br />

buffer ilimitado - no tiene límites prácticos en<br />

el tamaño <strong>de</strong>l buffer.<br />

buffer limitado supone que hay un tamaño fijo<br />

<strong>de</strong> buffer.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Buffer limitado – Solución con memoria compartida<br />

<br />

<br />

Datos compartidos<br />

var n;<br />

type item = … ;<br />

var buffer. array [0..n–1] of item;<br />

in, out: 0..n–1;<br />

Proceso Productor<br />

repeat<br />

…<br />

produce un item en nextp<br />

…<br />

while in+1 <strong>mod</strong> n = out do no-op;<br />

buffer [in] :=nextp;<br />

in :=in+1 <strong>mod</strong> n;<br />

until false;<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Buffer limitado – Solución con memoria compartida<br />

Datos compartidos<br />

#<strong>de</strong>fine BUFFER_SIZE 10<br />

type<strong>de</strong>f struct {<br />

. . .<br />

} item;<br />

item buffer[BUFFER_SIZE];<br />

int in = 0;<br />

int out = 0;<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Buffer limitado (cont.)<br />

<br />

Proceso Consumidor<br />

repeat<br />

while in = out do no-op;<br />

nextc := buffer [out];<br />

out := out+1 <strong>mod</strong> n;<br />

…<br />

consume un item en nextc<br />

…<br />

until false;<br />

<br />

La solución es correcta, pero solo pue<strong>de</strong> llenar el buffer hasta n–1.<br />

JRA © 2008 Sistemas Operativos – <strong>Procesos</strong><br />

32


Buffer limitado - Productor<br />

while (true) {<br />

/* Produce un item */<br />

}<br />

while (((in = (in + 1) % BUFFER SIZE count) == out)<br />

; /* no hace nada -- no hay buffers libres */<br />

buffer[in] = item;<br />

in = (in + 1) % BUFFER SIZE;<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Buffer limitado – Consumidor<br />

while (true) {<br />

while (in == out)<br />

; // do nothing --/* nada a consumir */<br />

/* remueve un item <strong>de</strong>l buffer*/<br />

item = buffer[out];<br />

out = (out + 1) % BUFFER SIZE;<br />

return item;<br />

}<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Comunicación entre <strong>Procesos</strong> (IPC)<br />

Mecanismo <strong>de</strong> los procesos para comunicarse y sincronizar<br />

sus acciones.<br />

Sistema <strong>de</strong> mensajes – los procesos se comunican uno con<br />

otro sin necesidad <strong>de</strong> variables compartidas.<br />

Las facilida<strong>de</strong>s <strong>de</strong> IPC provee dos operaciones:<br />

send(mensaje) – mensaje <strong>de</strong> tamaño fijo o variable<br />

receive(mensaje)<br />

Si P and Q <strong>de</strong>sean comunicarse, necesitan:<br />

Establecer un vínculo <strong>de</strong> comunicación entre ellos<br />

Intercambiar mensajes via send/receive<br />

Implementación <strong>de</strong> un vínculo <strong>de</strong> comunicación<br />

lógico (p.e., propieda<strong>de</strong>s lógicas)<br />

físicol (p.e., memoria compartida, canal hardware)<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Preguntas sobre la Implementación<br />

¿Cómo se establecen los vínculos?<br />

¿Pue<strong>de</strong> un vínculo ser asociado con mas <strong>de</strong> dos<br />

procesos?<br />

¿Cuántos vínculos pue<strong>de</strong> haber entre cada par <strong>de</strong><br />

procesos que se comunican?<br />

¿Cuál es la capacidad <strong>de</strong> un vínculo?<br />

¿El vinculo pue<strong>de</strong> aceptar tamaño <strong>de</strong> mensajes fijo o<br />

variable?<br />

¿Es vínculo unidireccional o bi-direccional?<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Comunicación Directa<br />

Los procesos <strong>de</strong>ben nombrar al otro explicitamente:<br />

send (P, mensaje) – envía un mensaje al proceso<br />

P<br />

receive(Q, mensaje) – recibe un mensaje <strong>de</strong>l<br />

proceso Q<br />

Propieda<strong>de</strong>s <strong>de</strong>l vínculo <strong>de</strong> comunicación<br />

Los vínculos son establecidos automaticamente.<br />

Un vínculo está asociado con exactamente un par<br />

<strong>de</strong> procesos que se comunican.<br />

Entre cada par existe exactamente un vínculo.<br />

El vínculo pue<strong>de</strong> ser unidireccional, pero es<br />

usualmente bi-direccional.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Comunicación Indirecta<br />

Los mensajes son dirigidos y recibidos <strong>de</strong>s<strong>de</strong> mailboxes<br />

(también referidas como ports).<br />

Cada mailbox tiene una única i<strong>de</strong>ntificación.<br />

Los procesos pue<strong>de</strong>n comunicarse solo si comparten un<br />

mailbox.<br />

Propieda<strong>de</strong>s <strong>de</strong> un vínculo <strong>de</strong> comunicación<br />

El vínculo se establece solo si los procesos comparten un<br />

mailbox común.<br />

Un vínculo pue<strong>de</strong> ser asociado con muchos procesos.<br />

Cada par <strong>de</strong> procesos pue<strong>de</strong> compartir varios vínculos <strong>de</strong><br />

comunicación.<br />

Los vínculos pue<strong>de</strong>n ser unidireccionales o bi-direccionales.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Comunicación Indirecta (cont.)<br />

Operaciones<br />

crear un nuevo mailbox<br />

enviar y recibir mensajes por medio <strong>de</strong>l mailbox<br />

<strong>de</strong>struir un mailbox<br />

Las primitivas son <strong>de</strong>finidas como:<br />

send(A, mensaje) – envía un mensaje al mailbox A<br />

receive(A, mensaje) – recibe un mensaje <strong>de</strong>l<br />

mailbox A<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Comunicación Indirecta (cont.)<br />

Mailbox compartida<br />

P 1 , P 2 , y P 3 comparten el mailbox A.<br />

P 1 , envía; P 2 y P 3 reciben.<br />

¿Quién toma el mensaje?<br />

Solución<br />

Permitir que un vínculo está asociado a lo sumo con dos<br />

procesos.<br />

Permitir que un solo proceso a la vez ejecute la operación<br />

receive.<br />

Permitir que el sistema seleccione arbitrariamente el<br />

receptor. El enviador es notificado quien fue el receptor<br />

<strong>de</strong>l mensaje.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Sincronización<br />

El pasaje <strong>de</strong> mensajes pue<strong>de</strong> ser bloqueante o no<br />

bloqueante.<br />

Bloqueante es consi<strong>de</strong>rado sincrónico<br />

<br />

<br />

Send bloqueante mantiene al enviador bloqueado hasta<br />

que el mensaje es recibido<br />

Receive bloqueante mantiene al receptor bloqueado<br />

hasta que el mensaje esté disponible<br />

No bloqueante es consi<strong>de</strong>rado asincrónico<br />

<br />

<br />

Send no bloqueante: el emisor envía el mensaje y<br />

continúa<br />

Receive no bloqueante : el receptor recibe un mensaje<br />

válido o nulo<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Buffering<br />

La cola <strong>de</strong> mensajes asociada al vínculo se pue<strong>de</strong><br />

implementar <strong>de</strong> tres maneras.<br />

1.Capacidad – 0 mensajes<br />

El enviador <strong>de</strong>be esperar por el receptor (ren<strong>de</strong>zvous).<br />

2.Capacidad limitada – longitud finita <strong>de</strong> n mensajes<br />

El enviador <strong>de</strong>be esperar si el vínculo está lleno.<br />

3.Capacidad ilimitada – longitud infinita<br />

El enviador nunca espera.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Ejemplos <strong>de</strong> Sistemas IPC - POSIX<br />

<br />

Memoria compartida POSIX<br />

<br />

El proceso primero crea un segmento <strong>de</strong> memoria compartida<br />

segment id = shmget(IPC PRIVATE, size, S IRUSR | S<br />

IWUSR);<br />

<br />

El proceso que quiere acce<strong>de</strong>r a la memoria compartida <strong>de</strong>be<br />

adjuntarse a ella<br />

shared memory = (char *) shmat(id, NULL, 0);<br />

<br />

Ahora el proceso pue<strong>de</strong> escribir en la memoria compartida<br />

sprintf(shared memory, "Writing to shared memory");<br />

<br />

Finalizado el proceso <strong>de</strong>be liberar a su espacio <strong>de</strong> direcciones <strong>de</strong>l la<br />

memoria compartida<br />

shmdt(shared memory);<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Ejemplos <strong>de</strong> Sistemas IPC - Mach<br />

La comunicación en Mach está basada en mensajes<br />

Las llamadas a sistema son mensajes<br />

Des<strong>de</strong> su creación cada proceso tiene dos mailbox –<br />

Kernel y Notify<br />

Se necesitan solo tres llamadas a sistema para<br />

transferir mensajes<br />

msg_send(), msg_receive(), msg_rpc()<br />

Las mailbox necesarias para la comunicación, son<br />

creadas vía:<br />

port_allocate()<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Ejemplos <strong>de</strong> Sistemas IPC – Windows XP<br />

<br />

Centrado en el pasaje <strong>de</strong> mensajes vía facilida<strong>de</strong>s <strong>de</strong> llamadas a<br />

procedimientos locales (local procedure call (LPC) )<br />

Sólo funciona entre procesos sobre el mismo sistema<br />

Usa pórticos (como mailboxes) para establecer y mantener<br />

canales <strong>de</strong> comunicación<br />

La comunicación funciona <strong>de</strong> la siguiente manera:<br />

El cliente abre un handle <strong>de</strong>l pórtico <strong>de</strong>l subsistema <strong>de</strong><br />

conexión<br />

El cliente envía una petición <strong>de</strong> conexión<br />

El servidor crea dos pórticos privados <strong>de</strong> comunicación y<br />

retorna el handle <strong>de</strong> uno <strong>de</strong> ellos al cliente<br />

El cliente y el servidor usan el correspondiente handle <strong>de</strong>l<br />

pórtico para enviar mensajes o retornos y para “escuchar” por<br />

réplicas<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Llamadas a Procedimientos Locales en Windows XP<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Comunicación Cliente-Servidor<br />

Sockets<br />

Llamadas a Procedimientos Remotors<br />

(RPC:Remote Procedure Calls)<br />

Invocación a Métodos Remotos (RMI:Remote<br />

Method Invocation (Java))<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Sockets<br />

Un socket es <strong>de</strong>finido como un punto final <strong>de</strong><br />

comunicación.<br />

Concatenación <strong>de</strong> dirección IP y pórtico<br />

El socket 161.25.19.8:1625 se refiere al pórtico 1625 en<br />

el host 161.25.19.8<br />

La comunicación se lleva a cabo entre un par <strong>de</strong><br />

sockets.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Comunicación por Sockets<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Llamadas a Procedimientos Remotos<br />

(RPC: Remote Procedure Calls)<br />

Las RPCs produce una llamada a procedimiento entre<br />

procesos sobre un sistema <strong>de</strong> re<strong>de</strong>s.<br />

Stubs – proxy <strong>de</strong>l lado <strong>de</strong>l cliente y <strong>de</strong>l lado <strong>de</strong>l<br />

procedimiento <strong>de</strong>l servidor.<br />

El stub <strong>de</strong>l lado <strong>de</strong>l cliente localiza el servidor y hace<br />

marshall <strong>de</strong> los parámetros.<br />

El stub <strong>de</strong>l lado <strong>de</strong>l servidor recibe este mensaje,<br />

<strong>de</strong>sempaca los parámetros y ejecuta el procedimiento<br />

en el servidor.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Ejecución <strong>de</strong> RPC<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Invocación <strong>de</strong> Métodos Remotos (RMI)<br />

RMI es un mecanismo <strong>de</strong> Java similar a los RPCs.<br />

RMI permite a un programa Java, sobre una máquina,<br />

invocar un método sobre un objeto remoto.<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong>


Marshalling <strong>de</strong> Parámetros<br />

JRA © 2008<br />

Sistemas Operativos – <strong>Procesos</strong><br />

Fin<br />

Módulo 3<br />

Departamento <strong>de</strong> Informática<br />

<strong>Facultad</strong> <strong>de</strong> <strong>Ingeniería</strong><br />

<strong>Universidad</strong> <strong>Nacional</strong> <strong>de</strong> la Patagonia “San Juan Bosco”

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!