Practica #2 - Facultad de Ciencias-UCV

Anuncio
Universidad Central de Venezuela
Facultad de Ciencias
Escuela de Computación
Sistemas Operativos (6004)
Práctica #2
Hilos
Objetivos de la práctica:



Conocer y estudiar el concepto de hilo y su importancia en el desarrollo de
programas y de Sistemas Operativos.
Estudiar y comprender las bondades de la abstracción hilo y aprovecharlas.
Estudiar el funcionamiento de hilos haciendo referencia a la biblioteca (pthread)
Desarrollo de la práctica:
1. Realice un código en C usando la biblioteca pthread el cual dada una matriz de n x
n calcule la suma de los números por cuadrantes y su resultado sea la suma de la
matriz completa.
2. Realice un código en C, con base en lo antes visto y usando la biblioteca pthread.
El código deberá resolver solicitudes de operaciones matemáticas sencillas, dicho
código deberá recurrir a un proceso hijo para la respuesta a esta solicitud, es
decir, usar fork(). Realice el mismo ejercicio ahora usando threads.
3. Escriba un programa en C usando el API de Hilos en C, que genere como salida
los sucesivos números primos. Este programa funcionara de la siguiente manera,
el hilo principal creara un hilo que dará como salida todos los números primos
menores o iguales que el número especificado por el usuario.
4. Dadas dos matrices, A y B, donde A es una matriz con M filas y K columnas, y la
matriz B es una matriz con K filas y N columnas, entonces la matriz producto de A
por B es C, la cual tiene M filas y N columnas, La entrada de la matriz C en la fila
i, columna j (𝐶𝑖𝑗 ) es la suma de los productos de los elementos de la fila i de la
matriz A y la columna j de la matriz B. Es decir:
𝑘
𝐶𝑖𝑗 = ∑ 𝐴𝑖,𝑛 × 𝐵𝑛,𝑗
𝑛=1
Escriba un programa en C que calcule 𝐶𝑖𝑗 mediante un hilo trabajador diferente.
Esto implica crear M X N Hilos de trabajo. El hilo principal, o padre, inicializara las
matrices A y B y asignara memoria suficiente para la matriz C, la cual almacenara
el producto de las matrices A y B. (Ayuda: Lo mejor es declarar las matrices A, B y
Universidad Central de Venezuela
Facultad de Ciencias
Escuela de Computación
Sistemas Operativos (6004)
Práctica #2
C globales, de esta forma cada hilo tendrá acceso a cada una de ellas sin ningún
problema).
5. Un servidor eco es un servidor que devuelve todo lo que recibe de un cliente, Por
ejemplo, si un cliente envía al servidor una cadena “Hola!”, el servidor responderá
con los mismos datos que ha recibido del cliente, es decir, “Hola!”.
Escriba un programa en C en donde, el hilo principal creara lo siguiente:
 Un servidor eco: Tendrá la tarea de revisar constantemente un arreglo de
booleanos el cual indica si un cliente ha enviado algún mensaje, este
arreglo de booleanos estará indexado con otro arreglo el cual almacenara
la cadena de dicho cliente. Cuando un cliente envié un mensaje, el
servidor debe crear un hilo trabajador el cual, debe imprimir por pantalla lo
siguiente “Soy el Hilo Trabajador#i , El mensaje es = B”, donde i es el ID
del hilo trabajador y B es el mensaje que tiene encargado dicho cliente. El
servidor debe poseer una cantidad K de hilos trabajadores, además debe
saber que hilos trabajadores están disponibles.
 N clientes: Los cuales escribirán mensajes. Este escribirá su mensaje en
