...

Instituto Politécnico Nacional

Escuela Superior de Cómputo

Recurso Didáctico Digital

Unidad 1: Estructura de un sistema operativo
...
1.4 Llamadas al sistema

Objetivos

Al abordar este tema podrás construir e identificar la importancia de las llamadas del sistema en los procesos, y cómo estos se utilizan para entablar comunicación con el kernel, directorios, archivos y seguridad en cual es parte medular para el sistema operativo.

Son la conexión entre un programa en ejecución y el sistema operativo. Las instrucciones pueden venir de MSDOS o de lenguajes de alto nivel como C (Unix, Minix, Linux, Windows NT). Para que una rutina atienda las interrupciones, el control pasa al vector de interrupciones. El bit de modo cambia a modo monitor. El monitor examina la instrucción que provocó el problema. Por lo tanto, la solicitud se ejecuta y el control se vuelve a la instrucción siguiente a la llamada al sistema. Los parámetros de llamadas pueden transferirse a través de registros, bloques o tablas en memoria o pilas. Hay varias categorías de llamadas disponibles para el sistema que pueden ser utilizados son:

Finalizar, abortar, cargar, ejecutar, crear, terminar, establecer y obtener atributos del proceso, esperar un tiempo, señalar y esperar evento, asignar y liberar memoria.

Crear, eliminar, abrir, cerrar, leer, escribir, reposicionar, obtener y establecer atributos de archivo.

Solicitar, liberar, leer, escribir, reposicionar, obtener y establecer atributos de dispositivo.

Obtener fecha y hora, datos del sistema, atributos.

Crear, eliminar conexión de comunicación, enviar y recibir mensajes, transferir información de estado

La llamada al sistema o system call utiliza un método para los programas de aplicación en donde se comunica con el núcleo del sistema. En la actualidad los sistemas operativos requieren una aplicación o proceso para que el usuario pueda transmitir o leer información del hardware, así como de otros procesos que el núcleo tenga o genere, por lo que la llamada será el punto de enlace entre el usuario y el kernel.

Es importante considerar que las llamadas al sistema están disponibles en la interfaz y esta varía dependiendo del sistema operativo, aunque pueden funcionar similarmente.

Hay que tener en cuenta que una computadora que tiene una unidad de control de procesos solo puede ejecutar una instrucción a la vez, por lo que, si esta está en el proceso de ejecutar un programa del usuario, se requerirá un servicio del sistema, como la lectura de datos de un documento. Para transferir el control al sistema operativo, este inspeccionará los parámetros y realizará la llamada al sistema, y luego tendrá un regreso que llevará el control de la instrucción para que exista la llamada al sistema, lo que generará un proceso y su ejecución. De esta manera, el sistema realiza una serie de pasos para leer, el primero de los cuales es la lectura del archivo, el segundo se dirige al buffer y el tercero indica el número de bytes que se deben leer, como se muestra en la siguiente operación.

Cuenta=read(fd,buffer,nbytes)

Por lo tanto, al preparar la llamada al procedimiento de la biblioteca de lectura, que es responsable de realizar la llamada al sistema operativo, primero debe ingresar los parámetros en la estructura llamada pila y luego seguir los pasos anteriores, como se muestra en la siguiente imagen.

Fig 18. Procedimiento de biblioteca de lectura (read)

Como resultado, el procedimiento de biblioteca establece la llamada al sistema para evitar que el sistema se quede en espera como un registro. Una vez que lo tenga, se ejecuta en la instrucción de trap para cambiar de modo de usuario al modo de núcleo, lo que significa que la ejecución se lleva a cabo en una dirección específica dentro del núcleo.

Debido a que los sistemas operativos basados en llamadas al sistema requieren crear un mensaje, copiarlo al espacio de direcciones del proceso del sistema y luego pasar a ejecutar este proceso, son más eficientes que los sistemas operativos basados en paso de mensajes.

Los tipos de llamadas se pueden agrupar en :

Estas llamadas permiten la creación, eliminación, cambio de prioridad y puesta en espera de procesos. En este caso, están estrechamente relacionados con el planificador o cronograma del sistema operativo, así como con la gestión de la memoria y el uso de la CPU.

En este caso son syscalls que se ocupan de la manipulación de archivos, como crear un nuevo archivo, leer, escribir y eliminarlo. En este escenario, están estrechamente relacionados con el control de los sistemas de archivos (FS) de todas las unidades de almacenamiento disponibles, ya sean internas, externas o extraíbles.

Son las llamadas al sistema que se utilizan para administrar los dispositivos y permitir sus funciones, como conectar, desconectar y liberar. Están muy cerca de los periféricos o dispositivos que se pueden manejar.

Es un tipo de syscall que almacena información básica del sistema operativo, como la hora y la fecha, que son importantes para algunas aplicaciones.

Como su propio nombre indica, estas llamadas al sistema se encargan de las comunicaciones entre procesos. En otras palabras, administre los mensajes o señales que se envían durante los procesos de transmisión de información.

