Tipos de llamadas al sistema (seis categorías)

Las llamadas al sistema se pueden dividir aproximadamente en seis categorías:
进程控制(process control)
文件管理(file manipulation)
设备管理(device manipulation)
信息维护(information maintenance)
通信(communication)
保护(protection)

Control de procesos

El programa de ejecución debe poder detener la ejecución normalmente (final ()) o anormalmente (abortar ()). Si una llamada del sistema detiene anormalmente el programa que se está ejecutando actualmente, o el programa se encuentra con problemas y causa una trampa de error, a veces volcar la memoria en el disco y generar un mensaje de error. Después de volcar la información de la memoria en el disco, se puede usar un depurador para determinar la causa del problema (el depurador es un programa del sistema para ayudar a los programadores a encontrar y corregir errores).

Ya sea normal o anormal, el sistema operativo debe transferir el control al intérprete del comando de llamada. El intérprete de comandos lee el siguiente comando. Para los sistemas interactivos, el intérprete de comandos simplemente lee el siguiente comando y supone que el usuario tomará el comando apropiado para manejar el error. Para los sistemas GUI, se pueden usar ventanas emergentes para alertar a los usuarios de errores y solicitar orientación. Para los sistemas por lotes, el intérprete de comandos generalmente finaliza el trabajo completo y continúa con el siguiente trabajo. Cuando se produce un error, algunos sistemas pueden permitir operaciones especiales de recuperación.

Si el programa encuentra que la entrada es incorrecta y desea terminar de manera anormal, también puede necesitar definir el nivel de error. Cuanto más grave es el error, mayor es el nivel del parámetro de error. Al definir el nivel de error de terminación normal como 0, la terminación normal y anormal se pueden manejar juntas. El intérprete de comandos o el siguiente programa pueden usar este nivel de error para determinar automáticamente la siguiente acción.

Un proceso o trabajo que ejecuta un programa puede necesitar cargar (cargar ()) y ejecutar (ejecutar ()) otro programa. Esta característica permite que el intérprete de comandos ejecute un programa, que puede proporcionarse mediante comandos del usuario, clics del mouse o comandos por lotes. Una pregunta interesante es: ¿dónde se devolverá el control cuando finalice el cargador? La pregunta relacionada es: ¿Se ha perdido o guardado el programa original, o se puede ejecutar simultáneamente con el nuevo programa?

Si el control vuelve al programa existente cuando finaliza el nuevo programa, entonces la imagen de memoria del programa existente debe guardarse. Por lo tanto, se crea un mecanismo para que un programa llame a otro. Si los dos programas continúan simultáneamente, se crea un nuevo trabajo o proceso para múltiples ejecuciones. Por lo general, hay una llamada al sistema dedicada a este propósito (create_process () o submit_job ()).

Si se crea un nuevo trabajo o proceso o un grupo de trabajos o procesos, entonces deberíamos poder controlar la ejecución. Este control debe poder determinar y restablecer los atributos del proceso o trabajo, incluida la prioridad del trabajo, el tiempo de ejecución máximo permitido, etc. (get_process_attributes () y set_process_attributes ()). Si se descubre que el proceso o trabajo creado es incorrecto o ya no es necesario, entonces también debe poder finalizarlo (terminate_process ()).

Después de crear un nuevo trabajo o proceso, puede que tenga que esperar a que se complete su ejecución, o puede que tenga que esperar una cierta cantidad de tiempo (wait_time ()). Es más probable que espere un evento (wait_event ()). Cuando ocurre un evento, el trabajo o proceso responde (signal_event ()).

Por lo general, dos o más procesos compartirán datos. Para garantizar la integridad de los datos compartidos, el sistema operativo generalmente proporciona llamadas al sistema para permitir que un proceso bloquee los datos compartidos. De esta manera, antes de desbloquear, otros procesos no pueden acceder a los datos. En general, tales llamadas al sistema incluyen adquire_lock () y release_lock (). Tales llamadas al sistema se utilizan para coordinar procesos concurrentes y se discutirán en detalle en los capítulos siguientes.

