Publicado el 14 de Enero del 2017
885 visualizaciones desde el 14 de Enero del 2017
164,2 KB
22 paginas
Creado hace 14a (21/02/2011)
UNIVERSIDAD
DE CANTABRIA
Bloque I: Principios de sistemas
operativos
Tema 1. Principios básicos de los sistemas operativos
Tema 2. Concurrencia
Tema 3. Ficheros
Tema 4. Sincronización y programación dirigida por eventos
Tema 5. Planificación y despacho
Tema 6. Sistemas de tiempo real y sistemas empotrados
Tema 7. Gestión de memoria
Tema 8. Gestión de dispositivos de entrada-salida
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
2
© Michael González, J. Javier Gutiérrez
21/feb/11
1
Notas:
UNIVERSIDAD
DE CANTABRIA
Tema 2. Concurrencia
• Introducción a la programación concurrente
• Creación e identificación de procesos.
• Ejecución de programas.
• Terminación de procesos y espera a la terminación.
• Threads: conceptos básicos
• Creación de threads y manipulación de sus atributos.
• Terminación de threads.
• Identificación de threads.
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
2
1. Introducción a la programación
concurrente
Muchos problemas se expresan de forma natural mediante varias
actividades concurrentes:
• sistemas de control atendiendo a múltiples subsistemas y
UNIVERSIDAD
DE CANTABRIA
eventos
• sistemas multicomputadores o distribuidos
• para el uso concurrente de múltiples recursos
La concurrencia implica prever la sincronización:
• para la utilización de recursos y datos compartidos
• y para el intercambio de eventos e información
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
3
UNIVERSIDAD
DE CANTABRIA
Definiciones
Un flujo de control o thread es una secuencia de instrucciones de
programa.
Un programa concurrente es aquel con múltiples flujos de control,
que generalmente cooperan entre sí.
Los flujos de control se llaman procesos, tareas, o threads,
dependiendo del contexto.
A veces, dos o más flujos de control requieren un orden particular
para sus operaciones: sincronización.
Para ejecutar un programa concurrente se necesita un planificador
que gestione cuándo se ejecuta cada flujo de control y qué
recursos del sistema pueden usar.
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
4
Ejemplo: Control de un Automóvil
Actividades a controlar:
UNIVERSIDAD
DE CANTABRIA
Medida de
Velocidad
C=4 ms.
T=20 ms.
D=5 ms.
Control de
Frenos ABS
C=10 ms.
T=40 ms.
D=40 ms.
Control de
Inyección
C=40 ms.
T=80 ms.
D=80 ms.
C = Tiempo de ejecución
T = Periodo
D = Plazo máximo de
finalización
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
5
Ejemplo: solución cíclica
Una solución cíclica implica partir la actividad más larga en varias
partes:
UNIVERSIDAD
DE CANTABRIA
76
0
4
VELOC
otras tareas sin requisitos temporales
4
F U E L -
12
64
VELOC
F
U
E
6
-3
L
60
54
ABS
VELOC
40
44
16
F U E L - 2
ABS
14
20
F
U
E
L
-1
6
VELOC
24
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
6
Ejemplo: solución concurrente
La solución concurrente es más fácil de diseñar y modificar:
UNIVERSIDAD
DE CANTABRIA
Medida de la velocidad
Control de frenos ABS
loop
Medida_Velocidad;
next:=next+0.02;
Sleep_until next;
end loop;
loop
Frenos_ABS;
next:=next+0.04;
Sleep_until next;
end loop;
Control de inyección
Actividades sin requisitos temporales
loop
Inyeccion_Fuel;
next:=next+0.08;
Sleep_until next;
end loop;
loop
hacer cálculos;
...
end loop;
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
7
Ejemplo: mantenimiento
Suponer que necesitamos ejecutar una actividad aperiódica que
tiene 1ms de tiempo de ejecución. El tiempo mínimo entre llegadas
es de 80 ms, pero el plazo es de 20 ms:
1. Solución cíclica:
UNIVERSIDAD
DE CANTABRIA
- Muestrear al menos cada 19 ms para ver si hay que ejecutar
- Esto implica partir ABS y FUEL en varios trozos cada uno
- No se necesitan modificaciones al código existente.
2. Solución concurrente:
planificabilidad
- Añadir un nuevo proceso con alta prioridad y repetir el análisis de
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
8
Declaración de procesos: soporte en el
lenguaje
Algunos lenguajes tienen instrucciones especiales para crear
procesos concurrentes:
• instrucción estructurada: cobegin, coend (Pascal Concurrente)
• instrucción de bifurcación: fork
• declaración de un objeto de la clase “proceso” en la parte
UNIVERSIDAD
DE CANTABRIA
declarativa del programa (Ada)
• creación dinámica de un objeto de la clase “proceso” (Java)
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
9
Declaración de procesos: soporte en el
sistema operativo
Cuando la concurrencia no está soportada en el lenguaje se
pueden usar servicios de un sistema operativo:
• operación de bifurcación: fork crea una copia del proceso
UNIVERSIDAD
DE CANTABRIA
padre; posteriormente la copia puede ejecutar otro programa
(exec)
• operación spawn: se crea un nuevo proceso concurrente que
ejecuta el programa o función indicados
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
10
Estados de un proceso
UNIVERSIDAD
DE CANTABRIA
Creado
No existente
Activo
Terminado
Opcional
Bloqueado
Ejecutando
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
11
2. Creación e identificación de
procesos
Identificador de proceso (pid):
• es un entero positivo que identifica a un proceso
Parentesco de procesos:
• el padre de un proceso es el proceso que lo creo
• los procesos creados por el padre son hijos de éste
UNIVERSIDAD
DE CANTABRIA
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
12
Estructura de un proceso en C
UNIVERSIDAD
DE CANTABRIA
Proceso de usuario
funciones del
usuario
función main
del usuario
Rutina C de
Inicialización
exec
Llamada
al sistema
Rutina C
exit
Rutina C
_exit
Kernel
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
13
Ejemplo de un programa C
UNIVERSIDAD
DE CANTABRIA
// El programa muestra en pantalla todos sus argumentos
#include <stdio.h>
int main (int argc, char *argv[])
{
int i;
// Print all the arguments
for (i=0;i<argc;++i)
{
printf("%s\n",argv[i]);
}
exit(0);
}
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
14
La llamada fork
La llamada fork crea un nuevo proceso (hijo) que es una copia
exacta del padre, excepto por lo siguiente:
• el pid del hijo es diferente
• el hijo tiene su propia copia de los descriptores de fichero, que
apuntan a las mismas descripciones de fichero que en el padre
UNIVERSIDAD
DE CANTABRIA
• el hijo no hereda:
- alarmas
-
- operaciones de I/O asíncronas
temporizadores
El hijo hereda el estado del padre (incluyendo el PC), sus
semáforos, objetos de memoria, política de planificación, etc.
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
15
La llamada fork (cont.)
Interfaz:
#include <sys/types.h>
#include <unistd.h>
pid_t fork (void);
UNIVERSIDAD
DE CANTABRIA
Retornos:
• fork devuelve al proceso hijo un cero
• fork devuelve al proceso padre el pid del hijo
• en caso de error, devuelve -1, no crea el hijo, y la variable errno
se actualiza al valor asociado al error
Llamadas para identificación del proceso:
pid_t getpid(void); pid_t getppid(void);
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
16
Ejemplo de uso de fork
UNIVERSIDAD
DE CANTABRIA
// El proceso crea un hijo; padre e hijo muestran pids
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t childpid;
if ((childpid=fork()) == -1) {
perror("can’t fork");
exit(1);
} else if (childpid == 0) {
// child process
printf("child: own pid = %d, parent pid = %d\n",
getpid(), getppid());
//the parent may be dead
exit(0);
} else {
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
17
Ejemplo de uso de fork (cont.)
UNIVERSIDAD
DE CANTABRIA
// parent process
printf("parent: own pid = %d, child pid = %d\n",
getpid(), childpid);
exit(0);
}
}
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
18
3. Ejecución de un programa: exec
La familia de llamadas exec sustituyen la imagen de proceso
actual por una nueva imagen de proceso, que se halla en un
fichero
Cuando la nueva imagen de proceso es un programa C, debe tener
la siguiente función:
UNIVERSIDAD
DE CANTABRIA
int main (int argc, char *argv[]);
Los parámetros corresponden a los argumentos en la llamada
Asimismo, la siguiente variable contiene un puntero a un array de
punteros que apuntan a los strings de entorno:
extern char **environ;
La llamada a exec sólo retorna en caso de error
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
19
UNIVERSIDAD
DE CANTABRIA
Ejecución de un fichero: exec (cont.)
Los descriptores de ficheros abiertos en el proceso original
continúan abiertos en el proceso nuevo, excepto aquellos que
tengan el flag FD_CLOEXEC habilitado
El nuevo proceso hereda:
• el pid y ppid del proceso original
• la política de planificación
• alarmas y señales pendientes
GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS
© Michael González, J. Javier Gutiérrez
21/feb/11
20
Las llamadas exec
UNIVERSIDAD
DE CANTABRIA
int execl (const char *pat
Comentarios de: Bloque I: Principios de sistemas operativos (0)
No hay comentarios