Sistemas Operativos Ingenierı́a de telecomunicaciones Sesión 5: Entrada y salida Calendario Comienzo: Lunes 14 de diciembre de 2009 y miércoles 16 de diciembre de 2009. Entrega: 11 de enero de 2010 y 13 de enero de 2010. 1. Objetivos Al finalizar esta sesión: Sabrás qué son los archivos especiales Manejarás correctamente las llamadas generales para entrada salida: read() y write(). Conocerás el significado del directorio /dev. 2. Procesos y E/S Como ya sabes, en UNIX la unidad de ejecución es el proceso. Todo el trabajo que se realiza lo hace algún proceso. Las operaciones de entrada/salida también están siempre asociadas a algún proceso. Para que un proceso pueda realizar operaciones de entrada salida, primero es necesario adquirir autorización (“abrir”) para el recurso que necesitemos, después realizar las operaciones de lectura y/o escritura que queramos y, finalmente, liberar el recurso. Este esquema general es válido en todos los casos: leer un CD de música, escribir en un disco externo, conectar con un servidor de internet y bajar una página web. Lo único que varı́a de caso a caso es el conjunto especı́fico de llamadas al sistema necesario. 1 2.1. Archivos especiales Organizar la información dentro de un ordenador en carpetas (folders) y archivos o ficheros (files), es una estrategia muy común, y a estas alturas es a la que todos estamos acostumbrados. Pero en Unix las cosas van un poco más alla. En el sistema de ficheros Unix podemos encontrar ficheros que no sólo almacenan información sino que tienen un comportamiento especial. Por ejemplo, cuando un disco tiene varias particiones, se pueden “enganchar” unas particiones con otras “montándolas”, ası́ da la sensación de que hay un sólo espacio de almacenamiento. También existen ficheros que permiten acceder a los dispositivos hardware. Prueba a hacer un ls -l /dev. Verás que aparecen distintos archivos como cdrom, audio o fd0 (disquetera). Esos son los dispositivos a los que se puede acceder en tu equipo ahora mismo. Como ves, los dispositivos aparecen como archivos normales y corrientes dentro de un directorio. Otra forma interesante de ver los dispositivos que ha detectado tu sistema es con el comando dmesg. Además de los dispositivos, este comando te ofrece todos los mensajes que ha generado el núcleo desde que el sistema arrancó. 2.2. Programando entrada/salida Ya deberı́ais conocer algunas funciones para trabajar con ficheros: fopen, fprintf, fscanf. Ahora vamos a ver algunas más generales: open, read y write: #include #include #include #include #include <s t d i o . h> < f c n t l . h> < s t d l i b . h> <u n i s t d . h> <s t r i n g . h> int main ( ) { int f d e s = open ( ”SOP” , O WRONLY | O CREAT, 0 6 0 0 ) ; i f ( f d e s == −1){ p e r r o r ( ” Error while opening f i l e ” ) ; return −1; } w r i t e ( f d e s , ”SOP” , s t r l e n ( ”SOP” ) + 1 ) ; close ( fdes ) ; char name [ 1 0 ] ; f d e s = open ( ”SOP” , O RDONLY) ; i f ( f d e s == −1){ 2 p e r r o r ( ” Error while opening f i l e ” ) ; return −1; } r e a d ( f d e s , &name , s t r l e n ( ”SOP” ) + 1 ) ; p r i n t f ( ”He l e i d o \ %s d e l a r c h i v o \n” , name ) ; return 0 ; } En este ejemplo vemos el funcionamiento de las tres llamadas. Lo que hacemos es escribir primero unos datos con write() en un fichero, cerrarlo, volver a abrirlo y leerlos con read(). Como siempre, consulta las páginas de manual (en la sección 2, no la 1) para entender bien cómo funcionan estas llamadas. IMPORTANTE: Para cerrar un archivo (o cualquier otro objeto de E/S) abierto, necesitamos llamar a close(). Con esto se libera el recurso y se puede reutilizar el descriptor de archivo. 3. Ejercicios 3.1. Conocimiento Cada pregunta vale 1 punto. Serán valoradas como correctas o incorrectas. 1. Existe un pseudodispositivo que genera infinitos ceros. ¿Cómo usarı́as el comando dd para copiar mil bytes con valor cero a un archivo? 2. Existen algunas operaciones que no se pueden hacer de manera genérica usando solamente el modelo de archivos de Unix (abrir, leer /escribir y cerrar), por ejemplo configurar la velocidad de un módem. Para eso existe una llamada al sistema concreta. ¿Cuál? 3. ¿Qué comando y con qué opciones permite crear un enlace a un inodo existente? ¿Y un enlace simbólico? 4. Utiliza los comandos anteriores para crear un enlace de cada tipo. Demuestra con un ejemplo práctico cómo diferenciar el archivo original, el enlace duro y el enlace simbólico. 3.2. Experimentación 1. (1 punto) En esta sesión vamos a utilizar un mecanismo de entrada/salida que nos va a permitir comunicar datos de un proceso a otro: las tuberı́as. Las tuberı́as son 3 objetos que se comportan como una cola FIFO unidireccional, es decir, tienen dos extremos y lo que se escriba por un lado se puede leer por el otro en el mismo orden en que se escribió. Existe un comando para crear tuberı́as en el sistema de archivos, encuéntralo. Una vez que hemos creado una tuberı́a, podemos identificarla usando $>ls -l: prw-r--r-- 1 fherrero fherrero 0 21 jul 13:00 fifo Si os fijáis, la primera letra es una ’p’ de pipe. Con esta tuberı́a vamos a poder comunicar dos procesos entre sı́. Uno deberá abrirla con permisos de escritura y el otro con permisos de lectura. El primero irá leyendo de teclado y escribirá lo que reciba por teclado (puedes hacer pruebas utilizando un archivo grande y los mecanismos de redirección que ya conoces). El segundo deberá leer de la tuberı́a e imprimir por pantalla lo que encuentre. 2. (0,5 puntos) Realiza el ejercicio anterior con un archivo normal en lugar de una tuberı́a. Explica razonadamente por qué el comportamiento es el mismo o es diferente. 3.3. Programación 1. Repite el ejercicio de la sesión 4. Ahora utiliza tuberı́as para comunicar los dos procesos. El proceso de los hilos ahora hará un trabajo un poquito más complicado. Vamos a simular un pequeño sistema solar. Cada planeta se moverá en un espacio de dos dimensiones, y guardaremos su posición y la velocidad a la que se está moviendo en cada dimensión. Al otro proceso, en lugar de los identificadores de los hilos, habrá que comunicarle la posición de cada planeta al final de cada paso de integración. Éste imprimirá por pantalla las posiciones, de tal forma que cada instante de tiempo quede impreso en una única lı́nea. Teniendo en cuenta que el módulo de la fuerza que actúa sobre un cuerpo determiP 2 , haremos que cada hilo se encargue de calcular nado viene dada por F = i g m1d·m 2 la fuerza que actúa sobre cada cuerpo. La idea es que para calcular el paso t + 1 de la simulación hay que conocer todos los valores del momento t. Dentro de un mismo paso, cada hilo puede calcularlos independientemente, pero, no puede pasar al momento siguiente hasta que los demás no hayan terminado. Por eso hay que implementar el siguiente esquema: a) Fase de cálculo de los nuevos valores Cada hilo calcula la ecuación de la fuerza y determina los valores de la nueva velocidad y la nueva posición. Utilizando el método de Euler tenemos: vi+1 = vi + ai ∆t xi+1 = xi + vi ∆t 4 siendo x la posicion, v la velocidad, a la aceleración y ∆t el intervalo de tiempo transcurrido desde el último punto calculado. b) Fase de actualización Cada hilo escribe los nuevos atributos de cada cuerpo. Para facilitar el programa, se podrán cargar las condiciones iniciales de los cuerpos desde un archivo. Los parámetros como masa, gravedad y paso de integración se pueden especificar en el mismo archivo o como constantes definidas dentro del programa, no es necesario pedirlas al usuario. Como ejemplo, simulando tres cuerpos, suponiendo que cada cuerpo tiene masa m = 1, la gravedad es g = 1, el paso de integración es 0,001 y las condiciones iniciales son: x y vx vy 0.97000436 0.24308753 -0.46620 -0.43237 -0.97000436 -0.24308753 -0.46620 -0.43237 0 0 0.93240737 0.86473146 obtengo la siguiente gráfica: 4 "out" "" u 3:4 "" u 5:6 3 2 1 0 -1 -2 -3 -4 -4 -3 -2 -1 0 1 2 3 4 Con otros parámetros para cuatro cuerpos: x y v x vy 1 1 1 0 -1 1 0 1 -1 -1 -1 0 1 -1 0 -1 Se puede obtener la simulación que se encuentra en http://arantxa.ii.uam.es/ En este ejemplo se puede apreciar cómo los errores de la simulación se van acumulando y hacen que una situación de partida inicial simétrica termine siendo totalmente asimétrica. ∼fherrero/ssoo/video.mpeg. (5 puntos) 5