Sie sind auf Seite 1von 16

Administración de Procesos Concurrentes

-procesos son disjuntos si no comparten áreas de datos,pueden existir en forma concurrente,


respetando simplemente algún protocolo de precedencia para el acceso al estado de ejecución. El
problema surge cuando éstos requieren compartir algún tipo de recursos en general, y en
particular la memoria.

Principios de Compartimiento de Datos

Un área de datos compartidos puede utilizarse con propósitos de consulta (lectura) o modificación
(escritura).

Ejemplo:

Sea:

• R(p1): el área de datos consultado por el proceso 1

• R(p2): el área de datos consultada por el proceso 2

• W(p1): el área de datos modificada por el proceso 1

• W(p2): el área de datos modificada por el proceso 2

Región Crítica

 lo que se debe lograr es compartir los recursos en forma coordinada para evitar errores.

 El código o texto de un programa reconoce regiones, asociadas a líneas de código en


ejecución. Es decir, el programa “permanece en una región” mientras ejecute las líneas
respectivas La ejecución puede involucrar una o más pasadas en un loop.

 Un programa puede tener un número arbitrario de regiones, lo que interesa es asignarle un


atributo especial a la región

Un proceso se encuentra en región crítica cuando está ejecutando código que involucra recursos
compartidos con otros procesos. Fuera de la región crítica, los procesos se comportan como
disjuntos por lo que su concurrencia no produce problemas, dentro de la región crítica se debe
trabajar en exclusión mutua, es decir, sólo puede haber un proceso ejecutando el código de su
región crítica. En un ambiente multiusuario, la llegada de procesos responde a una variable
aleatoria, por lo que es perfectamente posible que varios procesos quieran ejecutar código de su
región crítica en forma concurrente. En este caso, la aplicación de la exclusión mutua significa que
un solo proceso puede entrar en región crítica y los demás deben esperar.

La misión del Sistema Operativo es:

• Permitir el ingreso a región crítica en exclusión mutua.

• Garantizar una espera mínima a los demás procesos.


Sincronización de Procesos
Existen diversas herramientas de programación que se han desarrollado para resolver el
problema de la concurrencia de procesos, destacándose:

 Espera activa

 Semáforos

 Monitores.

-Espera activa (busy wait)

Cuando un proceso espera por ingresar a región crítica, lo hace ejecutando un ciclo while en el
que se pregunta por el valor lógico de la variable que permite el acceso. En un ambiente de
tiempo compartido esto significa que el proceso ocupará tiempo de procesador en una
actividad completamente inútil, puesto que será el otro proceso quien en definitiva le
permitirá el ingreso a zona crítica. Normalmente se deben evitar estas situaciones de espera
activa ya que pueden llegar a degradar seriamente la performance de todo el sistema.

Acceso alternado

El acceso a región crítica se logra en un esquema alternado p1, p2, p1, p2, lo cual puede resolver
un problema particular pero impedir el cumplimiento de la condición que un proceso debe esperar
por ingresar a región crítica no más allá del tiempo requerido por los procesos que le preceden en
realizar la misma tarea. En cualquier otro caso se habla de posposición, que en un caso extremo se
convierte en posposición indefinida.

Semáforos
 Para evitar la espera activa, es necesario forzar una condición de bloqueo para un proceso
que está en espera para ingresar a región crítica.

 La solución propuesta por Dijkstra consistente en los semáforos, representa una solución
óptima para el problema de la sincronización, desde el punto de vista individual de cada
proceso.

Un semáforo tiene una definición de objeto, en el sentido que está constituido por una
estructura de datos (una cola) y un conjunto de operaciones que la administran.

Las operaciones de semáforos son:

 WAIT:

 Si se ejecuta cuando no hay otro proceso en región crítica, permite el ingreso. En


caso contrario, el proceso se bloquea e ingresa a la cola de espera asociada al
semáforo.

 SIGNAL:
 La operación signal la ejecuta el proceso que abandona la región crítica. Si existen
procesos en espera, se habilita la pasada del primero, en caso contrario,
simplemente habilita la entrada al siguiente proceso que lo solicite.

Con las primitivas wait y signal, el problema de la concurrencia de n procesos puede ser
resuelto en condiciones óptimas.