el arreglo de mensajes de la siguiente forma “Hola soy el Hilo Cliente #i”,
donde i es el ID del hilo cliente.
6. Realice un código en C usando la biblioteca pthread el cual dados dos vectores A
y B calcule el producto punto (también conocido como producto interno) de ambos
vectores dividiendo las cuentas entre una cantidad X de threads. El programa
debe realizar la suma inherente al producto punto en X partes repartidas entre los
diferentes threads y finalmente sumar los resultados obtenidos por cada thread
para obtener el producto punto. Se recomienda utilizar el tipo de dato double.
Ayuda:
⃗⃗⃗ , 𝐵
⃗⃗⃗ y 𝐵
⃗ ∈ 𝑅 𝑛 dos vectores. El producto punto entre 𝐴
⃗ se define
Sean 𝐴
como:
𝑛
⃗ > = ∑(𝐴𝑖 × 𝐵
⃗ 𝑖)
< 𝐴, 𝐵
𝑖=1
Universidad Central de Venezuela
Facultad de Ciencias
Escuela de Computación
Sistemas Operativos (6004)
Práctica #2
7. Realice un código en C usando la biblioteca pthread el cual dado un arreglo de
enteros sin signo de N posiciones (5000 <= N <= 32767; N siempre un número
par) cuente e imprima por pantalla el número de ocurrencias de algún entero X
leído de entrada estándar. La búsqueda de elementos dentro del arreglo debe
repartirse entre 4 threads. El programa debe terminar cuando se lea por pantalla el
número -1. Utilice el siguiente fragmento de código para generar un arreglo de
enteros con valores aleatorios de tamaño N (también aleatorio y siempre par)
según las condiciones dadas:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
unsigned int *array;
unsigned int N;
void rand_array(void){
srand(time(NULL));
N = (unsigned int)(rand()%27767 + 5000); N = (N%2 == 0) ? N : N + 1;
int block = N/4, i;
array = (unsigned int*)malloc(sizeof(unsigned int) * N);
for(i = 0; i < block; i++){
array[i] = rand();
array[i + block] = rand();
array[i + (2*block)] = rand();
array[i + (3*block)] = rand();
}
}
8. Moe y Larry diseñaron un algoritmo de codificación de textos. El algoritmo funciona
escribiendo los textos en las columnas de una matriz de la siguiente manera:
primero escogen un numero N (2 <= N <= 5) que será el número de columnas de
la matriz; luego escriben los caracteres del texto por columna rellenando los
espacios faltantes con el carácter ‘*’; finalmente, el mensaje queda encriptado al
escribir la matriz de caracteres por filas. Como Moe y a Larry no les gusta trabajar
de más, decidieron que su algoritmo codificaría solamente letras minúsculas
representables con caracteres ASCII, y además omitiría los espacios en blanco.
Un ejemplo: Si tenemos el texto “curly no sabe que dice aqui” y utilizamos 3
columnas (N = 3) escribiríamos el texto siguiente en la matriz:
Universidad Central de Venezuela
Facultad de Ciencias
Escuela de Computación
Sistemas Operativos (6004)
Práctica #2
cac
ube
rea
lqq
yuu
nei
od*
s i *
Finalmente el mensaje codificado será la cadena: “cacuberealqqyuuneiod*si*”. Nótese que
la longitud de las columnas de la matriz es = ⌈
𝑆𝑡𝑟𝑙𝑒𝑛(𝑆)
⌉
𝑁
donde Strlen(S) es la longitud de la
cadena (sin espacios) y 𝑓(𝑥) = ⌈𝑥⌉ es el entero “techo” de x, es decir el menor entero
mayor o igual que x.
Moe y Larry le solicitan que realice una implementación del algoritmo en C usando la
biblioteca pthread el cual dada una cadena de longitud arbitraria y el valor de N, lleve a
cabo la codificación de la cadena aplicando el algoritmo antes expuesto, dividiendo la
creación de la matriz entre N threads para acelerar el procedimiento. Asuma que la
cadena (que debe leerse de entrada estándar) no tiene espacios en blanco ni letras en
mayúsculas y nunca tendrá más de 1024 caracteres.
Descargar