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.