Tipos de llamadas al sistema y programas de sistema

De Departamento de Informatica
Saltar a: navegación, buscar

Contenido

Introducción

Los tipos de llamadas a sistema se pueden agrupar en seis categorías: Control de procesos, manipulación de archivos, manipulación de dispositivos, mantenimiento de información, comunicación y protección. Junto con las llamadas a sistema también existen aplicaciones de sistema, también conocidas como utilerías del sistema, las aplicaciones del sistema se encuentran entre el sistema operativo y las aplicaciones de usuario.

Primero hablaremos de los tipo de llamadas a sistema y posteriormente sobre los tipo de aplicaciones de sistema. Para ser concretos nos sentaremos en las llamadas implementadas en los sistemas tipo UNIX.

Llamadas a sistema

Control de procesos

Las llamadas a sistema relacionadas con el control de proceso tienen que ver con la creación, terminación y control de un proceso. También la asignación y liberación de memoria, requerida y liberada respectivamente por un proceso.

fork()

Para crear un nuevo proceso en los sistemas UNIX esta es la forma de hacerlo, el resultado de esta operación es la duplicación exacta del proceso que realiza esta llamada, la llamada de esta función devuelve el PID del proceso hijo en el padre y cero en el hijo:

Ejemplo:

pid_t pid;
//....
pid=fork();
if (pid==-1) 
{
   perror("Error");
   exit(-1)
}
if (pid==0)
{
   //código del proceso hijo ....
}
else
{
   //.... código del proceso padre ....
}

exec()

Otra llamada al sistema es la carga (load) de un proceso, en los sistemas UNIX esto se logra con la llamada al sistema exec(), el resultado de esta operación es la transformación completa del la imagen del proceso por la imagen del proceso que se desea cargar, es decir el proceso se "transforma" en otro proceso, cabe notar que bajo esta operación el PID el proceso cargado mantiene su PID, esto es por que no se crea un nuevo proceso, solo se transforma.

ejemplo:

main()
{
    if ( exec("/usr/bin/loquesea",NULL,NULL) == -1 ) 
       procesa_error_ejecucion();
}

Si no hay errores en esta llamada, main en tiempo de ejecución se transformará en el proceso "loquesea"


exit()

estado de terminación del proceso. Se usa para que el proceso padre conozca la forma en que finaliza un hijo. Puede ser cualquier tipo de entero, pero se suelen usar las macros: EXIT_FAILURE y EXIT_SUCCESS. exit(), cierra ficheros, vacía bufferes.

wait()

Permite a un proceso padre esperar hasta que termine un proceso hijo. El entero apuntado por el argumento status será actualizado con un código que indica el estado de terminación del proceso hijo. Devuelve el identificador del proceso hijo ó -1 en caso de error.


Manipulación de archivos

El UNIX proporciona un conjunto de llamadas al sistema para la manipulación de archivos. Todas las aplicaciones o utilidades que en UNIX trabajan con archivos están fundamentadas en estos servicios básicos. La biblioteca estándar de C dispone de un conjunto de funciones para utilizar directamente estas llamadas al sistema, proporcionando al programador la misma visión que sobre los recursos tiene el sistema operativo UNIX.

El manejo de archivos en UNIX sigue el modelo de la sesión. Para trabajar con un archivo hay primero que abrirlo con una invocación a la función open. Ésta devuelve un descriptor de archivo (file descriptor en inglés), un número entero que servirá de identificador de archivo en futuras operaciones. Finalmente hay que cerrar el archivo, con la función close, para liberar los recursos que tengamos asignados.

Existen al menos tres descriptores ya establecidos en la ejecución de un programa (ya los han abierto por nosotros). El descriptor 0 es la entrada estándar (normalmente el teclado), el descriptor 1 es la salida estándar (normalmente la pantalla) y el descriptor 2 el archivo estándar de visualización de errores (también la pantalla, normalmente). Los pueden considerar como simples archivos que ya han sido abiertos, y pueden trabajar con ellos con cierta normalidad. Incluso los pueden cerrar.

