Sistemas Operativos: Llamadas al sistema, sistemas de archivos, gestión de procesos y sockets

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 16,72 KB

6. Llamadas al API del sistema

Las llamadas al API del sistema hacen de intermediario entre usuario y kernel (que contiene ficheros, procesos, red y drivers de hardware). La programación para usar ese API sigue algunos estándares:

  • ISO-C: estándar del ANSI y posteriormente ISO.
  • POSIX (Portable Operating System Interface): derivado de algunas versiones de UNIX, superconjunto de ANSIC, al cual extiende. Ofrece soporte de bajo nivel a SO, pero sin lenguaje de programación.
  • Berkeley UNIX (BSD): la mayoría soportan IOS y POSIX, contribuye con symbol-link, sockets, select…
  • System V (SV): superconjunto de POSIX, su funcionalidad más importante es comunic. entre procesos
  • GNU: SO tipo UNIX de software libre con licencia GNU GPL.

El programador no ve diferencia pero, una llamada librería (3) no interacciona directamente con el kernel, pero las llamadas al sistema (2) sí (trap). Las primeras sí requieren reserva de espacio en los parámetros. man [seccion] [-k] función- páginas del manual para una función dada, secciones 2 y 3 para kernel y librería respectivamente, y -k para buscar. Una vez dentro, usar / para buscar palabras y q para salir.

  • Llamadas al sistema: man 2, ejecución usuario/kernel, no se reserva espacio para parámetros y código error -1 + errno.
  • Llamadas a librerías: man 3, ejecución usuario, espacio dinámico/estático y NULL + no errno

*perror(2) - informa del error de la última llamada del sistema, que devuelve -1 por convenio al fallar strace(1) - intercepta las llamadas al SO en un comando uname(2) - da información sobre el kernel *sysconf(3) - da información sobre el SO, limitaciones del sistema pathconf(3) / fpathconf(3) - da info. y limitaciones del path *getuid(2) / getgid(2) / geteuid(2) / getegid(2) - obtener el usuario/grupo del proceso setuid(2) - modificar el usuario efectivo *getpwnam(3) / getpwuid(3) - da info. del usuario según su nombre o id *time(2) / gettimeofday(2) / settimeofday(2) - da info. sobre la hora y fecha del sistema *ctime(3) / gmtime(3) / localtime(3) - da info. formateada sobre hora y fecha del sistema strftime(3) - convierte la info de la hora al formato deseado al detalle id(1) - información sobre los uid actuales

EXAMEN *UID real: es el UID del usuario (al que pertenece un proceso)*UID efectivo: es, normalmente, igual al UID real excepto cuando ejecutamos un programa SetUID (programa que cambia su UID, el cual normalmente es el mismo que el del usuario que lo ejecuta)

7. SISTEMAS DE FICHEROS

Desde el punto de vista de usuario son ficheros y directorios para guardar y organizar información Desde el SO, es un conjunto de tablas y estructura que los gestionan. Tipos de sistemas de ficheros:

  • Sistemas de ficheros basados en disco: Implementados en disco duro, FAT, NTFS, ISO9660, ufs..
  • SF basados en red: Acceder a sistemas de ficheros remotos. NFS
  • SF basados en RAM:Residen en la mem. Principal mientras el SO se ejecuta. proc, tmpfs… /// Las llamadas al SO son independientes del sistema de ficheros.

El sistema ext2 (inspirado en FFS de BSD), se compone de grupos de bloques de datos, que están cerca de sus i-nodos, y los i-nodos a su vez cerca del directorio de i-nodos. Los primeros bloques son: superbloq ue (info de la partición), descriptores de grupo, mapa de bloques, mapa de i-nodos, tabla de i-nodos, y bloques de datos. // Journaling: cuando un sistema ext2 no se apaga bien, el SO debe comprobar la integridad (fsck), una tarea costosa que recorre todos los i-nodos y a veces irreparable.

Los sistemas modernos llevan un archivo de bitácora (journal) que evita la corrupción de datos. Los cambios se escriben primero ahí, y en caso de apagado brusco, se puede consultar para recuperar el estado coherente. Los sistemas ext3-4 ya incluyen esta técnica. Dependiendo del uso, hay 3 variantes: *Writeback mode: sólo se almacena los metadatos, y los bloques se escriben inmediatamente. Previene la corrupción, pero puede haber pérdidas de datos si el fallo se produce entre escritura de datos y bitácora. *Ordered mode: primero se escribe datos en disco, y luego el bitácora. Garantiza así la coherencia. *Data mode: se guardan en bitácora metadatos y datos, mayor protección pero degrada el rendimiento.

