Guia Laboratorio 4 SO

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 11

1

REPÚBLICA BOLIVARIANA DE VENEZUELA


MINISTERIO DEL PODER POPULAR PARA LA DEFENSA
UNIVERSIDAD NACIONAL EXPERIMENTAL POLITÉCNICA
DE LA FUERZA ARMADA
NÚCLEO LARA
DIVISION ACADEMICA
COORDINACION CARRERA INGENIERIA DE SISTEMAS

LABORATORIO DE SISTEMAS OPERATIVOS

GUIA No. 4
CONCURRENCIA Y SINCRONIZACION ENTRE PROCESOS

BARQUISIMETO, SEPTIEMBRE 2015


LABORATORIO DE SO
AUTOR: ING. ANA LORENA FREITEZ
2

REPÚBLICA BOLIVARIANA DE VENEZUELA


MINISTERIO DEL PODER POPULAR PARA LA DEFENSA
UNIVERSIDAD NACIONAL EXPERIMENTAL POLITÉCNICA
DE LA FUERZA ARMADA
NÚCLEO LARA
DIVISION ACADEMICA
COORDINACION CARRERA INGENIERIA DE SISTEMAS

INTRODUCCIÓN

El laboratorio significa aprendizaje mediante la experiencia directa del estudiante con los elementos que
constituyen el mismo y la interacción sobre estos elementos, para obtener resultados, adquirir destrezas e
interpretación en su manejo (por ejemplo aprender a manejar un sistema operativo de licencia libre).

Es importante que el estudiante tenga conocimiento previo de las actividades a desarrollar en el


laboratorio. Así como también de una guía de procedimientos y materiales a utilizar, y así evitar
incertidumbres que puedan obstaculizar el desarrollo normal de la enseñanza en el laboratorio.

Este trabajo sirve de guía para las prácticas en el “Lab. De Computación” perteneciente a la
Coordinación de la Carrera Ingeniería de Sistemas de la Universidad Nacional Experimental Politécnica de
la Fuerza Armada Nacional.

NORMAS PARA EL USO DE LABORATORIO DE COMPUTACIÓN

El Docente y el Auxiliar:

 Responsable del uso adecuado de los equipos e instrumentos asignados.


 Informar sobre daños a equipos e instrumentos del laboratorio.

El Estudiante:

 Responsable del orden y la limpieza del laboratorio.


 No ingerir alimentos. No fumar.
 No llevar camisa suelta, cadenas, anillos, reloj de pulsera, esclavas ni bolígrafos metálicos.
 No realizar el encendido de equipos, salvo indicación contraria del docente.
 Lo último en conectar es la fuente de alimentación.
 Al terminar la práctica, informar al docente o auxiliar.

LABORATORIO DE SO
AUTOR: ING. ANA LORENA FREITEZ
3

PRACTICA No.4

PRE - LABORATORIO
1. ACTIVIDAD DE PRE PRACTICA

a) Indique dos diferencias entre Concurrencia y Procesos Concurrentes?


b) Realice un cuadro con los mecanismos de Comunicación y Sincronización. Indique cuales
mecanismos son a la vez de comunicación y sincronización.
c) Explique los dos tipos de comunicación presente entre los procesos concurrentes.
d) Realice una comparación entre las propiedades de los dos tipos de comunicaciones entre los
procesos.
e) Defina: Qué es un archivo? Qué es paso de mensajes? Que son Tuberías? Qué son variables en
memoria compartida?
f) Investigue que son: Lenguajes concurrentes, Mutex y variables condicionales.
g) Qué lenguajes de programación manejan concurrencia?
h) Qué lenguaje maneja las palabras reservadas COBEGIN Y COEND para indicar concurrencia?

2. OBJETIVO:
a) Explorar el uso de hilos como herramienta básica para aprovechar la concurrencia en los
procesos.
b) Identificar el uso de la técnica de memoria compartida como un mecanismo de comunicación
efectivo tanto entre hilos como entre procesos.

3. MARCO TEÓRICO
HILOS Y COMUNICACIÓN (MEMORIA COMPARTIDA)

3.1 Hilos
Los hilos son el medio por el cual un proceso puede implementar concurrencia. Éstos permiten que
un proceso posea varios caminos de ejecución y a su vez compartan cierta región de memoria de manera
directa. Por otro lado, en un sistema con KLT (Kernel Level Thread) y con multiprocesamiento o
multithreading (por ejemplo, el hyperthreading de Intel), los hilos aprovecharían al máximo los recursos de
hardware disponibles y aumentarían considerablemente el desempeño de una aplicación.