Con la siguiente lista de instrucciones dentro de la programación se pueden establecer llamadas al sistema dentro de la programación a realizar como se muestra en la siguiente imagen

Fig 19. Comandos para el uso de llamadas al sistema y su descripción

Llamadas al sistema para la administración de procesos

En sistemas POSIX como UNIX, fork desempeña un papel crucial al permitir la creación de nuevos procesos. Esta llamada crea una réplica exacta de un proceso existente, incluyendo todos sus atributos como descriptores de archivos y registros. Una vez que se ejecuta fork, tanto el proceso original como su copia, conocidos como el padre y el hijo, continúan funcionando de manera independiente. Aunque los valores de todas las variables son idénticos en el momento de la llamada a fork, cualquier modificación realizada en uno de los procesos no afectará al otro, a excepción del texto del programa, que se comparte entre ellos. La llamada a fork devuelve un valor distinto en el proceso hijo y en el proceso padre, permitiendo así identificar cuál es cuál.

Después de crear un proceso hijo utilizando fork, el proceso padre a menudo necesita esperar a que el hijo termine su ejecución antes de continuar. Para hacerlo, el padre utiliza la llamada al sistema waitpid, que puede esperar a un hijo específico o a cualquier hijo si se establece un parámetro especial. Cuando waitpid se completa, el estado de salida del hijo se refleja en la dirección proporcionada como argumento (statloc), incluyendo información sobre si la terminación fue normal o anormal. También ofrece diversas opciones especificadas mediante un tercer parámetro.

Uso de fork en shell

En el contexto del shell, que es el intérprete de comandos en sistemas UNIX, fork desempeña un papel esencial. Cuando un usuario ingresa un comando en el shell, este crea un nuevo proceso hijo utilizando fork. Luego, el shell espera a que el hijo ejecute el comando y, una vez que este termina, el shell está listo para aceptar el siguiente comando. Esta espera se logra a través de la llamada a waitpid.

Uso de execve en el Shell

Después de crear el proceso hijo mediante fork, el shell necesita que este hijo ejecute el comando del usuario. Para lograrlo, utiliza la llamada al sistema execve, que reemplaza la imagen completa del núcleo del proceso hijo con el programa especificado. Aunque en la figura se muestra como execve, existen varias rutinas de biblioteca como execl, execv, execle y execve que ofrecen distintas formas de especificar y utilizar esta llamada al sistema.

Administración de Memoria y Segmentos de un Proceso

Los procesos en UNIX tienen su memoria dividida en tres segmentos: el segmento de texto (que contiene el código del programa), el segmento de datos (donde residen las variables), y el segmento de pila. Entre estos segmentos, hay un espacio no utilizado de direcciones. La pila crece automáticamente cuando es necesario, mientras que la expansión del segmento de datos se realiza mediante una llamada al sistema específica (por ejemplo, brk). Es importante destacar que brk no está incluida en el estándar POSIX y se prefiere el uso de la función malloc de la biblioteca estándar para asignar memoria dinámica.

Administración de Archivos

Las operaciones de lectura y escritura de archivos requieren que el archivo se abra primero mediante la llamada al sistema open. Esta llamada especifica el nombre del archivo y el modo de acceso (lectura, escritura o ambos). Para crear un archivo nuevo, se utiliza el flag O_CREAT. Una vez abierto, se pueden realizar operaciones de lectura y escritura en el archivo utilizando los descriptores de archivo. Para liberar recursos, el archivo se cierra mediante la llamada close.

Las llamadas de lectura y escritura más utilizadas son read y write. Ambas toman un descriptor de archivo y un búfer de datos como argumentos. read lee datos del archivo en el búfer, mientras que write escribe datos en el archivo desde el búfer.

Aunque muchas aplicaciones leen y escriben archivos secuencialmente, algunas necesitan acceder a partes específicas de un archivo de manera aleatoria. Para permitir esto, UNIX mantiene un puntero de posición asociado a cada archivo. La llamada al sistema lseek se utiliza para cambiar la posición del puntero en el archivo, lo que permite realizar lecturas y escrituras aleatorias en diferentes partes del archivo.

Para obtener información sobre un archivo, como su tipo, tamaño y hora de última modificación, se utiliza la llamada al sistema stat. Esta función toma el nombre del archivo y una estructura donde se almacenará la información. Para archivos abiertos, la función equivalente es fstat.

Otras Llamadas al Sistema

Además de las categorías anteriores, existen otras llamadas al sistema en UNIX. Algunas de estas incluyen:

  • chdir: Cambia el directorio de trabajo actual del proceso.
  • chmod: Modifica los permisos de un archivo.
  • kill: Se utiliza para enviar señales a procesos, lo que puede resultar en la terminación o manipulación de un proceso.
  • time: Devuelve la hora actual en segundos desde una fecha de referencia.

Es importante destacar que estas llamadas al sistema desempeñan un papel crucial en la administración y operación de un sistema UNIX. Cada una de ellas brinda una funcionalidad específica que los programadores pueden utilizar para interactuar con el sistema operativo y administrar procesos, archivos y directorios de manera efectiva.