El proceso y el control del trabajo son muy diferentes. Aquí hay dos ejemplos para ilustrar: uno involucra un sistema de tarea única, el otro involucra un sistema de tareas múltiples.

El sistema operativo MS-DOS es un sistema de tarea única y ejecuta un intérprete de comandos cuando se inicia la computadora (Figura 1a). Dado que MS-DOS es de tarea única, utiliza un método simple para ejecutar el programa sin crear nuevos procesos. Carga el programa en la memoria y se reescribe para proporcionar el mayor espacio posible para el nuevo programa (Figura 1b).
Inserte la descripción de la imagen aquí
Estado de ejecución de MS-DOS
Figura 1 Estado de ejecución de MS-DOS

A continuación, establece el puntero de instrucción en la primera instrucción del programa. Luego, ejecute el programa, o el error provoca una interrupción, o el programa ejecuta una llamada del sistema para finalizar. En cualquier caso, el código de error se guardará en la memoria del sistema para su uso posterior. Después de eso, la parte del intérprete de comandos que no se ha reescrito reinicia la ejecución. Primero recarga el resto del intérprete de comandos desde el disco. Luego, el intérprete de comandos proporcionará el código de error anterior al usuario o al siguiente programa.

FreeBSD (derivado de Berkeley UNIX) es un sistema multitarea. Después de que el usuario inicia sesión en el sistema, el shell seleccionado por el usuario comienza a ejecutarse. Este shell es similar al shell de MS-DOS: de acuerdo con los requisitos del usuario, acepte comandos y ejecute programas. Sin embargo, dado que FreeBSD es un sistema multitarea, el intérprete de comandos se puede ejecutar en otro programa (Figura 2).

FreeBSD ejecuta múltiples programas
Inserte la descripción de la imagen aquí
Figura 2 FreeBSD ejecuta múltiples programas

Para iniciar un nuevo proceso, el shell ejecuta la llamada al sistema fork (). Luego, el programa seleccionado se carga en la memoria a través de la llamada al sistema exec (), y el programa comienza a ejecutarse. Dependiendo de cómo se ejecute el comando, el shell esperará a que se complete el proceso o ejecutará el proceso en segundo plano. En el último caso, el shell puede aceptar inmediatamente el siguiente comando. Cuando el proceso se ejecuta en segundo plano, no puede aceptar directamente la entrada del teclado porque el shell ya está usando el teclado. Entonces, la E / S se puede hacer a través de archivos o GUI.

Al mismo tiempo, el usuario puede dejar que el shell ejecute otros programas, monitorear el estado del proceso en ejecución, cambiar la prioridad del programa, etc. Cuando finaliza el proceso, ejecuta la llamada al sistema exit () para finalizar y devuelve un código de error 0 o no cero al proceso de llamada. Este código de estado (o error) se puede usar para shells u otros programas. Los capítulos posteriores analizarán el proceso a través de un programa de ejemplo que utiliza llamadas al sistema fork () y exec ().

Gestión de documentos

A continuación, analizamos algunas llamadas comunes al sistema relacionadas con los archivos.

Lo primero es poder crear (crear ()) y eliminar (eliminar ()) archivos. Estas dos llamadas al sistema requieren el nombre del archivo y también pueden requerir algunos atributos del archivo. Una vez creado el archivo, se abrirá (open ()) y se usará. También leerá (read ()), write (write ()) o reposition (reposition ()) (por ejemplo, volver al principio del archivo o Salta directamente al final del archivo). Finalmente, debe cerrar (cerrar) el archivo, lo que indica que ya no se usa.

Si la estructura del directorio se utiliza para organizar los archivos del sistema de archivos, se necesitarán las mismas operaciones de directorio. Además, ya sea un archivo o un directorio, es necesario poder leer o establecer los valores de varios atributos. Los atributos del archivo incluyen: nombre del archivo, tipo de archivo, código de protección, información contable, etc.

