APUNTES DE SISTEMAS OPERATIVOS INTRODUCCION Puede considerarse al sistema operativo como el más fundamental de todos los programas. Controla todos los recursos del sistema de cómputo y ofrece la base sobre la cual pueden escribirse los programas de aplicación. El sistema operativo es una capa de software que está sobre la parte superior del hardware descubierto. De esta manera se manejan todas las partes del sistema y se presentar al usuario una interfaz o máquina virtual que es más fácil de entender y programar. La figura 1 muestra esta situación P rogramas de aplicación Reservación en líneas aéreas P rogramas del sistema Compiladores Sistema bancario Editores Juegos de video Intérprete de comandos Sistema operativo Lenguaje de máquina Hardware Microprogramación Dispositivos físicos Figura 1. Un sistema de cómputo consta de hardware, programas del sistema y programas de aplicación. La mayoía de los procesadores pueden trabajar en dos modos, el modo usuario y el modo supervisor, en el 386 estos modos se llaman modo real y modo protegido. El sistema operativo es aquella parte del software que corre en modo kernel (nucleo) o modo supervisor. El sistema operativo como una máquina ampliada La función del sistema operativo es la de presentar al usuario con el equivalente de una máquina ampliada o máquina virtual que sea más fácil de programar que el hardware implícito. El sistema operativo como un manejador de recursos La tarea principal del sistema operativo es llevar el control de quién utiliza cuál recurso, conceder requisiciones de recursos, explicar el uso e interceder en requisiciones conflictivas de diferentes programas y usuarios. 1 CONCEPTOS FUNDAMENTALES DE LOS SISTEMAS OPERATIVOS La interfaz entre el sistema operativo y los programas de usuario se define por medio del conjunto de "instrucciones extendidas" que el sistema operativo proporciona, estas se conocen como llamadas al sistema. Procesos Un proceso es un programa en ejecución. Consta del programa ejecutable, los datos y la pila del programa, su contador de programa, apuntador de pila y otros registros, así como de toda la información que se necesita para ejecutar el programa. En muchos sistemas operativos, toda la información referente a cada proceso se almacena en una tabla del sistema operativo llamada tabla de procesos, la cual es un arreglo (o lista enlazada) de estructuras, una para cada proceso en existencia corriente. Por lo tanto un proceso consta de su espacio de direcciones, generalmente llamada imagen del núcleo y su registro de la tabla de procesos, que contiene sus registros entre otras cosas. Las llamadas al sistema de manejo del proceso claves son aquellas que tienen que ver con la creación y terminación de procesos. Un proceso puede crear uno o más procesos diferentes (conocidos como procesos hijos) y estos a su vez generan nuevos procesos hijos, se llega rápidamente a la estructura de árbol de la figura 2. A B D C E F Figura 2. Un árblo de procesos, El proceso A creó dos procesos, B y C. El proceso B creó tres derivados, D, E y F. Archivos Un archivo es un bloque de información que generalmente recide en disco. Antes de que se pueda leer un archivo, éste debe abrirse y después de que se haya leído debe cerrarse. Con el fin de ofrecer un sitio para guardar archivos, MINIX tiene el concepto de directorio como una forma de agrupar archivos. Los directorios suelen tener una jerarquía de árbol como la que se muestra en la figura 3. 2 Directorio raíz Alumnos Juan María Facultad Luis P rof. P eréz Cursos P rof. Gómez P rof. López Examenes Archivos Figura 3. Sistema de archivos de la Universidad. Los archivos en la jerarquía del directorio pueden especificarse dando su nombre de trayectoria desde la parte superior de la jerarquía del directorio, el directorio raíz. Por ejemplo la trayectoria al archivo E1 será /Facultad/Prof.Perez/Examenes/E1. La primera diagonal especifica el directorio raíz. En todo momento se tiene un directorio de trabajo, si por ejemplo /Faultad/Prof.Perez fuera el directorio de trabajo, el archivo E1 podría especificarse con solo Examenes/E1. Los archivos en MINIX tienen un código binario de protección de 9 bits, 3 para el propietario, 3 para el grupo del propietario y 3 para alguien más. Los bits se conocen como bits rwx (read-write-execute, leer-escribir-ejecutar), para un directorio x significa permiso de búsqueda. Antes de que un archivo pueda leerse o escribirse, se verifican los permisos. Si se permite el acceso, el sistema produce un entero pequeño llamado descriptor de archivo para utilizarse en operaciones subsecuentes. Si se prohibe el acceso, se produce un código de error. 3 Para trabajar con discos removibles, MINIX permite que el sistema de archivos de un disco flexible se anexe al árbol principal mediante un montaje. Antes de la llamada a MOUNT, el disco de RAM (simulado en memoria central) contiene el sistema de archivo raíz o primario. La situación se muestra en la figura 4. Raíz a c Raíz Unidad 0 b x y a c d b d x y (b) (a) Figura 4. (a) Antes del montaje los archivos de la unidad 0 no son accesibles. (b) después del montaje, son parte de la jerarquía. En este caso se montaron en el directorio vacío b. Un concepto importante en los archivos es el de archivo especial, este permite manejar los dispositivos como si fueran archivos. Los archivos especiales se dividen en dos tipos, archivos especiales de bloque y archivos especiales de caracteres. los archivos especiales de bloque manejan dispositivos en los que las tranferencias se hacen en bloque al azar, como los discos. Los archivos especiales de caracteres modelan dispositivos seriales como impresoras de línea, interfaces de red, etc. El dispositivo estándard de entrada se reconoce con el descriptor de archivo 0 y el dispositivo estándard de salida por el descriptor de archivo 1. El descriptor de archivo 2 se refiere al dispositivo error estándard. Se definen dos números, el número de dispositivo mayor y el número de dispositivo menor, el primero se refiere al tipo de dispositivo (disco, terminal, impresora, etc.) y el segundo a cual de esos de dispositivos se refiere. Los número de dispositivo pueden observarse al listar /dev. Otro archivo especial es la tubería (pipe), este es un pseudo archivo que se usa para conectar dos proceso, cuando un proceso A desea enviar datos a otro proceso B, aquél escribe en la tubería. El proceso B puede leer los datos al leer la tubería. La figura 5 muestra esta situación. P roceso Tubería A P roceso B Figura 5. Dos procesos conectados por una tubería. 4 El intérprete de comandos El intérprete de comandos llamado shell (concha) no es parte del sistema operativo, pero hace un uso intenso de las llamadas al sistema. Cuando un usuario entra al sistema, se inicia un shell. Una vez activado el shell espera a que el usuario emita un comando. El indicador de shell (prompt) es generalmente un signo de pesos. Cuando se emite un comando el shell crea un proceso derivado y espera a que este termine. La entrada o salida de un proceso puede redirigirse usando < para entrada y > para salida, esto permite utilizar archivos como entrada o salida estándard. Si se desea que el shell solicite más comandos antes de procesar el actual, hay que agregar & al final de la línea de comandos. Esto puede ser muy útil para procesos que llevan mucho tiempo. LLAMADAS AL SISTEMA MINIX tiene 41 llamadas al sistema, idénticas a las de UNIX V7. Por ejemplo la llamada READ tiene tres parámetros, el nombre del archivo, el buffer de lectura y el número de bytes que se leerá. El código en C sería: count = read(file, buffer, nbytes); en count se almacena el número real de bytes leidos. Llamadas al sistema para el manejo de procesos La llamada FORK crea un nuevo proceso. 5 Manejo de procesos pid = fork() - crea un proceso hijo idéntico a proceso padre s = wait(&status) - espera a que un proceso hijo termine y determina su condición de salida s = execve(name,argv,envp) - sustituye la imagen esencial de un proceso exit(status) - pone fin a la ejecución del proceso y produce la condición de salida size = brk(addr) - fija el tamaño del segmento de datos que se direccionará (addr) pid = getpid() - produce el id del proceso solicitante Señales oldfunc = signal(sinc,func) - arregla que alguna señal sea capturada, pasada por alto, etc. s = kill(pid,sig) - envia una señal a un proceso residual = alarm(seconds) - planifica o programa una señal SIGALRM después de cierto tiempo s = pause() - suspende al solicitante hasta la siguiente señal Manejo del archivo fd = creat(name,mode) - crea un nuevo archivo o trunca uno existente fd = mknod(name,mode,addr) - crea un nodo i especial, regular o de directorio fd = open(file,how) - abre un archivo para lectura, escritura o ambos s = close(fd) - cierra un archivo abierto n = read(fd,buffer,nbytes) - lee datos de un archivo en un buffer n = write(fd,buffer,nbytes) - escribe datos de un archivo en un buffer pos = lseek(fd,offset,whence) - mueve el apuntador del archivo a alguna otra parte del archivo s = stat(name,&buf) - lee y produce la condición de un archivo a partir de su nodo i s = fstat(fd,buf) - lee y produce la condición de un archivo a partir de su nodo i fd = dup(fdl) - distribuye otro descriptor del archivo para un archivo abierto s = pipe(&fd0) - crea una tubería ioctl(fd,request,argp) - realiza operaciones especiales en archivos especiales Manejo del directorio y del sistema de archivos s = link(name1,name2) - crea un nuevo registro del directorio, name2 para name1 del archivo s = unlink(name) - elimina una entrada del directorio s = mount(special,name,rwflag) - monta un sistema de archivo s = unmount(special) - desmonta un sistema de archivo s = sync() - limpia todos los bloques reservados en la memoria para el disco s = chdir(dirname) - cambia el directorio de trabajo s = chroot(dirname) - cambia el directorio raíz Protección s = chmod(name,mode) - cambia los bits de protección asociados con un archivo uid = getuid() - determina el uid del solicitante gid = getgid() - determina el gid del solicitante s = setuid(uid) - fija el uid del solicitante s = setgid(gid) - fija el gid del solicitante s = chown(name,owner, group) - cambia el propietario y grupo de un archivo oldmask = umask(complmode) - fija una máscara que se utiliza para descubrir bits de protección access(name, mode) - verifica si se tiene acceso a un archivo Manejo del tiempo seconds = time(&seconds) - determina el tiempo transcurrido en segs. desde el 1o. de enero de 1970 s= stime(tp) - fija el tiempo desde el 1o. de enero de 1970 s = utime(file,timep) - fija la hora del "último acceso" del archivo s = times(buffer) - fija los tiempos del usuario y del sistema que se han usado hasta ahora Figura 6. Llamadas al sistema MINIX. El código producido s es -1 si ha ocurrido un error; fd es un descriptor de archivo, n es un conteo de bytes. Los otros códigos producidos son los que el nombre sugiere. 6 La llamada FORK produce una copia idéntica del proceso padre, el valor que genera es cero en el hijo y pid en el padre. el código de la figura 7 es un shell simplificado. while (TRUE) { /* repetir por siempre */ /* leer la entrada desde la terminal */ read_command(command, parameters); if (fork() != 0){ /* ramificar el proceso hijo */ wait(&status); /*código padre */ }else { execve(command, parameters, 0); /* código hijo */ } } Figura 7. Un shell desguarnecido. la llamada WAIT espera a que termine el hijo y regresa una variable con la condición de salida. La llamada EXECVE ejecuta un comando. por ejemplo. $cp file1 file2 copia el archivo file1 en file2.como muchos comandos el main de cp contiene la declaración. main(argc,argv,envp) argc es el numero de argumentos, argv es un arreglo de cadenas de parámetros, envp es un apuntador de ambiente donde hay información sobre el tipo de terminal, el directorio doméstico a un programa, etc. Los procesos en MINIX dibiden su memoria en tres segmentos: el segmento de texto (el código del programa) el segmento de datos y el segmento de pila como se muestra en la figura 8. 7 Dirección (hex) FFFF P ila Interespacio Dat os T exto 0000 Figura 8. Los procesos tienen tres segmentos: texto, datos y pila. En este ejemplo, Los tres están en el espacio de dirección, pero también se soportan espacios para datos e instrucciones separados. Llamadas al sistema para señalación La siguiente tabla resume las señales de MINIX. (1) SIGHUP El modem ha detectado una conexión telefónica rota Se ha oprimido la llave DEL en el teclado Señal de renuncia del teclado Instrucción ilegal Trampa de seguimiento Instrucción IOT Instrucción EMT Desbordamiento/insuficiencia de punto flotante Eliminación Error de bus Violación de la segmentación Argumento erróneo para la llamada al sistema Escritura en tubería sin lector Alarma Señal de terminación generada por el software 2 SIGINT 3* SIGQUIT (4)* SIGILL (5)* SIGTRAP (6)* SIGIOT (7)* SIGEMT (8)* SIGFPE 9 SIGKILL (10)* SIGBUS (11)* SIGSEGV (12)* SIGSYS 13 SIGPIPE 14 SIGALRM 15 SIGTERM 16 no asignado Figura 9. Tipos de señales. Las señales en paréntesis no son soportadas por MINIX. Los asteriscos denotan señales que provocan vaciados del núcleo si no se capturan o pasan por alto. El segmento de datos crece mediante una llamada a nuevo límite superior de dicho segmento. BRK la cual lleva como parámetro el La tecla DEL suspende la ejecución de un proceso. esto será indeseable en al caso de procesos en el transfondo, por esto el shell generará después de FORK y antes de EXEC. 8 el programa kill hace uso de la llamada señal sigkill mata al proceso. KILL para enviar señales a cualquier proceso. la La llamada ALARM permite mandar señales en tiempos predefinidos. Llamadas al sistema para manejo de archivos La llamada CREAT crea un archivo, acepta como parámetros el nombre del archivo y el modo de protección, fc = creat("abc", 0751); crea el archivo "abc" con modos rwxr-x--x. El archivo creado se abre para escritura, si existe se trunca a una longitud de 0 bytes. Para crear archivos especiales se usa MKNOD. Por ejemplo: fd = mknod("/dev/tty2",020744,0x0402); crea un archivo nombrado /dev/tty2 y le da el modo (un archivo especial de caracteres con los bits de protección rwxr--r--). El tercer parámetro contiene el dispositivo mayor (4) y menor (2). Solo el superusuario puede hacer una llamada a MKNOD. Para leer o escribir un archivo existente, primero debe abrirse con OPEN. Esta llamada especifica el nombre del archivo y un código 0, 1 o 2 que significa abierto para leer, escribir o ambos. El descriptor de archivo producido puede utilizarse entonces para lectura o escritura. La lectura y escritura se realiza con READ y WRITE, respectivamente. Para posicionarse dentro del archivo se utiliza LSEEK, esto permite el manejo de archivos aleatorios. Los parámetros de LSEEK son: el descriptor de archivo, la posición en el archivo y un indicador de si la posición es relativa al inicio del archivo, a la posición actual o al final del archivo. El valor producido por LSEEK es la posición absoluta obtenida dentro del archivo. Las llamadas STAT y FSTAT suministran información sobre los archivos, en la primera se suministra el nombre y en la segunda el descriptor del archivo. Estas hacen uso de la estructura de la figura 10. struct stat { short st_dev; unsigned short st_ino; unsigned short st_node; short st_nlink; short st_uid; short st_gid; short st_rdev; /* dispositivo a donde pertenece el nodo i */ /* número de nodo i */ /* palabra de nodo */ /* número de enlaces */ /* id del usuario */ /* id del grupo */ /* dispositivo mayor/menor de archivos especiales */ 9 long st_size; long st_atime; long st_mtime; long st_ctime; /* tamaño del archivo */ /* igual que st_mtime */ /* hora de la última modificación */ /* igual que st_mtime */ }; Figura 10. Estructura que se utiliza para producir información de las llamadas al sistema STAT y FSTAT. Hay tres tiempos presentes para que haya compatibilidad con UNIX. La llamada DUP crea un nuevo descriptor de archivo para un archivo abierto. UNIX hace uso de tuberías, cuando se teclea cat file1 file2 | sort el shell crea una tuberia y arregla que la salida estándar del primer proceso escriba en la tubería, de modo que la entrada estándar del segundo proceso se pueda leer a partir de él. La llamada al sistema PIPE crea una tuberia y produce dos descriptores de archivo, uno para escritura y otro para lectura. La llamada es pipe(&fd[0]) donde fd es un arreglo de dos enteros y fd[0] es el descriptor de archivo para leer y fd[1] es el que sirve para escribir. La figura 11 muestra el esqueleto para construir una tubería. #define STD_INPUT 0 /* descriptor del archivo de la entrada estándar */ #define STD_OUTPUT 1 /* descriptor del archivo de la salida estándar */ pipeline(process1, process2) char *process1, *process2; { int fd[2]; /* apuntadores a los nombres del programa */ pipe(&fd[0]); /* crea una tubería */ if (fork != 0) { /* El proceso padre ejecuta estas proposiciones */ close(fd[0]); /* el proceso 1 no necesita leer de la tubería */ close(STD_OUTPUT); /* prepárese para la nueva salida estándar */ dup(fd[1]); /* fijar la salida estándar en fd[1] */ close(fd[1]); /* la tubería ya no se necesita */ execl(process1, process1,0); } else { /* El proceso hijo ejecuta estas proposiciones */ close(fd[1]); /* el proceso 2 no necesita escribir de la tubería */ close(STD_INPUT); /* prepárese para la nueva entrada estándar */ dup(fd[0]); /* fijar la salida estándar en fd[0] */ 10 close(fd[0]); /* la tubería ya no se necesita */ execl(process2, process2,0); } } Figura 11. Esqueleto para construir una tubería de los procesos. La llamada IOCTL se utiliza para cambiar los caracteres empleados para corregir errores del teclado en la terminal, cambiar el modo de la terminal, etc. En modo elaborado, los caracteres de borrado y eliminación trabajan normalmente, CRTL-S y CRTL-Q se pueden utilizar para detener e iniciar la salida de la terminal. CRTL-D significa fin de archivo. DEL genera una señal de interrupción y CRTL-\ genera una señal de renuncia pra forzar un vaciado del núcleo. En modo no elaborado, todas las funciones se desactivan; todos y cada uno de los caracteres se pasan directamente al programa sin procesamiento especial. Además, una lectura de la terminal dará al programa cualquier carácter se haya tecleado, aunque sea una línea parcial, en vez de esperar una línea completa como en el modo leaborado. El modo Cbreak está situado entre ambos. Los caracteres de borrado y eliminación para edición se desactivan, como CRTL-D, pero CRTL-S, CRTL-Q, DEL y CRTL-\ se activan. La llamda IOCTL tiene tres parámetros, por ejemplo ioctl(fd, TIOCSETP, &sgttyb) el primer parámetro especifica un archivo, el segundo una operación y el tecero es la dirección de una estructura que contiene diversas indicaciones. La estructura se muestra en la figura 12. /* Estructuras de datos de las llamadas a IOCTL TIOCGETP/TIOCSETP */ struct sgttyb { char sg_ispeed; char sg_ospeed; char sg_erase; char sg_kill; int sg_flag; }; /* velocidad de entrada (no se usa ahora) */ /* velocidad de salida (no se usa ahora) */ /* borrar carácter */ /* eliminar carácter */ /* indicaciones de modo */ /* campos en sg_flags. */ #define XTABS 0006000 /* ocacionar la expansión tabular */ #define RAW 0000040 /* actvar el modo no elaborado */ #define CRMOD 0000020 /* hacer el mapa lf igual a cr + lf */ #define ECHO 0000010 /* activar el eco de la entrada tecleada */ #define CBREAK 0000002 /* activar el modo cbreak */ 11 #define COOKED 0000000 /* ni CBREAK ni RAW */ #define TIOCGETP (('t'<<8) | 8) #define TIOCSETP (('t'<<8) | 9) Figura 12. Estructura de datos que se usa como el tercer parámetro de IOCTL. Los bits de sg_flag se pueden fijar para que entren en modo no elaborado o cbreak, ECHO debe activarse para que la terminal refleje los caracteres, excepto cuando se este tecleando la contraseña. Llamadas al sistema para el manejo de directorios La llamada LINK permite que un archivo figure con dos o más nombres. Considerese la situación de la figura 13(a), después de link("/usr/jim/memo","/usr/ast/note"); se obtiene la situación de la figura 13(b), /usr/jim/memo y /usr/ast/note se refieren al mismo archivo. /usr/ast /usr/jim 16 correo 81 juegos 40 prueba 31 70 59 38 /usr/ast bin memo f.c prog1 16 81 40 70 (a) /usr/jim correo juegos prueba nota 31 70 59 38 bin memo f.c prog1 (b) Figura 13. (a) Dos directorios antes de enlazar /usr/jim/memo al directorio de ast. (b) Los mismos directorios después del enlace. Todos los archivos en UNIX tienen un número único, su nodo i (i-node), que los identifica. Un directorio es simplemente un archivo que contiene un conjunto de parejas (número i, nombre ASCII). En la figura 13 el número a la izquierda de los archivos es su número de nodo i, note que /usr/jim/memo y /usr/ast/note se refieren al mismo nodo i. La llamada UNLINK elimina enlaces en el directorio, si no existe ya ningún enlace el archivo es eliminado. La llamada MOUNT permite que dos sistemas de archivos se combinen en uno. Al ejecutar la llamada a MOUNT, el sistema de archivos de un disco removible se puede anexar al sistema de archivo raíz, como se muestra en la figura 14. Cuando el sistema de archivos ya no se necesita, se puede desmontar con la llamada UNMOUNT. 12 bin dev lib ´mnt usr (a) bin dev lib usr (b) Figura 14. (a) Sistema de archivo antes del montaje. (b) Sistema de archivo después del montaje. La llamada al sistema SYNC indica a MINIX que debe escribir todos los bloques que se han modificados desde que se leyeron. Cuando inicia MINIX, un progama llamado update (actualización) se inicia como proceso de fondo para hacer una SYNC (sincronización) cada 30 segundos, con objeto de mantener la limpieza de la reserva. Otras dos llamados son CHDIR y última cambia el directorio raíz. CHROOT. La primera cambia el directorio de trabajo y la Llamadas al sistema para protección En MINIX todo archivo tiene un modo de 11 bits que se utiliza con fines de protección. Nueve de estos bits son los bits de lectura, escritura y ejecución del propietario, grupo y otros. La llamada CHMOD hace posible cambiar el modo de un archivo. Por ejemplo, para hacer que un archivo sea sólo de lectura para todos excepto el propietario, se podra ejecutar chmod("file", 0644); Los otros dos bits de protección, 02000 y 04000, son los bits SETGID (fijar el id del grupo) y SETUID (fijar el id del usuario), respectivamente. Cuando algún usuario ejecuta un programa con el bit SETUID activado, en la duración de ese proceso el uid efectivo del usuario se cambia por el del propietario del archivo. Esta característica se utiliza ampliamente para permitir a los usuarios ejecutar programas que efectúen solo funciones de superusuario, como la creación de directorios. 13 Cuando un proceso ejecuta un archivo que tiene el bit SETUID o SETGID en su modo, éste adqiere un uid o gid efectivo diferente de su uid o gid real. Las llamadas al sistema GETUID y GETGID se han proporcionado para obtener el uid gid real y efectivo. Para ésto, existen cuatro rutinas de biblioteca: getuid, getgid, geteuid y getegid. Las dos primeras determinan el uid/gid real y las dos últimas los efectivos. Los usuarios ordinarios no pueden cambiar su uid, excepto al ejecutar programas con el bit SETUID activado, pero el superusuario tiene otra posibilidad: la llamada al sistema SETUID, que fija los uid efectivo y real. SETGID fija ambos gid. El superusuario también puede cambiar el propietario de un archivo con la llamada al sistema CHOWN. La llamada UMASK, fija la máscara de bit interna dentro del sistema, que se utiliza para descubrir bits de modo cuando se crea un archivo. Después de la llamada umask(022) el modo proporcionado por CREAT y utilizados. Por lo tanto, la llamada MKNOD tendrá los bits 022 descubiertos antes de ser creat("file", 0777) fijará el modo en 0755 en vez de 0777. La llamada ACCESS se utiliza para verificar permisos. El parámetro mode es 4 para verificar el acceso a lectura, 2 para escritura y i1 para ejecución. Llamadas al sistema para el manejo del tiempo produce la hora corriente en segundos, con 0 en el 1 de enero de 1970 a la media noche. STIME le permite al superusuario poner la hora del sistema. UTIME permite al propietario de un archivo cambiar el tiempo almacenado en un nodo i de un archivo. Por último, TIMES produce la información contable a un proceso, de modo que pueda observar cuánto tiempo de la CPU ha utilizado directamente y cuanto tiempo de la misma ha gastado el sistema mismo en su beneficio. TIME ESTRUCTURA DE UN SISTEMA OPERATIVO Sistemas monolíticos Un sistema monolítico es aquel que se escribe como un conjunto de procedimientos, cada uno de los cuales puede llamar a cualquier otro. Cada procedimiento tiene una interfaz bien definida en término de parámetros y resultados. 14 Las llamadas al sistema proporcionados se solicitan al colocar los parámetros en sitios bien definidos, como registros o la pila y después ejecutar una instrucción de trampa especial conocida como llamada de kernel o llamada supervisora. Esta instrucción cambia la máquina de modo usuario a modo kernel y transfiere el control al sistema operativo, que se muestra como el evento (1) de la figura 15. El sistema examina después los parámetros de la llamada para determinar qué llamada al sistema se efectuará, que se muestra como (2) en la figura 15. Después, el sistema operativo indiza en una tabla que contiene en el canal k un apuntador al procedimiento que realiza la llamada al sistema k. Esta operación, que se muestra como (3) en la figura 15, identifica el procedimiento de servicio, que después es llamado. Por útimo, se termina la llamada al sistema y el control se devuelve al programa de usuario. Memoria principal P rograma del usuario 2 P rograma del usuario 3 Llamada a kernel 4 P rocedimiento de servicio 3 1 2 Los programas del usuario corren en modo de usuario El sistema operativo corre en modo kernel Tabla de despacho Figura 15. Como puede hacerse una llamada al sistema: (1) El programa del usuario captura el kernel. (2) El sistema operativo determina el número de servicio que se pide. (3) El sistema operativo localiza y llama a un procedimiento de servicio. (4) El control se devuelve al programa del usuario. Esta organización sugiere una estructura básica del sistema operativo: 1. Un programa central que invoque el procedimiento de servicio solicitado. 2. Un conjunto de procedimientos de servicios que realicen las llamadas al sistema. 3. Un conjunto de procedimientos de uso general que ayude a los procedimientos de servicio. Esto sugiere la estructura de la figura 16. 15 P rocedimiento central P rocedimientos de servicio P rocedimientos de uso general Figura 16. Modelo de estructuración simple de un sistema monolítico. Máquinas virtuales Este sistema se basa en una observación astuta: un sistema de tiempo compartido ofrece (1) multiprogramación y (2) una máquina extendida con una interfaz más adecuada que el hardware simple. El corazón del sistema, conocido como monitor de la máqina virtual, corre en el hardware y realiza la multiprogramación, ofreciendo no una, sino varias máquinas virtuales para el siguiente estrato hacia arriba, como se muestra en la figura 17. Estas máquinas virtuales no son máquinas extendidas, con archivos y otras características atractivas. En su lugar, son copias exactas del hardware simple, incluyendo el modo de kernel/usuario, E/S, interrupciones y todo lo demás que tiene la máquina real. 370 virtuales Llamada al sistema aquí Instrucciones de E/S aquí CMS Trampa aquí CMS CMS Trampa aquí VM/370 Hardware al descubierto del 370 Figura 17. Estructura de VM/370 con CMS. Cada máquina virtual puede correr cualquier sistema operativo que corra directamente en el hardware. De hecho, diferentes máquinas virtuales pueden, ejecutar diferentes sistemas operativos. Modelo del cliente servidor El método general consiste en implementar a mayoría de las funciones del sistema operativo en procesos del usuario. Para solicitar un servicio, como la lectura de un bloque de un archivo, un proceso del usuario (ahora conocido como proceso cliente) envia la 16 solicitud a un proceso servidor, que después realiza el trabajo y devuelve la respuesta. En este modelo, que se muestra en la figura 18, todo lo que el kernel hace es manejar la comunicación entre clientes y servidores. P roceso del P roceso del Servidor del Servidor de cliente cliente proceso la terminal Servidor de Servidor de Modo de archivo memoria usuario Modo kernel Kernel El cliente obtiene servicio enviando mensajes a los procesos servidores Figura 18. Modelo del servidor cliente. Otra ventaja del modelo de cliente servidor es su adaptabilidad pra utilizarse en sistemas distribuidos, como se muestra en la figura 19. Máquina 1 Máquina 2 Máquina 3 Máquina 4 Cliente Servidor de archivo Servidor de procesos Servidor de la terminal Kernel Kernel Kernel Kernel Red Mensaje del cliente al servidor Figura 19. Modelo del cliente servidor en un sistema distribuido. 17 UNIX Proceso de entrada al sistema Al inicio el sistema mostrara la señal de entrada. login:_ El usuario deberá responder con su nombre de usuario el cual le fué asignado por el administrador. El sistema solicita a continiación la palabra clave. Si no hay problemas el sistema informa de la última vez que el usuario ingreso. Normalmente el indicador de solicitud de comandos el signos de pesos ($). En el momento en el que se muestra este el sistema espera a que el usuario escriba algún comando. Comandos básicos date - muestra la fecha actual. CTRL-U - borra la línea actual. stty - modifica la asignación de teclas who- muestra una lista de usuarios conectados al sistema. El formato general de las ordenes en unix es . Orden opciones expresión nombre_de_archivo passwd - cambia la palabra clave. Caracteres especiales /- se interpreta como el caracter escape.Sirve para cambiar el significado de los caracteres especiales. *,?,[,] - se utilizan para abreviar los nombres de archivos . $ - se utiliza para la sustitución de argumentos CTRL-D - señal de terminación. CTRL- S, CTRL-Q - suspende y reanuada la salida a la terminal. Consultas de manuales con man 18 El comando man permite desplegar información de todos los comandos de da ayuda de como usar este comando. UNIX. También $man man La información que muestra lo siguiente: NAME - nombre de la orden y sus alternativos y una breve descripción. SYNOPSIS - muestra como se usa la orden se indican posibles opciones y el tipo de los argumentos esperados. DESCRIPTION - da mas detalla de lo que da la orden y conmo se midifica por las opciones. FILES - da los nombres de los archivos más importantes para la orden. SEE ALSO - se refiere a las ordenes relacionadas u otra documentación que podria ser util para el lector. DIAGNOSTICS - da explicaciones sobre los misteriosos mensajes de error que pueden aparecer si la orden se utiliza mal . BUGS - da detalles de los errores conocidos que existen en la orden y a veces le dice obviarlos. Directorios y archivos pwd - da el directorio actual. cat - despliega un archivo en pantalla. pg - despliega archivos por pagina. tail - despliega el final de un archivo , diez líneas por default. ls - lista el contenido del directorio. la información desplegada tiene el siguiente formato. Las claves del primer carácter del listade de archivos es: d l b c s entrada de directorio. un enlace simblico. archivo especial de bloques . archivo especial de caracteres. semaforo senix. 19 m p s - datos compartidos senix (memoria). archivo especial fifo ( llamado tuberia, pipe). direccion de familia socket af-unix (AF_UNIX address family socket) . archivo regular. file - determina el tipo de un archivo. 20