TEMA 2. GESTIÃN DE PROCESOS - Universidad de AlmerÃa
TEMA 2. GESTIÃN DE PROCESOS - Universidad de AlmerÃa
TEMA 2. GESTIÃN DE PROCESOS - Universidad de AlmerÃa
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Diseño <strong>de</strong> Sistemas Operativos<br />
Tema <strong>2.</strong> Gestión <strong>de</strong> Procesos<br />
<strong>2.</strong>9.5. Funciones <strong>de</strong> Tiempo.<br />
En este apartado vamos a dar una introducción al estudio <strong>de</strong> cómo consultar y controlar los tiempos<br />
asociados a un proceso. Si bien UNIX, no es un sistema para aplicaciones en tiempo real, en condiciones <strong>de</strong><br />
baja carga don<strong>de</strong> no está congestionado podremos imponerle a nuestros programas que se ejecuten con los<br />
tiempos <strong>de</strong> respuesta a<strong>de</strong>cuados. Hay que tener en cuenta que una respuesta en tiempo real no significa<br />
solamente que nuestro programa se ejecute muy rápido (para simular procesos físicos), sino también que<br />
seamos capaces <strong>de</strong> controlar el tiempo para dar la respuesta en el momento exacto y no antes (por ejemplo,<br />
un programa para simular un reloj, en don<strong>de</strong> nuestra respuesta se tiene que dar cada segundo, <strong>de</strong> nada nos<br />
vale darla más <strong>de</strong>prisa).<br />
A continuación se van a enumerar brevemente los mecanismos para dotar a nuestros programas <strong>de</strong> una<br />
temporización que va a estar impuesta por la naturaleza física <strong>de</strong>l proceso que intentamos simular.<br />
• Lectura <strong>de</strong> la fecha <strong>de</strong>l sistema. stime().<br />
• Fijar la fecha <strong>de</strong>l sistema. time(), gettimeofday() y settimeofday().<br />
• Tiempos <strong>de</strong> ejecución asociados a un proceso. times().<br />
• Temporizadores. alarm(), getitimer(), setitimer() y localtime().<br />
<strong>2.</strong>9.6. Señales en Linux.<br />
La gestión <strong>de</strong> señales es un mecanismo existente <strong>de</strong>s<strong>de</strong> las primeras versiones <strong>de</strong> UNIX. Permite a los<br />
procesos reaccionar a los eventos provocados por ellos mismos o por otros procesos, siendo este mecanismo<br />
similar a la gestión <strong>de</strong> interrupciones lógicas. La semántica <strong>de</strong> las llamadas al sistema que gestionan las<br />
señales en Linux es la <strong>de</strong> la norma POSIX. Sin embargo, la gestión <strong>de</strong> las señales existía en los sistemas<br />
UNIX mucho antes <strong>de</strong> la <strong>de</strong>finición <strong>de</strong> esta norma, por lo que existe un cierto número <strong>de</strong> llamadas al sistema<br />
no POSIX <strong>de</strong>finidas a este efecto. Estas llamadas al sistema aparecieron en las dos clases <strong>de</strong> sistemas UNIX,<br />
System V y BSD. En ocasiones tienen los mismos nombres pero semánticas diferentes. A fin <strong>de</strong> ser lo más<br />
completo posible y permitir la portabilidad <strong>de</strong> un mayor número <strong>de</strong> programas, Linux implementas diferentes<br />
semánticas. En principio, se utiliza la semántica <strong>de</strong> System V pero la inclusión <strong>de</strong>l archivo <strong>de</strong> cabecera<br />
bsd/signal.h en lugar <strong>de</strong> signal.h en el momento <strong>de</strong> la compilación <strong>de</strong> programas y ocasionalmente la<br />
inclusión <strong>de</strong> la librería libbsd.a en el momento <strong>de</strong>l linkado (enlazado) les permite respetar la semántica <strong>de</strong> los<br />
sistemas BSD.<br />
Emisión <strong>de</strong> una señal a un proceso o a un grupo <strong>de</strong> procesos.<br />
int kill(pid_t pid, int sig);<br />
int killpg(int pgrp, int sig);<br />
int raise(int sig); Esta función es equivalente a kill(getpid(), sig);<br />
Desviación <strong>de</strong> una señal, modificando el comportamiento pre<strong>de</strong>terminado <strong>de</strong> una señal.<br />
void (*signal(int signum, void (*handler) (int))) (int);<br />
Espera <strong>de</strong> una señal, suspendiendo el proceso que llama hasta la llegada <strong>de</strong> una señal cualquiera.<br />
int pause(void);<br />
Los grupos <strong>de</strong> señales. Es posible suspen<strong>de</strong>r o bloquear varias señales simultáneamente, siendo necesario<br />
que las señales sean gesionadas por grupo<br />
int sigemptyset(sigset_t *set);<br />
int sigfillset(sigset_t *set);<br />
int sigaddset(sigset_t *set, conts int signum);<br />
int sig<strong>de</strong>lset(sigset_t *set, conts int signum);<br />
int sigismember(conts sigset_t *set, conts int signum);<br />
Interrupción <strong>de</strong> las llamadas al sistema.<br />
int siginterrupt(int sig, int flag);<br />
Departamento <strong>de</strong> Lenguajes y Computación. <strong>Universidad</strong> <strong>de</strong> Almería Página <strong>2.</strong>58