Para esta función, se requieren al menos dos llamadas al sistema: obtener los atributos del archivo (get_file_attributes ()) y establecer los atributos del archivo (set_file_attributes ()). Algunos sistemas operativos también proporcionan otras llamadas al sistema, como mover archivos (mover ()) y copiar (copiar ()). Otros sistemas operativos usan código o llamadas al sistema para realizar estas funciones API. Otros sistemas operativos pueden implementar estas funciones a través de programas del sistema. Si otros programas pueden llamar a los programas del sistema, estos programas del sistema son equivalentes a las API.

Gestión de equipos

La ejecución del proceso requiere algunos recursos, como memoria, unidades de disco y archivos necesarios. Si hay recursos disponibles, el sistema puede permitir la solicitud y transferir el control al programa del usuario; de lo contrario, el programa debería esperar hasta que haya suficientes recursos disponibles.

Varios recursos controlados por el sistema operativo pueden considerarse dispositivos. Algunos dispositivos son dispositivos físicos (como unidades de disco), mientras que otros pueden usarse como dispositivos abstractos o virtuales (como archivos). Los sistemas multiusuario requieren que primero se solicite el dispositivo (request ()) para garantizar el uso específico del dispositivo. Después de que el dispositivo se haya agotado, se debe liberar (liberar). Estas funciones son similares a las llamadas al sistema de archivos open () y close (). Otros sistemas operativos no administran el acceso al dispositivo. El daño causado por esto es la contención potencial del dispositivo y el posible punto muerto, que se discutirá en capítulos posteriores.

Después de solicitar el dispositivo (y obtenerlo), puede leer (leer ()), escribir (escribir ()) y reposicionar (reposicionar ()) el dispositivo como lo haría con un archivo. De hecho, los dispositivos y archivos de E / S son tan similares que muchos sistemas operativos como UNIX combinan los dos en una estructura de dispositivo de archivo. De esta forma, se utiliza un conjunto de llamadas al sistema no solo para archivos sino también para dispositivos. A veces, los dispositivos de E / S pueden identificarse mediante nombres de archivo especiales, ubicaciones de directorio o atributos de archivo.

La interfaz de usuario puede hacer que los archivos y dispositivos se vean similares, incluso si las llamadas internas del sistema son diferentes. Esto también debe tenerse en cuenta al diseñar y construir sistemas operativos e interfaces de usuario.

Mantenimiento de la información

Muchas llamadas al sistema solo se utilizan para transferir información entre el programa de usuario y el sistema operativo. Por ejemplo, la mayoría de los sistemas operativos tienen una llamada al sistema para devolver la hora actual (hora ()) y la fecha (fecha ()). Otras llamadas del sistema pueden devolver otra información sobre el sistema, como el número actual de usuarios, la versión del sistema operativo, la memoria o el disco disponible, etc.

También hay un conjunto de llamadas al sistema para ayudar a depurar el programa. Muchos sistemas proporcionan llamadas de sistema para volcar memoria (dump ()). Esto es útil para la depuración. El seguimiento del programa puede enumerar todas las llamadas al sistema durante la ejecución del programa. Incluso el microprocesador tiene un modo de CPU, llamado paso único (paso único), es decir, la CPU genera una trampa cada vez que ejecuta una instrucción. El depurador generalmente puede atrapar estas trampas.

Muchos sistemas operativos proporcionan un perfil de tiempo del programa, que se utiliza para representar el tiempo de ejecución en una ubicación específica o combinación de ubicaciones. La curva de tiempo necesita una función de seguimiento o una interrupción de tiempo fijo. Cuando se produce una interrupción temporizada, se registrará el valor del contador del programa. Si hay suficiente interrupción frecuente, puede obtener las estadísticas del tiempo empleado en varias partes del programa.