*open(2) - abre archivos umask(2) - establece la máscara de permisos para apertura de archivos, permisos = mode & (~ umask) stat(2) - da info. sobre archivos (desde el i-nodo), contiene una serie de macros para el st_mode: S_ISLNK, S_ISREG, S_ISDIR… para ver qué es, y para permisos: S_IRWXU… (buscar en man) chmod(2) - modifica los permisos sobre un archivo *access(2) - comprueba los permisos sobre un archivo, falla cuando no tienes algún permiso a comprobar dup(2) - duplica un descriptor de fichero *write(2) / read(2) / lseek(2) - sirve para escribir, leer y recorrer un fichero close(2) - cierra y libera un fichero abierto *fsync(2) - sincroniza explícitamente los cambios en un fichero abierto *link(2) - hace un hard link (mismo i-nodo) de un archivo, solo válido en el mismo sistema de ficheros symlink(2) - hace un enlace simbólico a un archivo readlink(2) - lee el contenido de un enlace simbólico *unlink(2) - elimina el archivo del directorio, decrementando el contador de refs. y potencialmente borra fcntl(2) - operaciones de control sobre un fichero abierto, sirve para hacer cerrojos (ver F_GETLK) flock(2) - aplica o elimina un cerrojo (de lectura o escritura) sobre un archivo *opendir(2) / readdir(2) / closedir(2) - para abrir, recorrer y cerrar un directorio mkdir(2) / rmdir(2) - para crear o eliminar directorios rename(2) - renombra o mueve un archivo *ls(1) - para consulta general de archivos y directorios (opciones interesantes: -a -l -d -h -i -R -1 -F y --color) ln(1) - para la creación de enlaces simbólicos