los procesos esperan sólo lo necesario para ingresar en región crítica y pueden hacerlo en
reiteradas oportunidades, sin esperar, siempre que otro proceso no quiera ingresar.

-Ejemplos de Aplicación

Ejemplos:

• Procesamiento paralelo

• Problema Productor-Consumidor.--> consiste en que dos procesos comparten un área de


almacenamiento intermedio (buffer). El productor deposita datos en el buffer y el
consumidor los recupera.

Los procesos actúan en forma concurrente, con las siguientes restricciones:

-El acceso al buffer de datos debe hacerse en exclusión mutua.

-El productor no puede ingresar datos en un buffer lleno.

-El consumidor no puede extraer datos de un buffer vacío.

Problema Lectores-Escritores

un conjunto de procesos comparte un área de datos. Los procesos que no la modifican son los
lectores. Los que la modifican son los escritores.

Claramente pueden existir varios procesos lectores en forma simultánea, sin embargo los
escritores deben concurrir en exclusión mutua.

En la solución, los escritores deberán esperar hasta que no haya lectores, además puede
producir una posposición indefinida de escritores.

Monnitores

Los monitores permiten concurrencia que no depende de los procesos individuales. Garantiza
exclusión mutua y produce esperas fuera del monitor.

Los datos residen en el monitor y están ocultos para todos los procesos. Sólo se puede
acceder a los datos a través de los procedimientos del monitor. Los datos del monitor pueden
ser globales para todo el monitor o locales para cada uno de sus procedimientos.
Mensajes

En sistemas distribuidos, no existe la posibilidad de realización de operaciones atómicas entre


procesadores independientes.

Paso de mensajes :

• enviar(proceso_destino, mensaje)

• recibir(proceso_origen, mensaje)

• Un envío con bloqueo, espera hasta recibir confirmación desde el receptor, para
continuar. Si no hay bloqueo, la comunicación es asincrónica y el proceso que envía puede
intentar comunicaciones alternativas.

• Una recepción con bloqueo, permite sincronizar la espera, hasta que se reciban datos. Si
no hay bloqueo, se tiene una recepción asincrónica en la cual el proceso receptor puede
preguntar por otras alternativas de recibir mensajes.

Interbloqueo

Condición que produce una situación de espera permanente a un conjunto de procesos.

Condiciones de interbloqueo :

• Exclusión mutua

• Mantención de recurso en espera.

• No se libera el recurso tomado.

• Existe una condición de espera circular.

Las 4 condiciones son necesarias. Para evitar el interbloqueo, basta con romper cualquiera de
las condiciones.

Ver pag. 90

 El proceso A tiene asignado el recurso 1 y solicita el recurso 2.

 El proceso B tiene asignado el recurso 2 y solicita el recurso 1.

 Ningún proceso puede progresar hasta que tenga asignados la totalidad de los recursos
requeridos.

 El concepto de recurso es variado, podría ser espacio en ram, espacio en disco o cualquier
otro elemento, solicitado en forma concurrente por otro u otros procesos.

 Una solución clásica a este problema consiste en asignar un número único a cada recurso
disponible. Se define como regla que ningún proceso puede recibir un recurso de
numeración inferior al que actualmente dispone.

 Para el grafico de la figura


 Proceso A : tiene asignado recurso 1

 Solicita recurso 2

 Proceso B : Tiene asignado recurso 2

 Solicita recurso 1 ** solicitud ilegal **

  debe devolver los recursos asignados.

 De esta manera, el proceso A completa su tarea y libera los recursos, para que los pueda
utilizar el proceso B.

 Para el caso de existencia de múltiples unidades de un tipo de recurso, se utilizan grafos


que engloban los recursos.

Estructura de unix

-hardware

-kernel

-utilitarios

-aplicaciones

UNIX EJECUTA LAS SIGUIENTES FUNCIONES: • Distribuye recursos del sistema • Planea tareas
• Procesa requerimientos del usuario • Ejecuta funciones administrativas • Ejecuta funciones
de mantenimiento

UNIX ES : • Software que soporta el hardware • Tiempo-compartido • Multiusuario •


Interactivo

Shell: Intérprete de Comandos

Actúa como interfaz del sistema con el usuario, es un intérprete de comando y un lenguaje de
programación. Shell está basado en la línea de comandos, es decir el usuario debe ingresar un
comando para su ejecución. alternativa a los sistemas de comunicación gráfica, basadas en la
selección de acciones a través de un icono que las representa.