Generalmente, cada sistema operativo tiene una forma propia de enfrentar el desafío de la
implementación de los hilos. A continuación se presenta un resumen de dos lecturas tomadas del libro de
Silberschatz [1] relacionadas con la implementación de los hilos en Windows XP y en Linux.

a) Hilos en Windows XP
El API Win32 es el API primario para la familia de sistemas operativos Windows. En Windows XP
las aplicaciones corren como un proceso separado y cada proceso puede contener uno o más hilos. Windows
XP usa un mapeo uno a uno, donde cada hilo a nivel de usuario se mapea a un hilo asociado al kernel. Sin
embargo, Windows XP también provee soporte para una librería de hilos, la cual provee la funcionalidad del
modelo mucho a muchos. Al usar la librería de hilos cualquier hilo perteneciente a un proceso puede acceder
al espacio de direcciones del proceso.
Los componentes generales de un hilo en Windows XP son:
 Un thread ID, identificador único para cada hilo.
LABORATORIO DE SO
AUTOR: ING. ANA LORENA FREITEZ
4

 Un conjunto de registros que representa el estado del procesador.


 Una pila de usuario, empleada cuando el hilo está corriendo en modo usuario, y una pila de kernel
empleada cuando el hilo está corriendo en modo kernel.
 Un área de almacenamiento privado empleada por varias librerías en tiempo de ejecución y librerías
de enlaces dinámicos (DLL).
El conjunto de registros, pila y el área de almacenamiento privado es conocido como el contexto del
hilo. La estructura de datos primaria de un hilo incluye:
 ETHREAD Executive thread block
 KTHREAD Kernel thread block
 TEB Thread environment block
Los componentes claves del ETHREAD incluyen un apuntador al proceso al cual pertenece el hilo y
la dirección de la rutina en la cual el hilo inicia el control. El ETHREAD contiene un apuntador al
correspondiente KTHREAD.
KTHREAD incluye información de planificación y sincronización para el hilo. Además aquí se
incluye la pila del kernel y un apuntador al TEB. El ETHREAD y el KTHREAD existen completamente en
el espacio del kernel, esto significa que solo el kernel puede acceder a ellos. El TEB es una estructura de
datos en el espacio de usuario que es accedida cuando el hilo está corriendo en modo usuario. Entre otros
campos el TEB contiene el Thread ID, la pila de modo usuario, y un arreglo para hilos de datos específicos.
La estructura de datos de los hilos en Windows se muestra a continuación.

Figura 1. Hilos en Windows XP.


b) Hilos en Linux
Linux proporciona en el llamado al sistema fork() con la funcionalidad tradicional de duplicar un
proceso. Linux también proporciona la funcionalidad de crear hilos usando el llamado al sistema clone(). Sin
embargo, Linux no distingue entre procesos e hilos. De hecho, Linux generalmente usa el término de tarea
más que proceso o hilo cuando se refiere a un flujo de control dentro de un programa. Cuando se invoca el
llamado al sistema clone(), éste es pasado con un conjunto de banderas u opciones, las cuales determinan la
cantidad de intercambio que se llevará a cabo entre la tarea padre y su nuevo hijo. Algunas de estas banderas
se muestran a continuación:

LABORATORIO DE SO
AUTOR: ING. ANA LORENA FREITEZ
5

Figura 2. Hilos en Linux.

Por ejemplo, si clone es llamado con las banderas CLONE_FS, CLONE_VM, CLONE_SIGHAND,
y CLONE_FILES, las tareas padre e hija, compartirán la misma información del sistema de archivos (como
el actual directorio de trabajo), el mismo espacio de memoria, los mismos manejadores de señales y el
mismo conjunto de archivos abiertos. Usar el llamado al sistema clone() de este modo es equivalente a crear
un hilo como se ha descrito de manera teórica, ya que la tarea padre comparte la mayoría de sus recursos con
su tarea hija. Sin embargo, si ninguna de esas banderas es fijada cuando se hace el llamado a clone(), ningún
intercambio es realizado y la funcionalidad será similar a la proporcionada por la llamada al sistema fork().