Obtener major y minor (stat): macros MAJOR y MINOR (#include ) sobre st_rdev

7. GESTIÓN DE PROCESOS

. Un programa es un conjunto de instrucciones código máquina y datos, guardados en un ejecutable en disco.  

Planificador es un algoritmo del kernel que determina el orden ejecución de los procesos, en función de prioridades estáticas y dinámicas del proceso. El SO es expropiativo con procesos de usuario.

Políticas de planificación: * SCHED_OTHER: estándar, prioridad estática 0, la dinámica se determina con el nice del proceso. · SCHED_FIFO: estática >0, expropia a los de 0 * SCHED_RR: como FIFO pero con Round Robin   

El planificador realmente maneja threads, en programas multi-thread, las llamadas tienen su equiv. pthread

fork(2) - duplica un proceso en relación padre-hijo chrt(1) - permite cambiar a real-time un proceso *sched_getscheduler(2) / sched_setscheduler(2) - manipula o lee el planificador de un proceso (0 el actual) sched_setparam(2) / sched_getparam(2) - manipula o lee la prioridad de un proceso (0 el actual) sched_get_priority_max(2) / sched_get_priority_min(2) - obtener los límites de la prioridad estática*getpriority(2) / setpriority(2) / nice(1) / renice(1) - consultar y fijar la prioridad de un proceso getpid(2) / getppid(2) / setpgid(2) / getpgid(2) - consultar pid o consultar/establecer un gid setsid(1,2) / getsid(2) - obtiene o establece nueva id. de la sesión *getrlimit(2) / setrlimit(2) - obtiene o modifica los límites de los recursos del sistema *getrusage(2) / times(2) - obtiene el uso que se hace del sistema en tiempo, por parte del padre e hijos getcwd(3) / chdir(2) - obtiene el directorio de trabajo, y el segundo lo cambia getenv(3) / setenv(3) - obtiene/modifica variables de entorno *system(3) - ejecuta un comando en la shell del sistema, bloquea el proceso hasta que retorne *exec(3) - ejecuta un programa en el proceso actual, siendo sustituido, 1er arg: programa, último: NULL *_exit(2) / exit(3) - termina un proceso *wait(2) - espera a la terminación de algún hijo y libera sus recursos asociados *ps(1) - da info. sobre los procesos (buscar en man STANDARD FORMAT SPECIFIERS)

Las señales son interrupciones software asíncronas, son generadas por procesos. Los procesos que la reciben las pueden bloquear, ignorar, invocar una rutina de tratamiento por defecto o propia. Señales:

sección de Standard Signals en man 7 signal. Se debería usar variables volatile en las variables modificadas en las rutinas de tratamiento de señales.

*kill(1,2) / raise(3) / abort(3) - envía una señal a un proceso, así mismo o aborta el proceso (abort) sigemptyset(3) / sigfillset(3) / sigaddset(3) / sigdelset(3) / sigismember(3) - trata grupos de señales sigprocmask(2) - bloquea/desbloquea señales en el proceso sigpending(2) - comprobación de señales pendientes sigaction(2) - modifica y consulta el manejador para una señal sigsuspend(2) - espera a una señal (y ejecuta el manejador de la misma) sleep(1,3) - esperar un tiempo concreto *alarm(2) - lanzará SIGALARM dentro de una cantidad concreta de segundos *getitimer(2) / setitimer(2) - interactúa con otros temporizadores (SIGVTALRM, SIGPROF)  

TUBERÍAS *Mecanismos de sincronización… … entre procesos/hilos del mismo sistema: señales, ficheros con cerrojo, mutex, semáforos, mensajes IPC. … entre procesos de distintos sistemas: sockets (paso y cola de mensajes). *Compartición de datos entre procesos… … del mismo sistema: memoria compartida, tuberías con/sin nombre, cola de mensajes, basados en ficheros. … de distintos sistemas: sockets.

Tuberías sin nombre: comunicación unidireccional entre dos procesos, son como ficheros (tiene descriptores, operaciones de E/S típica, heredadas de padres a hijos). La sincronización la realiza el kernel, acceso de tipo FIFO y reside en memoria principal. Se crea con: pipe(2) - crea una tubería.

Tuberías con nombre: ya que las tuberías sin nombre se realizan solo entre procesos con relación de parentesco, las que tienen nombre se usan entre cualquier proceso y son como un tipo de archivo especial. Funcionan como las tuberías sin nombre, pero se abren con open y sólo usan los bloques directos del i-nodo.

mknod(1,2) / mkfifo(1,3) - crean tuberías con nombre (usar O_NONBLOCK para no bloquearse en el open),     leer de tubería vacía sin escritor da 0 en read y escribir en tubería vacía sin lector en write da SIGPIPE select(2) - multiplexa canales de E/S de forma síncrona, espera hasta un evento o timeout   

8. SOCKETS . La comunicación entre cliente y servidores se denomina socket(enchufe). Permite un intercambio bidireccional. Cada aplicación (proceso) está identificada por un número de puerto. La APIs se basa en BSD Sockets API. Tipos de socket: *SOCK_STREAM: orientado a conexión, fiable, eliminación de mensajes duplicados (TCP), representa un flujo de bytes, full-duplex. Similar a una tubería, pero se envía SIG_PIPE cuando el otro extremo pierde la conexión. Utiliza: connect(2), recv(2), send(2), read(2), write(2). *SOCK_DGRAM: basado en datagramas sin conexión (UDP), no fiable y sin entrega ordenada, full-duplex. Envío y recepción con longitud fija. Utiliza: send(2), recv(2), sendto(2), recvfrom(2). *SOCK_RAW: permite acceder a interfaces internos de los protocolos de red no expuestos por la API.

Dominio y protocolo del socket. Los dominios son familias de protocolos que comparten una forma de direccionamiento: AF_UNIX, AF_INET, AF_INET6… y el protocolo lo suele determinar el tipo de socket.

Dual Stack, el mismo socket gestiona los 2 tipos de IP, se configura como in6addr_any y se desactiva IPV6_V6ONLY como opción de socket.

*inet_ntop(3) / inet_pton(3) - traduce direcciones formato texto ← → formato struct bind(2) - asocia un socket a una dirección IP y puerto *listen(2) - abre la escucha de un socket a una cantidad de clientes accept(2) - espera para aceptar una petición de conexión de cliente *connect(2) - crea un nuevo descriptor de fichero para la gestión de la nueva conexión aceptada send(2) / sendto(2) - sirve para enviar datos por un socket recv(2) / recvfrom(2) - sirve para recibir datos por un socket getaddrinfo(3) / getnameinfo(3) - traduce direcciones y hostname en/desde el struct sockaddr corresp.  

Entradas relacionadas: