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 ...
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”