LAS CARACTERISTICAS DEL DISEÑO INCLUYEN : I/O simplificado : Todas las funciones de E/S
están ligadas al sistema de archivos, permitiendo independencia de dispositivos. Sistema de
archivo flexible : Es uno de los puntos más importantes de UNIX .

Dentro de los intérpretes de comando mas conocidos están: – Bash – Sh – Zsh – Python

interprete de comandos es un programa que se inicia (un proceso) y se queda esperando


hasta recibir un comando.

Un interprete de comandos ejecuta .Tiene la capacidad de ser programado para realizar


ciertas tareas usando expresiones regulares o bien usando la sintaxis definida para el
interprete.
Interfaz grafica

la interfaz de usuario se puede realizar completamente en forma gráfica, siguiendo la


orientación a objetos con íconos que tienen asociados programas y menús desplegables que
permiten buscar en forma intuitiva las aplicaciones. Toda acción asociada a los objetos de
pantalla tienen una equivalencia en comandos del shell de Unix. Interfaces más usadas en
Linux: Gnome, KDE, LXDE, XFCE y Fluxbox.

Usuarios

UNIX =sistema multiusuario, en donde el primer paso consiste en llegar a ser usuario del
sistema. UNIX tiene básicamente dos tipos de usuarios : usuario normal y superusuario (root).
Todas las restricciones de seguridad del sistema están dirigidas a los usuarios normales.

El superusuario (administrador) tiene privilegios de confiabilidad y tiene como misión la


administración del sistema,definición de nuevos usuarios, es el responsable por activar y
desactivar el sistema.

Para ser usuario de UNIX, se requiere de una cuenta de trabajo. Una cuenta posee un
directorio de trabajo inicial, individual para cada usuario. En este punto se describen las
acciones necesarias para llegar a ser usuario del sistema y mantener un esquema de trabajo
seguro a través del uso de una palabra clave (password).

Cada usuario Linux posee: – UID: User ID – GUI: Group ID El usuario ROOT posee: – UID: 0 –
GUID: 0

Tareas Básicas del Administrador

• Definir usuarios y privilegios. • Manejar la seguridad del sistema. • Monitoreo y sintonía de


la actividad del sistema. • Instalación de software. • Manejar el espacio en disco. • Definir
cuotas de uso de recursos. • Iniciar, detener y recuperar el sistema. • Manejar colas de
impresión. • Instalar dispositivos: Terminales, impresoras, discos. • Agregar nuevos sistemas a
una red. • Construir libretos para automatizar las tareas. • Actuar como soporte de sistemas
para los otros usuarios.

SuperUsuario:

cuenta privilegiada del sistema con acceso permitido a todos los archivos y comandos. Muchas
de las tareas de administración requieren de la condición de superusuario,hace que las tareas
de administración sean fuertemente dependientes de las habilidades y fundamentalmente la
responsabilidad de este usuario privilegiado.

La mayoría de las herramientas de administración están construidas sobre libretos (scripts)


shell, es decir, son los mismos comandos que se ingresan en la línea de comandos para la
realización de las tareas. Los archivos utilizados en muchos casos no son directamente
editables y sólo deben ser manipulados desde una aplicación de administración.

Cambiar password
# passwd juanito Introduzca la nueva contraseña de UNIX: Vuelva a escribir la nueva
contraseña de UNIX: passwd: password updated successfully

Desconexión del Sistema

Existen varias maneras: Ingresar el comando exit o logout y presionar . Presionar . Al salir del
sistema, se podrá ver nuevamente la pantalla de login del sistema.

COMANDOS: Los comandos de UNIX caen dentro de las siguientes categorías:

-UTILITARIOS : Comandos que vienen con el sistema operativo. Son usados en muchas
combinaciones diferentes. cd, ls, rm, cp, ps, grep, top, sh, nano, etc.

-APLICACIONES: Otros comandos tal como software de terceros proveedores, software local,
programas propios y libretos en Shell. gdb, valgrind, htop, aptitude, vim, emac, tree, etc.

Ingreso de Comandos

FORMATO : $ nombre-del-comando [argumentos,[arg]*]

Comandos de Uso General

– date – echo – logname – tty – finger – cal – ls – pwd – mkdir – rmdir – cd – file