Los archivos en UNIX permiten tanto el acceso directo como el secuencial. Cada archivo abierto dispone de un puntero que se mueve con cada lectura o escritura. Hay una función especial llamada lseek para posicionar ese puntero donde se quiera dentro del archivo.

Apertura, creación y cierre de archivos

  1. open()  : Abre un archivo ya existente, retornando un descriptor de archivo.
  2. creat()  : Si desean expresamente crear un archivo, disponen de la llamada creat.
  3. close()  : Para cerrar un archivo ya abierto está la función close
  4. unlink() : borra el archivo de ruta nombre (absoluta o relativa). Devuelve -1 en caso de error.
  5. read()  : Lee desde un archivo previamente abierto.
  6. write()  : Escribe sobre un archivo previamente abierto.
  7. lseek()  : El C y UNIX manejan archivos secuenciales. Es decir, conforme se va leyendo o escribiendo, se va avanzando en la posición relativa dentro del archivo. El acceso directo a cualquier posición dentro de un archivo puede lograrse con esta función.

Ejemplos:


main( int argc, char* argv[] ) { /* Cadena que se va a escribir */

  const char* cadena = "Hola, mundo";
  /* Creación y apertura del archivo */
  int archivo = open ("mi_archivo", O_CREAT|O_WRONLY,0644);
  /* Comprobación de errores */
  if (archivo==-1)
  {
       perror("Error al abrir archivo:");
       exit(1);
  }
  /* Escritura de la cadena */
  write(archivo, cadena, strlen(cadena));
  close(archivo);
  return 0;

}

Manipulación de dispositivos

mantenimiento de información

Comunicación

Los modelos más comunes involucrados en la comunicación entre procesos son el modelo de paso de mensajes y el modelo de memoria compartida.

Modelo de paso de mensajes

Los procesos involucrados intercambian mensajes entre sí para transferirse información, pudiendo intercambiar estos mensajes de forma directa o indirecta a través de un buzón de correo común. Debe haber conocimiento previo del nombre del otro comunicador, ya sea otro proceso del mismo sistema o también un proceso de otro computador conectado a la red de comunicaciones, notando que cada computador tiene un nombre de host, el cual tiene un identificador de red (como por ejemplo, una IP), el que se obtiene mediante la llamada al sistema get hostid. Asimismo, cada proceso tiene un nombre de proceso, el que se traduce en un identificador por el cual el sistema operativo hace referencia a éste, donde dicho identificador se obtiene mediante la llamada al sistema get processid.

Luego de obtener los identificadores, se pueden pasar a las llamadas open y close, o open connection y close connection dependiendo del modelo de comunicación del sistema.

Por lo general, el proceso receptor (mayormente de propósito especial) es el que debe dar el permiso para aceptar la comunicación, con la llamada accept connection. Cabe notar que, los procesos denominados especiales, se conocen como demonios, y corresponden a programas del sistema que se suministran sólo para cierto proceso en particular.

Luego, la comunicación entre cliente y servidor (emisor y receptor respectivamente), intercambian mensajes mediante las llamadas al sistema read message y write message, finalizando el intercambio de mensajes al terminar la conexión con close connection.

Modelo de memoria compartida

Los procesos que utilizan este modelo de comunicación, usan las llamadas al sistema shared memory create y shared memory attach, las cuales sirven para crear y obtener acceso a zonas de la memoria que son propiedad de otros procesos. Así, el intercambio de mensajes se realiza a través de la lectura y escritura de datos en estas áreas de la memoria compartida, donde tanto la forma como la ubicación de los datos la determinan los procesos y no están bajo el control del sistema operativo (notando que normalmente el sistema operativo intenta evitar que un proceso acceda a la memoria de otro proceso). Cabe notar que, nuevamente, los mismos procesos son los responsables de asegurarse que éstos no escriban simultáneamente en las mismas posiciones.