El nivel de variación de intercambio es posible debido a la manera como una tarea es representada en
el kernel de Linux. Solo existe una estructura de datos en el kernel para cada tarea en el sistema
(específicamente, struct task_struct). Esta estructura de datos en lugar de almacenar datos para la tarea,
contiene apuntadores a otras estructuras de datos donde la información está almacenada, por ejemplo
estructuras de datos que representan la lista de archivos abiertos, información del manejo de señales y la
memoria virtual. Cuando fork() es invocado, una nueva tarea es creada y junto con ella una copia de todas
las estructuras de datos del proceso padre. Una nueva tarea se crea también con el llamada al sistema
clone(), la diferencia radica es que en lugar de una copia de todas las estructuras de datos, la nueva tarea
apunta a las estructuras de datos de la tarea padre, dependiendo del conjunto de opciones pasadas en el
llamado a clone().

b.1) Librerías para la implementación de Hilos


Tras la revisión anterior es claro verificar que cada sistema operativo tiene, generalmente, una forma
diferente de implementar los hilos a bajo nivel, sin embargo cuando estamos interactuando con un Lenguaje
de Alto Nivel (LAN), éstos poseen o usan librerías que permiten abstraer aún más el problema. De acuerdo a
nuestro programa basado en herramientas libres y el sistema Linux, nosotros en la presente guía de
laboratorio trabajaremos la implementación de hilos a través del lenguaje de programación C, la librería
pthread y bajo el sistema operativo Linux. Recomendamos que el estudiante explore otros lenguajes,
librerías y SO y se sugiere el siguiente material.

3.2 Comunicación entre Hilos/Procesos a través de Memoria compartida

En el desarrollo de aplicaciones cooperativas usando técnicas de multiprogramación y multihilo, se


hace necesario poseer herramientas con las cuales se facilite una comunicación efectiva entre los diferentes
entes de procesamiento existentes en una máquina (hilos o procesos). El sistema operativo posee un diverso
conjunto de opciones de comunicación que incluye las tuberías, los sockets, el paso de mensajes y la
memoria compartida. Ésta última técnica de comunicación a través de memoria compartida es una de las
más usadas actualmente debido a su facilidad en la implementación y la simpleza en su funcionamiento.
Cuando estamos hablando estrictamente de hilos, ellos por definición comparten una serie de recursos del
proceso, entre los que se encuentran los espacios de memoria Heap y Global que actúan como una región de
memoria compartida que permite la comunicación ente hilos.

LABORATORIO DE SO
AUTOR: ING. ANA LORENA FREITEZ
6

Para los proceso la situación cambia, ya que éstos no poseen a priori, ningún espacio de memoria
compartido, por lo que se hace necesaria la intervención del sistema operativo para asignar un espacio de
memoria que sea visible por los procesos que se desean comunicar.

En ambos casos tras la definición de un espacio de memoria se hace necesario sincronizar el acceso a
la misma, pues se puede presentar una condición de carrera que altera el buen funcionamiento de la
aplicación (para profundizar en este concepto remítase al material de clase o al capítulo 2 del libro de
Tanenbaum [2]).

3.3 Semáforos
En la clase de sistemas operativos se abordó el uso de semáforos como mecanismo de sincronización
entre procesos e hilos. El concepto de semáforo se aplica muy similar tanto en procesos como en hilos
dentro de un S.O.

a) Funcionamiento de los semáforos


Dos o más procesos pueden cooperar por medio de simples señales, de forma que se pueda obligar a
detenerse a un proceso en una posición determinada hasta que reciba una señal específica. Cualquier
requisito complicado de coordinación puede satisfacerse por medio de la estructura de señales adecuada.
Para la señalización, se usan variables especiales llamadas semáforos. Para transmitir una señal por el
semáforo, los procesos ejecutan la primitiva signal(s). Para recibir una señal del semáforo, los procesos
ejecutan la primitiva wait(s); si la señal correspondiente aún no se ha transmitido, el proceso es suspendido
hasta que tenga lugar la transmisión. Para lograr el efecto deseado, se pueden contemplar los semáforos
como variables que tienen un valor entero sobre el que se definen las tres operaciones siguientes:
1. Un semáforo debe inicializarse con un valor no negativo.
2. La operación wait decrementa el valor del semáforo. Si el valor del semáforo se hace negativo, el
proceso que ejecuta el wait se bloquea.
3. La operación signal incrementa el valor del semáforo. Si el valor no es positivo, se desbloquea a un
proceso bloqueado por una posición wait.