PIPES

Símbolo: |

Función: Transferir flujos de datos

-Redirección Símbolos: > >> < <

Función: Redirigir flujos de datos.

--Scripts (libretos)

serie de comandos de algún interprete de comandos en particular agrupados en un archivo


,ejecutados de forma secuencial.

¿Para qué sirven? Los scripts utilizados por los administradores de sistemas para automatizar los
procesos de gestión del equipo como creación de usuarios, copia de archivos, movimientos de
archivos, copias de seguridad, etc.

La primera línea de un script Linux, es llamada hashbang y le dice al interprete que está
ejecutando el script que este debe ser ejecutado por el interprete expresado en el hashbang
#!/bin/bash #!/bin/sh #!/usr/bin/Python

Strings
String1 = String2 Verdadero si las 2 cadenas son iguales

String1 != String2 Verdadero si las 2 cadenas son distintas

-z String Verdadero si el String esta vacio (su longitud es cero)

String Verdadero si la cadena no esta vacía (su longitud es mayor de cero)

-n String Verdadero si la longitud del String es mayor que cero

String1 == String2 Verdadero si los 2 Strings son iguales (solo en bash)

-e Archivo Verdadero si el archivo existe.

-d fichero Verdadero si el archivo existe y es un directorio.

-f Archivo Verdadero si el archivo existe y es un archivo regular.

-L Archivo Verdadero si el archivo existe y es un enlace simbólico.

-r Archivo Verdadero si el archivo existe y se puede leer.

-w Archivo Verdadero si el archivo existe y se puede escribir.

-x Archivo Verdadero si el archivo existe y es ejecutable.

Archivo1 -nt Archivo2 Verdadero si el Archivo1 mas actual (según la fecha de modificación) que el
Archivo2.

Archivo1 -ot Archivo2 Verdadero si el Archivo1 mas antiguo que el Archivo2.

Archivo1 -ef Archivo2 Verdadero si el Archivo1 y el Archivo2 tiene el mismo numero de device e
inodo.

Definición del Propietario del Archivo

El comando chown permite modificar la propiedad de un archivo. disponible sólo para el


superusuario. El comando chgrp permite modificar el grupo al que pertenece el archivo. chown
nuevo-usuario archivo(s) chown user:group archivo(s) chgrp nuevo-grupo archivo(s)

-Privilegios de Archivos

Los privilegios se definen para el dueño, el grupo y los otros, especificando argumentos en el
comando chmod.

-Privilegios de Archivos

En forma alternativa, los argumentos para chmod se pueden ingresar en forma octal, agrupando
de a tres bits los privilegios de lectura, escritura y ejecución para el usuario, grupo y otros.

Especificación del modo por defecto

Los archivos se crean con los privilegios definidos por defecto, se define con el comando umask,
señala en forma octal los privilegios omitidos por defecto, de ahí que en la estructura del
comando, los privilegios aparecen en forma inversa al comando chmod. Ejemplo umask 026
-Problemas de Acceso a Archivos

El administrador debe considerar la mayoría de las veces, los problemas de archivos están
relacionados con protección o propiedad de éstos. Resulta típico de esta situación la presencia de
problemas relacionadas con cosas que funcionan sin problemas a veces y otras, no funcionan. En
estos casos se recomienda ejecutar los programas con privilegio de superusuario. Si el programa
funciona, definitivamente se trata de un problema de privilegios.

-Estructura del Almacenamiento en Disco

El elemento básico de la representación de los archivos en disco es el inodo. El inodo es una


estructura de datos residente en disco que describe los atributos del archivo, incluida sus áreas de
datos en disco. Cada sistema de archivos define su propio conjunto de inodos, que se identifican
por un número único. Existe un inodo por cada archivo.

La información incluida en el inodo contiene: • Número del inodo • Nombre del usuario y su
grupo. • Tipo de archivo (regular, directorio, dispositivo o 0 si el inodo está libre). • Estructura de
privilegios del archivo • Fechas y horas de creación, última modificación y acceso. • Fecha y hora
de modificación del inodo. • Número de enlaces al archivo. • Tamaño del archivo en bytes. •
Direcciones de almacenamiento de los datos.

Tipos de archivos

En UNIX, todo es un archivo. El sistema operativo representa hasta las operaciones de


entrada/salida como archivos. Asociadas a sus funciones específicas, UNIX reconoce los siguientes
tipos de archivos: – Archivos normales – Directorios – Archivos especiales – Enlaces – Cauces
nominados – Sockets

--Archivos normales: Son los archivos que contienen datos, estos pueden corresponder a texto
ASCII o binario, archivos ejecutables, bibliotecas, etc.

--Directorios: Es un archivo binario que contiene una lista de pares inodo-nombre de archivo.
Eventualmente el directorio puede contener otro directorio (subdirectorio).

--Archivos especiales: Representan el medio para realizar acciones de entrada/salida,


asociándolos a dispositivos físicos, definidos en el directorio /dev/ de UNIX. Los archivos especiales
son de tipo carácter o bloque, dependiendo de la forma de realizar las operaciones de
entrada/salida. Los dispositivos de caracteres corresponden a impresoras y terminales. Los
dispositivos de bloque corresponden normalmente a dispositivos de tipo magnético (discos y
cintas) y dispositivos ópticos (cd, dvd, etc).

--Enlaces (links): mecanismo que permite que un archivo en lo que respecta a su área de datos sea
reconocida desde distintos directorios y con distintos nombres. De hecho, un enlace transforma el
árbol de directorios en un grafo dirigido.

--Cauces nominados: Son un medio de comunicación entre procesos en una disciplina FIFO. Un
proceso ingresa información al cauce y otro lo retira
--Sockets permite la posibilidad intercambiar información entre procesos, pero en este caso
permite diversidad de espacio, es decir, los procesos residen en máquinas distintas. Son la base del
sistema de comunicaciones en red de UNIX.

Dispositivos

corresponden a archivos especiales en UNIX, que se caracterizan por su modo de acceso. Los
dispositivos son de tipo carácter, como terminales e impresoras o de tipo bloque como discos y
cintas.

Directorio /proc/

En este directorio se encuentra toda la información relacionada con los procesos del kernel,
programas, comandos, etc, simplemente porque en Linux, todo es un archivo.

--Se presentan a continuación las operaciones básicas del sistema operativo con los archivos

Systems calls del sistema de archivos

Openfd=open(“archivo”,”modo”) Los modos están definidos en como: O_RDONLY Sólo lectura


O_WRONLY Sólo escritura O_RDWR Lectura y Escritura O_WRAP Escritura desde el final del
archivo (append) Open retorna el descriptor del archivo. fd es un entero

Tras cada apertura de archivo, el kernel otorga un espacio en el buffer cache para crear un área de
almacenamiento de datos. Al mismo tiempo carga en memoria el inodo del archivo abierto

El descriptor se asigna desde la tabla de archivos del kernel. El descriptor no es otra cosa que un
entero que apunta a la entrada correspondiente de la tabla. La tabla cuenta con los siguientes
campos: •Número de referencias (cantidad de procesos que comparten el mismo descriptor).
•Offset del archivo (byte donde se realizará la próxima lectura o escritura). •Modo de apertura.
•Puntero al inodo en memoria.

Dos o más procesos pueden compartir un descriptor sólo si lo heredan luego de un fork() o con el
system call dup. El inodo en memoria es similar al inodo del disco, al que se le agregan los
siguientes campos: – Número de referencias al archivo, es decir cuantos open se realizaron sobre
el mismo archivo. – Punto de mount del archivo. – Estado de bloqueo.

-close(fd)

Cierra el archivo identificado por el descriptor.

-creat(“nombre”,”modo”)

Crea un archivo, de tamaño inicial 0, con el nombre señalado y con los privilegios definidos por
modo. La variable modo debe ser un entero.

-read
System call de lectura de archivos o entrada general de datos. n = read(fd, buffer, cant) La
operación read retorna el número de bytes leídos o -1, en caso de error. Esta operación tiene éxito
si el archivo tiene permiso de lectura para el usuario efectivo. En caso contrario, retorna -1.

-write

System call destinado a escribir información en disco o salida de datos en general. n = write(fd,
buffer, cant) Normalmente n, debiera ser igual a cant. La operación tiene éxito si el usuario
efectivo tiene permiso de lectura sobre el archivo y si el archivo había sido abierto en modo de
escritura.

-lseek

El system call lseek tiene como propósito posicionar el archivo en un punto determinado. La
posición apunta virtualmente a un lugar en la superficie del disco, la que se hace efectiva sólo
después de transferir datos desde el buffer.

Procesos

Un proceso es un programa en ejecución, en su propio espacio de memoria virtual. Un comando


de UNIX puede estar compuesto de varios procesos trabajando en conjunto para el desarrollo de
una tarea específica.

*Tipos de Procesos

-Proceso Interactivo. Proceso iniciado y controlado por sesiones desde un terminal interactivo. Los
procesos interactivos pueden ejecutarse ya sea en primer o segundo plano. Los procesos en
primer plano, permanecen ligados al terminal, mediante comunicación directa. Un proceso en
trasfondo, libera el terminal para el usuario y su ejecución puede realizarse independiente de éste.

-Procesos batch Procesos ligados a una cola de tareas, desde donde son ejecutados en forma
secuencial.

-Daemons * Procesos servidores, que se inician normalmente en tiempo de subida del sistema y
permanecen en espera que un proceso cliente solicite sus servicios. Por ejemplo, un daemon de
red permanece inactivo en espera hasta que algún proceso requiera de acceso a red.

Atributos de un proceso

PID

– Número único de identificación de proceso.

PPID

– Número del proceso padre del presente.

nice

– Número que permite modificar la prioridad de ejecución de un proceso, disminuyéndola.

TTY
– Terminal que da origen al proceso.

UID y EUID

– UID es un identificador del usuario que origina el proceso. EUID es el identificador durante la
ejecución del proceso (UID efectivo). Bajo condiciones normales UID y EUID son iguales, sin
embargo un proceso puede cambiar su EUID con el objeto de adquirir privilegios especiales.

GID y EGID

-Función similar a UID, referida en este caso al grupo al que pertenece el usuario

*Ciclo de vida de un proceso

Un nuevo proceso se inicia como una réplica exacta de un proceso que realiza una llamada a
fork(). El nuevo proceso, hijo del anterior, tiene el mismo ambiente de ejecución que su proceso
padre, aunque tiene un PID propio. A continuación el espacio de direcciones del proceso se
sobreescribe con el código del programa que se quiere ejecutar. Esta acción se realiza con la
llamada al sistema exec. Por ejemplo, cuando un usuario ingresa un comando, Shell realiza un fork
y, a través de exec ordena la ejecución del comando solicitado.

Todos los procesos en UNIX son descendientes del proceso init. Cuando un proceso termina, envía
una señal al proceso padre.

Creación de Procesos

La única forma para la creación de un nuevo proceso en UNIX es a través del system call fork. El
proceso que invoca a fork se conoce como proceso padre y el proceso creado por el fork pasa a ser
el proceso hijo. El proceso hijo es una copia del proceso padre, heredando su código, su área de
datos y su área de stack. Es decir, al inicio, el proceso hijo comparte todas las variables del proceso
padre. A partir de la creación, el comportamiento de las áreas de datos y de stack son
independientes, sin embargo seguirán compartiendo el área de código, es decir padre e hijo
ejecutarán el mismo programa.

fork retorna al proceso que lo invoca el PID del hijo. En el código duplicado, al proceso hijo, le
retorna 0.

Los procesos padre e hijo creados de esta manera, se ejecutan en forma concurrente, compitiendo
para lograr entrar al estado de ejecución en el procesador

Habilitación de Programas

Es ciertamente discutible la utilidad de fork al conservar el código original. Para la ejecución de


nuevos programas, UNIX utiliza el system call exec Sintaxis : exec(comando, parámetros) Exec
invoca a un archivo ejecutable y modifica el área de código del proceso que lo invoca por la del
programa que está siendo invocado, de esta manera el proceso sin cambiar su PID, cambia de
programa

Espera por Procesos

Un proceso puede esperar por el término de un proceso hijo ejecutando el system call wait
wait(pid)

Si el proceso invocado en el argumento pid está activo, el proceso que lo invoca se va al estado de
dormir.

Comunicación entre Procesos Concurrentes

Los modelos de comunicación entre procesos en UNIX han servido de base para el intercambio de
datos entre procesos de la misma máquina como de procesos en máquinas separadas, unidas por
una red de computadores en ambientes de procesamiento distribuido.

Pipes

