Práctica 5

Anuncio
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
Descargar