Las primitivas wait y signal se suponen atómicas, es decir, no pueden ser interrumpidas y cada rutina
puede considerarse como un paso indivisible. Una versión más limitada es el semáforo binario, que sólo
puede tomar los valores 0 y 1. En principio los semáforos binarios son más sencillos de implementar y
tienen la misma potencia de expresión que los semáforos generales. Tanto en los semáforos como en los
semáforos binarios se emplea una cola para mantener los procesos esperando en el semáforo. La política
más equitativa mediante la cual se quitan los procesos de dicha cola es la FIFO. La única exigencia estricta
es que un proceso no debe quedar retenido en la cola de un semáforo indefinidamente porque otros procesos
tengan preferencia.
Generalmente operadores como WAIT y SIGNAL operan en los semáforos de la siguiente manera.
Cuando un proceso ejecuta un operador WAIT que tiene un valor de semáforo en 0, ese proceso se bloquea;
si el valor es mayor que cero, el valor del semáforo es disminuido en 1 y el proceso continua. Cuando un
proceso ejecuta un operador SIGNAL y hay procesos bloqueados (WAITING), uno de estos procesos es
activado (puesto en la cola de listos). Si no hay procesos esperando el valor del semáforo se incrementa en 1.
Se asume que procesos bloqueados por semáforos pierden el procesador y entran en una cola de espera
(WAITING QUEUE) en vez de producir BUSY WAITING. También se asume que la cola de espera es
FIFO.

LABORATORIO DE SO
AUTOR: ING. ANA LORENA FREITEZ
7

4. DESARROLLO DE LA PRÁCTICA

LABORATORIO

Requisitos:

a) Utilice Lenguaje C bajo Linux

4.1 HILOS
Compile los siguientes ejercicios, analice el código y la salida. Para la compilar el código con la
librería pthread es necesario utilizar la opción –lpthread, como se muestra este ejemplo:
gcc codigo.c –o codigo -lpthread
a) Creación de un hilo:
#include <pthread.h>
#include <stdio.h>

/* Imprime ‘x’ en la salida de error stderr. El parámetro no es usuado. No tiene retorno*/


void* print_xs (void* unused){
while (1)
fputc ('x', stderr);
return NULL;
}
int main (){
pthread_t thread_id;
/* Crea un nuevo hilo sobre la función print_xs */
pthread_create (&thread_id, NULL, &print_xs, NULL);
/* Imprime ‘o’ en la salida de error stderr*/
while (1)
fputc ('o', stderr);
return 0;
}
 Puede finalizar la ejecución con <Ctrl + C>.
 ¿Cuáles son los argumentos de la función pthread_create? ¿Para qué sirven?
 ¿Cómo es la salida en pantalla? ¿Cuál es la razón para este tipo de salida?

b) Retorna un valor desde el hilo.


#include <pthread.h>
#include <stdio.h>
/* Calcula los números primos sucesivamente .Retorna el N-esimo numero primo
donde N es el valor apuntado por *ARG. */
void* compute_prime (void* arg) {
int candidate = 2;
int n = *((int*) arg);
while (1) {
int factor;
int is_prime = 1;
for (factor = 2; factor < candidate; ++factor)
if (candidate % factor == 0) {
is_prime = 0;
break;
LABORATORIO DE SO
AUTOR: ING. ANA LORENA FREITEZ
8

}
if (is_prime) {
if (--n == 0)
return (void*) candidate;
}
++candidate;
}
return NULL;
}

int main () {
pthread_t thread;
int which_prime = 5000;
int prime;
/* Inicia el hilo, se requiere l número primo #5000. */
pthread_create (&thread, NULL, &compute_prime, &which_prime);
/* Puedo hacer algo mientras... si quiero */
/* Espero que el número sea calculado y me sea entregado. */
pthread_join (thread, (void*) &prime);
/* Imprimo el número entregado. */
printf("El número primo es %d.\n", prime);
return 0;
}
 ¿Cómo es el funcionamiento del código presentado?
 Según lo visto en este ejercicio ¿Cuál es la forma de retornar valores desde un hilo? Explique de
manera clara y en sus propias palabras.

4.2 CREACIÓN Y USO DE MEMORIA COMPARTIDA EN PROCESOS


A continuación se presenta un ejemplo muy simple del uso de memoria compartida entre procesos.
Se tienen dos procesos denominados el servidor y el cliente, el servidor crea una región de memoria
compartida y pone una información allí, luego el cliente se adhiere a esa región lee los datos y señaliza de
manera simple al servidor para que finalice.

Este es el código fuente del servidor:


#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>

#define SHMSZ 27

main(){
char c;
int shmid;
key_t key;
char *shm, *s;
/*Nombre del segmento de memoria compartida = "1234".*/
key = 1234;
/* Se crea el segmento de memoria*/
if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
LABORATORIO DE SO
AUTOR: ING. ANA LORENA FREITEZ
9

perror("shmget");
exit(1);
}
/* El programa se adhiere (attach) al segmento ya creado */
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
perror("shmat");
exit(1);
}
/* Se ponen algunos datos en el segmento para que el proceso
cliente los lea */
s = shm;
for (c = 'a'; c <= 'z'; c++)
*s++ = c;
*s = NULL;
/* Por último, se espera a que el proceso cliente cambie el primer caracter
de la memoria compartida a '*' indicando que ya leyó la información */
while (*shm != '*')
sleep(1);
exit(0);
}

Este es el código fuente del cliente:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#define SHMSZ 27

main() {
int shmid;
key_t key;
char *shm, *s;

/* Se requiere el segmento llamado "1234" creado por el servidor */


key = 1234;

/* Ubica el segmento */
if ((shmid = shmget(key, SHMSZ, 0666)) < 0) {
perror("shmget");
exit(1);
}
/* Se adhiere al segmento para poder hacer uso de él */
if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
perror("shmat");
exit(1);
}
/* Lee lo que el servidor puso en la memoria */
for (s = shm; *s != NULL; s++)
putchar(*s);
putchar('\n');
/* Finalmente, cambia el calor del primer caracter indicando que
LABORATORIO DE SO
AUTOR: ING. ANA LORENA FREITEZ
10

ha leído el segmento */
*shm = '*';
exit(0);
}
 Consulte el uso de las funciones shmget, shmat, shmdt y shmctl. ¿Para qué sirven estas
funciones? ¿Qué argumentos reciben y para qué sirven estos argumentos? ¿Cuál es la forma
tradicional de usar estas funciones?
 Analice el código anterior y verifique el uso y los parámetros pasados a las funciones
mencionadas anteriormente.

POST LABORATORIO
6. ACTIVIDAD POST – PRÁCTICA.

a) Indique las diferencias entre Tuberías Pipes y Fifos.


b) Investigue como se crea una Tubería Pipes y una Tubería Fifos.
c) Realice un cuadro de ventajas y desventajas entre los tres requisitos que se ofrecen para
solucionar la sección crítica (Exclusión mutua, Progreso y Espera Limitada).
d) INVESTIGUE Y Resuelva la siguiente operación matemática con concurrencia y utilizando las
palabras reservadas del Pascal Concurrente: A= (B+C+D)*E/X+(Y*Z)
e) En el siguiente segmento de programa señale la sección crítica e indique por qué es una sección
crítica:
program sem01; end; (* dos *)
var
nolineas: integer;
mutex: semaphore;
(* declaración del
semáforo *)
process uno;
var
lin: integer;
begin
for lin := 1 to 20 do
begin
wait(mutex);
nolineas :=
nolineas + 1;
signal(mutex)
end
end; (* uno *)

process dos;
var
lin: integer;
begin
for lin := 1 to 20 do
begin
wait(mutex);
nolineas :=
nolineas + 1;
signal(mutex)
end
LABORATORIO DE SO
AUTOR: ING. ANA LORENA FREITEZ
11

f) Presente las conclusiones argumentadas de la práctica.

El Informe a elaborar su equipo es sobre lo siguiente:


Introducción (indicando sobre que trata la práctica y que conocimientos adquirirán)
1) El Pre laboratorio (las 8 preguntas que tiene el mismo)
2) El Laboratorio (Las actividades 4.1 literales a) y b) y 4.2). Se les recuerda que
deben descargar una Terminal si trabajan bajo Android (SO el cual tiene
núcleo de Linux), o Termux en sus móviles o deben virtualizar el SO Linux
bajo Windows y luego descargar la Terminal en el SO virtualizado. Por qué
deben descargar la terminal? Para poder correr los Prgs.
3) El Post Laboratorio (las 6 preguntas que tiene el mismo. Muy importante la
Conclusión)
[1] Silberschatz, A., Cagne, G., Galvin, P. Operating system concepts. Wiley, 2005.
[2] Tanenbaum, A. Modern Operating Systems. Prentice Hall. 2008.

LABORATORIO DE SO
AUTOR: ING. ANA LORENA FREITEZ

También podría gustarte