Básicamente, un PIPE es una forma de establecer un flujo de datos unidireccional entre dos
procesos, con lectura destructiva, en un esquema productorconsumidor., es creado mediante la
llamada de sistema “pipe

La forma típica de implementar la comunicación entre dos procesos es: Primero, un proceso crea
un PIPE y luego ejecuta un "fork” para crear una copia de si mismo. Luego, el proceso "padre"
cierra la parte de lectura de su PIPE y el proceso "hijo" cierra la parte de escritura, proveyendo así
un flujo en un sólo sentido entre los dos procesos.

Para lograr una comunicación bidireccional, se hace necesario contar con dos PIPES. Los pasos
necesarios para esto son: El proceso crea el pipe 1 y el pipe2 Luego llama la función fork para crear
una copia de si mismo El "padre" cierra la vía de lectura y el "hijo" la de escritura del pipe 1 El
"padre" cierra la vía de escritura y el "hijo" la de lectura del pipe 2

La principal desventaja de este método es que sólo puede ser usado entre procesos que tienen un
proceso padre en común. Esto debido a que un PIPE es pasado de un proceso a otro por la función
de sistema "fork" y por el hecho de que todos los archivos abiertos son compartidos por "padre" e
"hijos" después del "fork".

Señales

Una señal es una notificación a un proceso de la ocurrencia de un evento, para que este tome las
acciones correspondientes si controla la señal. Algunas señales son activadas por interrupciones
de software y son comúnmente asincrónicas. Por esta razón los procesos no saben con exactitud
cuando puede ocurrir una señal. Las señales pueden ser enviadas de un proceso a otro proceso o a
sí mismo o, por el Kernel a un proceso.

Para poder enviar una señal se deben cumplir las siguientes condiciones: 1.Un proceso que llame
al system call kill para enviar una señal de término a un proceso o a sí mismo. No siempre la señal
de término termina con el proceso, además existen otras señales que no terminan con el proceso
sino que informan a este de alguna condición que puede manejar.

Un proceso no siempre puede enviar una señal a otro proceso. Para poder enviar una señal, el
proceso que envía con el que reciben la señal deben tener el mismo effective user ID, a menos que
el proceso tenga el effective user ID del super-usuario que en este caso le puede enviar a
cualquiera.
Hay diferentes tipos de system call kill dependiendo del tipo de argumento: • Si el argumento pid
es cero, la señal es enviada a todos los procesos del mismo grupo. • Si el argumento pid es -1 y el
effective UID del proceso invocador, es super usuario, se envía la señal a todos los procesos, de
otro modo, envía la señal a todos los procesos cuyo real UID es igual al effective UID del proceso
invocador. • Si el argumento pid es menor a -1 se envía la señal a aquellos procesos cuyo
identificador de grupo es igual al valor absoluto de pid. • Si el argumento sig es cero, se realiza un
chequeo de validación del argumento pid, sin llegar a enviar la señal.

El comando kill también es utilizado para enviar señales. Este comando se ejecuta desde la línea
de comando y hace uso del system call kill por lo que todos las opciones de argumento vistas
anteriormente son válidas. Ciertos caracteres de terminal generan señales. Como por ejemplo
muchos terminales interactivos tienen asociado el carácter de interrupción y de salida. El carácter
de interrupción, comúnmente Crt-C o Delete terminan con la ejecución de un proceso generando
la señal SIGINT. El carácter de salida típicamente Control-backslash termina el proceso que se esta
ejecutando y genera una imagen core del proceso. Este carácter genera la señal SIGQUIT.

Ciertas condiciones de hardware generan señales. – Por ejemplo error de aritmética de punto
flotante genera la señal SIGFPE. – Referenciar una dirección fuera de rango generan la señal
SIGSEGV. Las condiciones específicas de hardware y el tipo de señal generada pueden diferir de
una implementación Unix a otra. Este tipo de señales son comúnmente enviadas desde el Kernel a
un proceso.

Ciertas condiciones de software que se notifican por Kernel generan señales. Por ejemplo la señal
SIGURG es generada cuando el arribo de datos llega fuera del ancho de banda para un socket. •Un
proceso puede tener una función que es llamada cada vez que una señal ocurre. Esta función
utilizada para manejar la señal es producto de que el proceso desea que se maneje cierta
condición. • Un proceso puede ignorar una señal o todas las señales, excepto la SIGKILL que es
enviada por el administrador con privilegio de terminar cualquier proceso.