Además, el sistema operativo mantiene información sobre todos los procesos, a los que se puede acceder mediante llamadas al sistema. En general, también puede usar las llamadas al sistema para restablecer la información del proceso (get_process_attributes () y set_process_attributes ()).

Comunicación

Existen dos modelos comunes para la comunicación entre procesos: el modelo de mensajería y el modelo de memoria compartida.

Para el modelo de paso de mensajes, el proceso de comunicación comunica información mediante el intercambio de mensajes entre sí. El intercambio de mensajes entre procesos puede realizarse directa o indirectamente a través de un buzón común. Antes de comenzar la comunicación, se debe establecer una conexión. Debe conocer el nombre de otra entidad de comunicación, puede ser otro proceso del mismo sistema, o puede ser un proceso de otra computadora conectada a través de la red.

Cada computadora de red tiene un nombre de host (nombre de host), que es bien conocido. Además, cada host también tiene un identificador de red, como una dirección IP. Del mismo modo, cada proceso tiene un nombre de proceso (nombre de proceso), que generalmente puede convertirse en un identificador para referencia del sistema operativo. El sistema llama a get_hostid () y get_processid () puede realizar este tipo de conversión. Estos identificadores se pasan a las llamadas generales del sistema open () y close () (proporcionadas por el sistema de archivos), o el sistema dedicado llama a open_connection () y close_connection (), según el modelo de comunicación del sistema.

El proceso de aceptación debe permitir la comunicación a través de la llamada al sistema accept_connection (). La mayoría de los procesos que pueden aceptar conexiones son demonios dedicados, es decir, programas de sistema dedicados. Ejecutan la llamada al sistema wait_for_connection () y se despertará cuando haya una conexión. La fuente de comunicación se llama cliente y el programa de fondo receptor se llama servidor. Intercambian mensajes a través de las llamadas al sistema read_message () y write_message (). La llamada al sistema close_connection () finaliza la comunicación.

Para el modelo de memoria compartida, el proceso utiliza las llamadas del sistema shared_memory_create () y shared_memory_attach () para crear memoria compartida y acceder a áreas de memoria propiedad de otros procesos.

Tenga en cuenta que el sistema operativo generalmente necesita evitar que un proceso acceda a la memoria de otro proceso. La memoria compartida requiere que dos o más procesos acuerden eliminar esta restricción, de modo que puedan intercambiar información leyendo y escribiendo datos en el área compartida. El tipo de estos datos está determinado por estos procesos y no está controlado por el sistema operativo. El proceso también es responsable de garantizar que no escriba en el mismo lugar al mismo tiempo.

Los dos modelos discutidos anteriormente se usan comúnmente en sistemas operativos, y la mayoría de los sistemas implementan ambos. La mensajería es útil para el intercambio de pequeñas cantidades de datos porque no hay conflictos que evitar. También es más fácil de implementar que la memoria compartida utilizada entre computadoras. La memoria compartida tiene las características de alta velocidad y conveniencia en la comunicación, porque cuando la comunicación ocurre en la misma computadora, se puede llevar a cabo a la velocidad de transmisión de la memoria. Sin embargo, el proceso de memoria compartida tiene problemas con la protección y la sincronización.

Proteger

La protección proporciona un mecanismo para controlar el acceso a los recursos del sistema informático. En el pasado, solo los sistemas informáticos multiusuario con múltiples usuarios debían considerarse para la protección. Con el advenimiento de Internet e Internet, todas las computadoras (desde servidores hasta dispositivos móviles de mano) deben considerarse para protección.

En general, las llamadas al sistema que proporcionan protección incluyen set_permission () y get_permission (), que se utilizan para establecer permisos para recursos (como archivos y discos). Las llamadas al sistema allow_user () y deny_user () se utilizan para permitir y denegar el acceso de usuarios específicos a ciertos recursos, respectivamente.

Publicó 38 artículos originales · ganó 11 · visitó 3832

Supongo que te gusta

Origin blog.csdn.net/qq_43721475/article/details/104863454
Recomendado
Clasificación