La mayoría de los sistemas operativos implementan los dos modelos de comunicación mencionados, ya que el modelo de paso de mensajes es de utilidad para realizar intercambio de cantidades pequeñas de datos (ya que no hay posibilidad de que ocurran conflictos, y es más fácil de implementar), mientras que el modelo de memoria compartida permite realizar una comunicación a máxima velocidad (a velocidad de memoria cuando dichos procesos se encuentran en el mismo computador), aunque presenta problemas de protección y sincronización entre los procesos que comparten la memoria.

Protección

Cuando se ejecutan varios programas de forma paralela se debe proteger a uno de los programas de la acción de los demás, como por ejemplo no se puede permitir que un programa pueda modificar posiciones de memoria principal donde se almacena otro programa, o tampoco que algún usuario elimine archivos de otro usuario.

Programas de sistema

En la jerarquía lógica de un computador, los programas de sistema se encuentran entre el sistema operativo, y los programas de aplicaciones, proporcionando un entorno cómodo para el desarrollo y ejecución de programas, teniendo desde simples interfaces de usuario para llamadas al sistema hasta programas bastante complejos.

Los programas de sistema pueden dividirse en:

Administración de archivos

Estos programas son los encargados de la manipulación de archivos y directorios, donde dicha manipulación puede ser entendida como la creación, borrado, copiado, cambio de nombre, impresión, volcado y listado.

Información de estado

Estos programas entregan información tan simple como la fecha, cantidad de memoria o de espacio disponible, o el número de usuarios, hasta datos tan complejos como información detallada sobre el rendimiento y mecanismos de depuración.

Por lo general, estos programas formatean los datos de salida y los envian a otros archivos de salida, o al terminal, o incluso a veces presentan estos datos en una ventana de la GUI. Así, algunos sistemas soportan también un registro, el cual es utilizado para almacenar y recuperar información de configuración.

Modificación de archivos

En un sistema se pueden tener varios editores de texto para la creación o modificación de contenido de archivos almacenados en el disco o en otros dispositivos de almacenamiento. Asimismo, también pueden haber varios comandos especiales para realizar la exploración de contenido en archivos para buscar algún dato en particular o realizar cambios en el texto.

Soporte de lenguajes de programación

Con frecuencia se pueden encontrar sistemas operativos que proporcionan al usuario compiladores, ensambladores, depuradores e intérpretes para los lenguajes de programación habitual, como por ejemplo C, C++, Java.

Carga y ejecución de programas

Una vez que cierto programa se ha ensamblado o programado, se debe cargar en memoria para poder ser posteriormente ejecutado. El sistema puede proporcionar cargadores absolutos, reubicables, editores de montaje y cargadores de sustitución. Así como también son necesarios sistemas de depuración para lenguajes de alto nivel o para lenguaje máquina.

Comunicaciones

Estos programas son los que proporcionan mecanismos para la creación de conexiones virtuales entre procesos, usuarios y computadoras, permitiendo que el usuario pueda enviar mensajes a las pantallas de otros, o navegar por la web, enviar mensajes de correo electrónico o transferir archivos de forma remota.

Además de los tipos de programas presentados, la mayoría de los sistemas operativos cuentan con programas destinados a resolver problemas comunes o a realizar operaciones frecuentes, este tipo de programas se conoce como utilidades del sistema o programas de aplicación, como navegadores web, editores de texto o incluso juegos.

Lo que el usuario ve del sistema operativo, está definido por los programas del sistema y de aplicación, donde se puede ver una interfaz gráfica que se controla mediante el mouse, o alternativamente se puede trabajar mediante una línea de comandos, notando que ambos tipos de interfaz utilizan el mismo conjunto de llamadas al sistema, con la diferencia que parecen diferentes y actúan de forma diferente.

Referencias

  1. Fundamentos de sistemas operativos. A. Silberschatz, P.B. Galvin, G. Gagne, McGraw-Hill, 2006.
  2. Operating Systems. I.A. Dhotre, Technical Publications, 2009.
  3. Sistemas operativos modernos. A.S. Tanenbaum, Prentice Hall, 2003.
Herramientas personales
Espacios de nombres
Variantes
Acciones
Navegación
Herramientas