Академический Документы
Профессиональный Документы
Культура Документы
Operativos
Curso 2010-2011
ndice general
i
ii NDICE GENERAL
Captulo 1
1
2 CAPTULO 1. EVALUACIN Y CALENDARIO DE PRCTICAS
2.1. Prctica 1
2.1.1. Objetivos
Entender el funcionamiento de las llamadas al sistema relacionadas con la creacin
de procesos (fork, execl, wait). Se recomienda leer la parte del manual relativa a
estas llamadas y realizar los programas de ejemplo que se incluyen (ver el captulo 3
del manual). Se recomienda tambin leer el manual on-line de dichas llamadas al
sistema (man fork, man execl, man -a wait (o man 2 wait)).
2.1.2. Enunciado
(a) Implementar el grafo de precedencia de la figura 2.1 utilizando las llamadas al siste-
ma fork y wait (no utilizar waitpid). El grupo de sentencias a ejecutar en cada nodo
del grafo se simularn mediante la sentencia printf(cadena), donde cadena es la
cadena de caracteres que contiene cada nodo de la figura. La frase deber aparecer
en una nica lnea.
3
4 CAPTULO 2. ENUNCIADO DE LAS PRCTICAS
Hola
y usted. Hasta
malos luego
Lucas
2.2. Prctica 2
2.2.1. Objetivos
Utilizar los semforos como una herramienta de sincronizacin para acceder en ex-
clusin mutua a un recurso compartido. Para ello, se proporciona una librera que
permite la utilizacin de semforos de una manera sencilla y similar a la explicada
en teora (ver detalladamente el captulo 4 del manual).
2.2.2. Enunciado
Implementar, mediante la utilizacin de semforos, el problema clsico de los lectores-
escritores. Se utilizar un fichero (llamado papel.txt) con una nica palabra de texto
(mximo 20 caracteres) seguida de un carcter de final de lnea. En la solucin se debe
dar soporte a la existencia de varios procesos escritores y varios procesos lectores, teniendo
en cuenta que:
Los procesos escritores son prioritarios con respecto a los procesos lectores (cuando
el papel queda libre, siempre se da paso primero a un proceso escritor antes que a
un proceso lector).
Proceso escritor
Presenta en pantalla dos opciones:
1. Escribir
2. Finalizar
6 CAPTULO 2. ENUNCIADO DE LAS PRCTICAS
Proceso lector
Presenta en pantalla dos opciones:
1. Leer
2. Finalizar
2.3. Prctica 3
2.3.1. Objetivos
Utilizar una herramienta de sincronizacin de alto nivel como son los monitores
condicionales. Para ello, se proporciona una librera que permite la utilizacin de
monitores de una manera sencilla y similar a la explicada en teora (ver detallada-
mente el captulo 5 del manual). Adems, en el manual se incluyen dos monitores
de ejemplo cuya implementacin y prueba se recomienda antes de abordar esta
prctica.
Entender las diferencias existentes entre los dos tipos de monitores vistos en teora,
en funcin del proceso elegido para continuar la ejecucin cuando se despierta un
proceso suspendido en una variable condition.
2.3.2. Enunciado
En este problema se deber simular mediante la utilizacin de un monitor BUFFER
la gestin de un buffer de N posiciones con las siguientes caractersticas:
Para que un proceso consumidor pueda averiguar el tipo de los elementos que hay en
el buffer es necesario que dichos elementos sean extrados. Si un proceso consumidor
extrae un elemento del buffer y ste no es de su tipo debe introducir de nuevo dicho
elemento en el buffer e intentarlo con el siguiente elemento. Si no le sirve ningn
elemento deber esperar hasta que pueda consumir el elemento deseado.
Los procesos consumidores acceden al buffer en orden FIFO. Sin embargo, un proceso
consumidor de tipo t1 (t2 ) puede ser adelantado por procesos consumidores de tipo
t2 (t1 ) cuando en el buffer no hay elementos del tipo t1 (t2 ).
Ejemplos de ejecucin:
> productor 1 4
He producido 4 elementos.
Esperando a poder introducir los elementos en el buffer...
Elementos introducidos. Hay 12 elementos en total.
> consumidor 2
Esperando a retirar un elemento de tipo 2...
Elemento de tipo 2 retirado y consumido. Quedan 11 elementos en total.
Captulo 3
Si se realiza espera activa, cada vez que el sistema operativo le asigne la CPU a
dicho proceso, ste mirar el teclado a ver si se ha pulsado una tecla, y esto lo repetir
hasta que dicho evento se produzca. Durante todo ese tiempo, el proceso est consumiendo
innecesariamente CPU. Para evitar la espera activa, los procesos se suspenden a espera
de eventos, de manera que dichos procesos no entren en el reparto de la CPU.
9
10CAPTULO 3. UTILIZACIN Y GESTIN DE PROCESOS EN EL LABORATORIO
Ejecutando (O): El proceso ocupa actualmente la CPU: Slo uno de los procesos
preparados se estar ejecutando en cada momento (monoprocesador).
Suspendidos (S): A dichos procesos les falta, adems de la CPU, algn recurso
para poder ejecutarse, entendindose por recurso un dispositivo, un dato, etc. Los
procesos suspendidos estn esperando a que ocurra algn evento para poder acceder
al recurso que necesitan. Estos procesos no entran en el reparto de la CPU, evitando
as la espera activa. Cuando se produce el evento esperado, dicho proceso pasar a
estar preparado.
Parados (T): Son procesos que tampoco entran en el reparto de la CPU, pero
que no estn suspendidos a la espera de eventos, sino que han sido parados en su
ejecucin. Para salir de dicho estado hay que mandarles continuar, volviendo as a
estar preparados.
Zombies (Z): Cuando un proceso finaliza, se lo comunica a su proceso padre (el
proceso que lo cre). Si dicho proceso no captura el aviso de su proceso hijo, ste
queda en un estado zombies. En dicho estado, el proceso no consume CPU pero
sigue ocupando recursos en la tabla de procesos (donde se guarda informacin de
cada uno de los procesos existentes en el sistema). Un proceso permanece zombi
hasta que su proceso padre captura su aviso.
PARADO
COLA DE PROCESOS
PREPARADOS EJECUTANDO ZOMBI
SUSPENDIDO
RSS: Kilobytes del programa en memoria. (El resto estar en disco (swapp)).
Los procesos pueden tener una estructura jerrquica, de manera que un proceso (pro-
ceso padre) puede crear un nuevo proceso (proceso hijo) y as sucesivamente. Para la
realizacin de aplicaciones con varios procesos, el sistema operativo unix proporciona la
llamada al sistema1 fork().
SYNOPSIS
#include <sys/types.h>
#include <unistd.h>
int fork(void);
DESCRIPCION
fork() crea un nuevo proceso exactamente igual (mismo cdigo) al proceso que invoca
la funcin. Ambos procesos continan su ejecucin tras la llamada al fork().
1
Funciones que se pueden invocar desde un programa en C, y que realizan una llamada al sistema
operativo.
12CAPTULO 3. UTILIZACIN Y GESTIN DE PROCESOS EN EL LABORATORIO
VALORES RETORNADOS
En caso de error retorna -1 y no se crea el proceso hijo. En otro caso, retorna valores
diferentes al proceso padre (el que lo invoc) y al proceso hijo (el proceso creado):
Proceso Padre: Retorna el PID del proceso hijo.
Proceso Hijo: Retorna 0.
EJEMPLO
En el ejemplo que se muestra a continuacin, se crea un proceso hijo que imprime en
pantalla el PID de su proceso padre, mientras que el proceso padre imprime en pantalla
su propio PID y el del proceso hijo que ha creado. Para ello, se utilizan las llamadas al
sistema getpid() y getppid(). El proceso padre, antes de finalizar se suspende hasta que el
hijo muere, para evitar que ste se quede zombi. Para ello, utiliza la llamada al sistema
wait(), que recibe en la variable status el estado en que el proceso hijo finaliz.
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
int pid = 0, status = 0, pid_hijo_finalizado = 0;
SYNOPSIS
#include <unistd.h>
DESCRIPCION
execl() sustituye la imagen del proceso actual por la del proceso cuyo cdigo se indica
como parmetro. Comprobar que las sentencias posteriores a un execl() no se ejecutan si
dicha funcin ha tenido xito (ya que se ha sustituido la imagen del proceso). Es decir,
despus de una llamada a execl() slo tiene sentido comprobar si se ha producido algn
error en la llamada.
PARAMETROS
VALORES RETORNADOS
EJEMPLO
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
14CAPTULO 3. UTILIZACIN Y GESTIN DE PROCESOS EN EL LABORATORIO
#include <stdlib.h>
int main() {
int pid = 0, status = 0;
#include <stdio.h>
3.6. Compilacin
gcc ejemplo.c
Sin embargo, a veces interesa compilar por separado los distintos mdulos y luego
juntar todos los objetos en un ejecutable. El montaje se evita con la opcin -c, que genera
los ficheros objeto con extensin .o:
gcc -c ejemplo_bis.c
gcc -c lib_1.c
gcc -c lib_2.c
gcc lib_1.o lib_2.o ejemplo_bis.o -o ejemplo_bis
En el caso de que haya que montar bibliotecas ubicadas en lugares normalizados, pero
no incluidas automticamente por el montador, hay que montarlas con la opcin -l. Por
ejemplo, una compilacin y montaje utilizando la librera matemtica se realizara del
siguiente modo:
Finalmente, conviene compilar todos los programas con la opcin -Wall para que nos
muestre toda la informacin disponible warnings de la compilacin:
Utilizacin de Semforos en el
Laboratorio
#include <cipcms.h>
int main() {
semaforo_t s;
17
18 CAPTULO 4. UTILIZACIN DE SEMFOROS EN EL LABORATORIO
.........................
sem_destruir(s);
return(0);
}
#include <cipcms.h>
int main() {
semaforo_t s;
de cada uno de estos comandos. A partir del comando ipcs se obtienen los identificado-
res de los ipcs activos, y con el comando ipcrm [sem id] [shm id] [msg id] se eliminan los
ipcs correspondientes a semforos (sem), memoria compartida (shm) y colas de mensajes
(msg).
Finalmente, se recomienda comprobar todos los posibles errores producidos en las lla-
madas a las funciones de manejo de semforos. En la mayora de los casos, stas retornan
un valor negativo en caso de error. (Ver fichero /opt/ipcms/include/cipcms.h).
3. Si quedase algn proceso gestor, debe ser eliminado con el comando Kill pid.
>ipcs
Utilizacin de monitores en el
laboratorio
tipo: 1
condicionales: lleno, vacio
publicos: procedimiento_1, procedimiento_3, procedimiento_4, procedim
iento_5,
inicio: inicio
fin: fin
21
22 CAPTULO 5. UTILIZACIN DE MONITORES EN EL LABORATORIO
#include <stdio.h>
void *procedimiento_1(void *)
{
}
int procedimiento_2() /* no es ENTRY */
{
}
void *procedimiento_3(void *)
{
}
void *procedimiento_4(void *)
{
}
void *procedimiento_5(void *)
{
}
void inicio()
{
}
void fin()
{
}
tipo: 1
condicionales: vacio, lleno
publicos: producir, consumir
inicio: iniciar
fin: finalizar
#include <stdio.h>
#include <stdlib.h>
#define N 4
void iniciar(void) {
ptr_prod = 0;
ptr_cons = 0;
num_datos = 0;
buffer[0]=0;
buffer[1]=0;
buffer[2]=0;
buffer[3]=0;
}
if (num_datos == 0) condm_wait(vacio);
mi_dato = buffer[ptr_cons];
ptr_cons = (ptr_cons + 1) % N;
num_datos--;
condm_signal(lleno);
return((void *) &mi_dato);
}
void finalizar(void)
{
return;
}
Para utilizar las variables de tipo condition declaradas en la cabecera existen las
funciones:
3. Compile dicho programa con la librera lipcms y la librera del sistema lpthread:
#include <cipcms.h>
#include <stdio.h>
int main () {
#include <stdio.h>
#include <cipcms.h>
int main() {
if (mon_destruir(mon_capturar(1234)) < 0)
printf("error al destruir\n");
else printf("monitor destruido\n");
return(0);
}
25
6. Para utilizar dicho monitor desde un programa en C, declarar una variable de tipo
monitor_t, capturar su descriptor a partir de la clave con la que se cre, e invocar
a los procedimientos del monitor con la funcin.
void * monitor(monitor_t, char * nb_entry, size_t tam_entrada, size_t tam_salida, void * par_entrada)
***********
productor.c
***********
#include <stdio.h>
#include <stdlib.h>
#include <cipcms.h>
int main() {
monitor_t m;
int dato=3;
if ((m = mon_capturar(1234))<0)
{
printf("Error al capturar el monitor\n");
exit(-1);
}
printf("Producir elemento:");
fscanf(stdin,"%d", &dato);
monitor(m, "producir", sizeof(int), 0, (void *)&dato);
return(0);
}
************
consumidor.c
************
#include <stdio.h>
#include <stdlib.h>
#include <cipcms.h>
int main() {
monitor_t m;
int *dato;
if ((m = mon_capturar(1234))<0)
{
printf("Error al capturar el monitor\n");
exit(-1);
26 CAPTULO 5. UTILIZACIN DE MONITORES EN EL LABORATORIO
}
dato = (int *) (monitor(m,"consumir", 0, sizeof(int), NULL));
printf("Consumido %d\n",*dato);
return(0);
}
Estos programa se compilan con la librera ipcms, al igual que los programas que
utilizan semforos y necesitan la ejecucin previa del proceso gestoripcms.