Topic 5 OperatingSystems
Topic 5 OperatingSystems
3 4
Procesos
El Sistema Operativo se encarga de administrar el tiempo,
Tarea de
tiempo real
Planific
Tiempo Tiempo de
de acceso a Tarea de
cómputo E/S cómputo
intensivo
STOP
5 6
Figura -. Colaboración entre planificador y despachador.
Diapositiva 1
Inconveniente
No es eficiente. Si en uno de los trabajos se accede a hardware, toda la
aplicación debe esperar a que el hardware responda
7 8
9 10
11 12
5 Operating Systems 5 Operating Systems
Hilos
Hilos
Todos los recursos son compartidos por todos los hilos del proceso
Estados de un hilo
Las variables globales y la memoria dinámica (como vimos está en la zona de
memoria asignada a la parte de código) será compartida por todos los
procesos Problema de concurrencia Lista Bloqueada
Corriendo
Terminada
13 14
15 16
[entrada] thread_def Puntero a una definicion de hilo realizada mediante osThreadDef y referenciada con
osThread.
osThreadDef (funtion_name,priority,instancias,stacksize)
[entrada] argument Puntero a una variable que se pasa a la funcion del hilo como un argumento de
La prioridad del hilo tendra los valores
entrada. t.
osPriorityIdle = -3,
returns: ID del hilo para referenciar por otras funciones o NULL en caso de error.
osPriorityLow = -2,
osPriorityBelowNormal = -1,
Inicia hilo asignado a una funcion y lo añade a la lista hilos activos, estableciendo su estado como osPriorityNormal = 0,
osPriorityAboveNormal = +1,
READY. La función del hilo recibe el argumento como argumento de la función cuando se ésta se osPriorityHigh = +2,
inicia. Cuando la prioridad de la función del hilo creado es superior al hilo RUNNING, el hilo creado osPriorityRealtime = +3,
comienza inmediatamente y se convierte en el nuevo hilo RUNNING . osPriorityError = 0x84
Creacion de Hilos.
Example
#include "cmsis_os.h“
19 20
21 22
Código en lenguaje C
23 24
5 Operating Systems 5 Operating Systems
g_num=gnum+num Concurrencia
En las zonas de código que usan variables globales o recursos
MOV D0,Mem(g_num)
compartidos, para evitar problemas se puede hacer el acceso
MOV D1,Mem(num)
indivisible o atómico deshabilitar interrupciones (no permitido
ADD D0,D1
en modo usuario)
MOV Mem(g_num),D0
25 26
Las variables locales de un hilo no se comparten con otros hilos, aunque son
Código en lenguaje C
#include <stdio.h>
volatile int g_num;
int CompruebaNumero(int num)
{
físicamente accesibles desde otro hilo dentro del proceso.El núcleo no las
int CompruebaNumero(int num);
int main()
if(num > 10)
{ protege porque pertenecen al mismo proceso
{ DeshabilitarInt();
int iNum, iCubo, iCont; g_num = g_num + num;
printf(“Introduzca un nº:”); HabilitarInt();
scanf(“%d”, &iNum); return 0;
iCubo = iNum; }
if(!CompruebaNumero(iNum)) return 1;
{ }
printf(“Número no válido”); void __attribute__((interrupt))
return -1; timer_interrupt (void)
} {
for(iCont = 0; iCont < 2; ++iCont) int num = GetVal();
iCubo *= iNum; if(!CompruebaNumero(num))
printf( “\nEl cubo de %d es %d\n”, return;
iNum, iCubo); PutVal(num >> 2);
return g_num; }
27 28
29 30
5 Operating Systems 5 Operating Systems
31 32
33 34
35 36
5 Operating Systems 5 Operating Systems
recurso
Semaforo contador Permite el acceso de varios hilos al recurso. proteger la entrada a una seccion critica
Se pueden construir utilizando mutex. Suspender un hilo
Sincronizar dos o mas hilos
37 38
Funciones
int32_t osSignalSet (osThreadId thread_id, int32_t signals)
Señaliza al hilo thread_id los flags indicados en signals.
int32_t osSignalClear (osThreadId thread_id, int32_t signals)
Desactiva los flags de señal signals en el hilo thread_id.
os_InRegs osEvent osSignalWait (int32_t signals, uint32_t millisecs)
Suspende el hilo en ejecucién hasta que los flags indicados en la variable signals
sean señalizadas por otro hilo, o pasen mas de mas de millisec milisegundos
(osWaitForever ->espera hasta que sea señalizado sin limite de tiempo)
43 44
Semaforos
Example
*----------------------------------------------------------------------*/
#include "cmsis_os.h"
int main (void) {
void threadX (void const *argument);
Es otro objeto de sincronizacion de hilos y procesos
osThreadId main_id;
/* Get main thread ID */ Se asimila a una variable que almacena valores no negativos, sobre la que
se pueden hacer dos operaciones
osThreadId threadX_id;
main_id = osThreadGetId();
osThreadDef(threadX, osPriorityNormal, 1, 0);
/* Create thread X */ Incrementar V
threadX_id = osThreadCreate(osThread(threadX), NULL); Decrementar P
void threadX (void const *argument) {
for (;;) {
for (;;) { /* do-this */ Si el valor del semaforo es >0,
/* Indicate to thread X completion of do-this */ una operación V suma 1 ese valor
/* Wait for completion of do-this */
#define osSemaphore(name)
Accede a una definicion de un objeto semaforo Elimina un objeto semafor creado previamente con osSemaporeCreate
osStatus osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t
millisec)
Realiza la operación P sobre el semaforo. En caso de suspenderse, el tiempo
maximo en el que permanecera suspedido sera millisec (si es osWaitForever, es
hasta que otro hilo haga la operación V)
osStatus osSemaphoreRelease (osSemaphoreId semaphore_id)
47 Realiza la operacion V sobre el semaforo. 48
5 Operating Systems
Objetos de sincronizacion
Example
#include "cmsis_os.h"
osSemaphohreDef (SemaphoreDefin); // Semaphore name definition
main {
osSemaphoreId semaphore_id;
osStatus status
semaphore_id = osSemaphoreCreate (osSemaphore (SemaphoreDefin),1);
if (semaphore_id != NULL) { // Semaphore object created
}
status=osSemaphoreWait (semaphore_id,osWaitForever);
// Accesss to the shared resource