MÓDULO I: ENTORNO CENTRALIZADO DE TIEMPO COMPARTIDO MULTIUSUARIO MULTIPROCESO. 1.- Composición del entorno. El entorno dónde se va a realizar esta práctica esta compuesto por una serie de equipos que se comportan como terminales conectados a un miniordenador que tiene memoria virtual paginada y, cuyo sistema operativo es una versión del UNIX, denominada SunOS (Sun Microsystems). Este entorno tiene las siguientes características: centralizado, interactivo, multiusuario, multiprogramación y multiproceso. Por consiguiente es de tiempo compartido. 2.- Multiusuario. A continuación se expone distintas formas de detectar que el entorno con el que se trabaja es multiusuario: 2.1.- Establecimiento de una sesión. Antes de trabajar con el entorno es necesario conectarnos con él y que este nos reconozca como usuario; por tanto es necesario identificarnos. Esta operación se denomina login. Cuando ejecutamos el programa de conexión a máquina remota correspondiente al icono TELNET (bajo Windows), el PC se emula como un terminal y se conecta físicamente al miniordenador. La primera información que aparece sobre la pantalla es el denominado saludo de recepción, junto con la siguiente pregunta: Console login: ("dígame cuál es el login que utiliza"). Es decir, cuál es el nombre por el que la máquina debe conocerte. Al pulsar la tecla Return el sistema pedirá la contraseña: Password:. Una vez proporcionada la contraseña, el sistema visualizará un mensaje de bienvenida. Desde este momento, se pone a la espera de cualquier mandato a través del prompt, que está representado por el carácter dólar ($). El comando que permite cambiar la contraseña (o crear una si todavía no tiene) es passwd. Este comando es interactivo, en el sentido de que va indicando lo que quiere © E.G.R. 1 que introduzca el usuario. Primero le pide la antigua contraseña y posteriormente la nueva contraseña debe ser escrita dos veces. Existe un fichero etc/passwd que contiene todas las contraseñas además de información relevante sobre los distintos usuarios que conoce el entorno. A dicho fichero todos los usuarios tienen acceso, por lo que para preservar la seguridad de las contraseñas, éstas están encriptadas. El encriptamiento de la contraseña significa que nadie, ni siquiera el superusuario o administrador del entorno, puede averiguar cuál es mirando la versión encriptada, así que no se debe olvidar la contraseña. Al visualizar su contenido se puede observar que es un fichero normal de texto ASCII. La estructura de cada línea es la siguiente: LOGIN:CONTRASEÑA:UID:GID:DIRECCIÓN:DIRECTORIO_RECEPCIÓN:SHELL Al trabajar en un entorno multiusuario, cada usuario puede, pues, crear ficheros y directorios dentro de su espacio de trabajo, del que resulta ser propietario y gestor. Por otro lado, los usuarios pueden pertenecer a un grupo y compartir ficheros con otros miembros del grupo del que forman parte. Por otra parte, un usuario puede, si lo desea, dar autorización a otros usuarios, cualquiera que sea el grupo al que pertenece, para acceder a algunos de sus ficheros y directorios. Todas estas autorizaciones de acceso y particiones son gestionadas mediante un sistema de autorizaciones de acceso a ficheros y directorios. Se utiliza el comando exit para desconectarse con el sistema y cerrar la sesión, destruyendo el shell en el que nos encontramos. 2.2.- Lista de los usuarios conectados. En un entorno multiusuario siempre se tiene la impresión de estar solo con la máquina, ya que la presencia de otros usuarios es totalmente transparente. El comando tty nos devuelve el nombre del terminal al que estamos conectados. Para saber el nombre con que nos conoce el entorno, se puede emplear tanto el mandato who am i, como el mandato en una sola palabra whoami. Con el mandato who obtenemos la lista de los nombres de los usuarios conectados actualmente, el terminal en que se encuentran, la fecha y la hora en que se conectaron al entorno. © E.G.R. 2 2.3.- Comunicación entre usuarios. En un entorno multiusuario, la comunicación entre los distintos usuarios es un principio básico del trabajo cotidiano de todos. Para enviar un mensaje a un usuario es preciso que este último esté conectado. El envío de un mensaje se hace por medio del mandato write, que escribe directamente en la pantalla del destinatario. Puede ocurrir que el destinatario esté conectado en varios terminales a la vez. En este caso, se puede elegir el terminal sobre el que se desea lanzar el mensaje. Si no se desea recibir mensajes (por ese terminal), se puede impedir mediante el mandato mesg n, que desactiva la recepción de mensajes. Para restablecer la posibilidad de recibir mensajes se usará el comando mesg y. El comando talk abre una ventana de diálogo con otro usuario sólo si este está conectado en el momento de intentar la comunicación. A continuación, si el usuario está conectado es avisado con un pitido y un mensaje a intervalos regulares de tiempo por si en ese instante no estuviera atendiendo el terminal. Una vez enterado del aviso abrirá otra ventana de diálogo haciendo uso de este mismo comando, entonces es cuando se establece la comunicación. Cuando la comunicación es interrumpida (mediante ^c) por un usuario desaparece la ventana de diálogo también en el otro. El superusuario puede enviar un mensaje a todos los usuarios que se encuentren conectados en ese momento mediante el comando wall que es la abreviatura de write all. 3.- Interactivo. Se puede observar que la mayoría de los comandos del sistema operativo empleados anteriormente, proporciona una salida en un tiempo de respuesta breve. Se puede recordar los comandos tty, cat, read, echo, passwd, date, ls, etc. 4.- Multiprogramación. Multiproceso. © E.G.R. 3 A continuación se expone distintas formas de comprobar que es un entorno multiprogramable (multiproceso): 4.1.- Planificación de procesos. Cuando nos conectamos con el sistema, el diálogo se inicia mediante un programa especial conocido por shell. Por cada usuario que se conecta se crea un ejemplar particular de shell. El shell interpreta los comandos introducidos en un terminal por el usuario, y los transmite al sistema en un lenguaje y una sintaxis comprensibles para éste. Se pueden escribir verdaderos programas con las instrucciones del shell, sirviéndonos de un editor, y convirtiéndolos en ejecutables mediante el comando chmod. A los programas shell se le denominan scripts, que son ficheros a los que se le otorgan derecho de ejecución. Estamos en un entorno multiproceso es decir; el entorno puede atender más de un trabajo a la vez. Al momento de conectarnos se crea un proceso: el shell que se pone a la espera de las instrucciones que vayamos a darle a través de nuestro terminal. Esto quiere decir que siempre hay un proceso, como mínimo, en curso de ejecución y que sólo desaparecerá mediante la desconexión. Las entradas y salidas estándar de este shell son el terminal y la primera acción que realiza el shell es la de visualizarnos el prompt. Todo mandato que le transmitamos se ejecutará mediante un subproceso específico, diferente del shell de partida. El shell de conexión espera la señal de fin del subproceso para poder visualizar de nuevo el prompt y ponerse otra vez a la espera de siguientes instrucciones. Un entorno es algo "vivo" y siempre tiene un cierto número de procesos en curso. Cada proceso siempre ha sido generado por otro proceso superior. Cada proceso recibe un número del sistema; es el PID (processus identification), que es un número que nos permite encontrarlo en el listado de los procesos. 4.2.- Tarea de fondo. Hay dos formas de ejecutar un trabajo: 1.- de forma interactiva que es la que venimos utilizando. Funciona como un diálogo de preguntas/respuestas: le damos una orden al shell y esperamos a que nos devuelva el resultado antes de darle otra orden. © E.G.R. 4 2.- con prioridad subordinada también denominada tarea de fondo, que significa lanzar la orden al shell y continuar nuestro trabajo sin esperar a que nos dé el resultado de la misma. Esta forma de ejecutar un trabajo es bastante útil cuando dicho trabajo requiere bastante tiempo. Para ejecutar un trabajo (mandato) en tarea de fondo, sólo hay que concluir dicho mandato con el carácter especial &. Para comprobar como funciona el ejecutar un trabajo en tarea de fondo, vamos a realizar un programa que calcule los factoriales de los números que se encuentran en un fichero y los almacene en otro fichero. Se puede observar que es un programa que requiere mucho cálculo y poca interacción con el usuario. El comando kill permite anular un proceso en curso. Para ello es preciso saber el número de identificación que le corresponde. Este mandato envía la señal de finalización al proceso. $ kill número_proceso Cuando se lanzan trabajos como tareas de fondo, a menudo algunos de ellos no urgen. El mandato nice se encarga de decirle al sistema cuáles son los trabajos no prioritarios. Estos tardarán en ejecutarse, pero no molestarán a los restantes trabajos en curso, especialmente a aquellos que se realizan en modo interactivo y que deben siempre favorecerse. También se puede encargar un trabajo para que se ejecute cuando vaya a ausentarse. Esto es bastante útil, especialmente si un trabajo requiere considerable tiempo. Para ello se utiliza el mandato nohup (no hung up), que permite la ejecución de tareas después de desconectarse del sistema. © E.G.R. 5