Un proceso cuando desea manejar la señal hace uso del system call SIGNAL

Este sentencia indica que signal devuelve un puntero a otra función que retorna un entero. El
argumento func especifíca la dirección de una función que no retorna nada (void). hay dos valores
especiales para el argumento func: SIG_DFL especifica que la señal será manejada por defecto y
SIG_ING para especificar que la señal será ignorada. El system call SIGNAL retorna el valor previo
de func para la señal especificada.

Cuando una función maneja una señal , el número entero de la señal es pasado como primer
argumento a la función. Una sola función puede manejar múltiples señales que se determinan su
ocurrencia en tiempo de ejecución. Algunas señales generadas por hardware pueden pasar
argumentos adicionales a la función. Si la señal maneja el retorno de una función, el proceso que
recibe la señal continua desde donde fue interrumpida.
Mensajes

Los mensajes permiten establecer un medio público de comunicaciones, al interior del sistema.
Existen 4 system calls relacionadas con mensajes :

• msgget retorna y posiblemente crea un descriptor de mensaje que apunta a una cola de
mensajes que responden a una misma clave. El descriptor queda disponible para los otros system
calls. • msgctl tiene opciones para devolver y definir parámetros asociados a la cola de mensajes
identificada por la clave. • msgsnd envía un mensaje a la cola. • msgrcv recibe un mensaje de la
cola de mensajes.

Creación o Apertura de Cola de Mensajes. msgqid=msgget(Clave, flag) El system call msgget


retorna un descriptor de la cola de mensajes. Clave y flag tienen la semántica de los mecanismos
de comunicación entre procesos. Como elementos adicionales a los de IPC, el descriptor de
mensajes contiene :

• Puntero al primer y último mensaje de la cola. • El número de mensajes y el total de bytes de la


lista enlazada. • El PID del último proceso en enviar y el último en recibir un mensaje a esa cola. •
Marcas de tiempo de los eventos.

Envío de Mensajes Para enviar un mensaje, los procesos deben ejecutar : msgsnd(msgqid, msg,
count, flag)

msgqid es el descriptor retornado después de un get. msg es el puntero a una estructura que es
del tipo msgform (descrita en msg.h) que es un struct con un campo entero tipo y un campo de
caracteres con el texto del mensaje. Count da el tamaño del arreglo de datos y el flag define cual
debe ser la acción a seguir si el buffer de mensajes para esa cola está lleno. El kernel verifica que el
proceso tenga permiso de escritura para el descriptor señalado.

Recepción de Mensajes Para recibir un mensaje, el proceso debe ejecutar msgrcv(id, msg,
maxcuenta, tipo, flag) ;

Tipo identifica el tipo de mensaje esperado. El tipo es un entero definido por el usuario, incluido
en el struct msg. El parámetro flag identifica la acción a realizar por el kernel. msgrcv retorna los
bytes efectivamente recibidos. El kernel verifica que el proceso tenga permiso de lectura sobre la
cola de mensaje. Si el mensaje solicitado es de tipo 0, el kernel encuentra el primer mensaje de la
cola solicitada, transfiere los datos y actualiza la cola. Si hay procesos esperando por espacio para
enviar mensajes, los despierta.

Un proceso puede recibir un mensaje de un tipo determinado usando ese parámetro en forma
apropiada. Si es un número positivo, el kernel retorna el primer mensaje del tipo solicitado. Si es
un número negativo, el kernel encuentra el menor tipo de mensaje, menor que el valor absoluto
del tipo solicitado y retorna el primero de este tipo. En cualquier caso, si el tipo solicitado no
existe, el proceso se pone a dormir, amenos que haya solicitado IPC_NOWAIT en el flag, en cuyo
caso retorna con error.
Los procesos pueden intercambiar datos directamente compartiendo partes de su espacio de
memoria virtual. De tal forma que el traspaso de información se realiza simplemente leyendo o
escribiendo en el espacio de memoria compartida.

Los systen calls para manipular el espacio de direcciones compartidos son : shmget, para crear una
nueva región o retorna un índice a una región existente. El system call shmat incorpora una región
compartida al área de memoria virtual de un proceso. shmdt aparta la región de la memoria
virtual del proceso.

Das könnte Ihnen auch gefallen