Tema 2 Lenguajes de programación PRIMERA PARTE Características Tareas Comunicación de tareas Objetos protegidos Sentencia requeue Maria Isabel Alfonso Galipienso. 2006 1 Indice Características Tareas Comunicación de tareas Objetos protegidos Sentencia requeue Maria Isabel Alfonso Galipienso. 2006 2 1 Lenguajes de programación UN BUEN LENGUAJE DE PROGRAMACIÓN ... UN LENGUAJE DE PROGRAMACIÓN MALO... Nos ayuda a construir Nos hace más difícil el software que sea: construir software que sea: Fiable Safe Secure Mantenible Fiable Safe Secure Mantenible Es posible escribir buen software con un mal lenguaje. Requerirá ingenieros con más experiencia. En cualquier caso, se necesitará más tiempo y será más COSTOSO que con la utilización de un buen lenguaje. Un buen lenguaje de programación nos facilita el trabajo. Pero no hace el trabajo por nosotros. Maria Isabel Alfonso Galipienso. 2006 3 Cuestiones a considerar FACTORES HUMANOS QUE AFECTAN LA PROGRAMACIÓN Los humanos cometen PROPIEDADES DE UN BUEN LENGUAJE DE PROGRAMACIÓN Hace que sea más difícil errores La gente se "mueve" Los autores del código no son los mismos que lo mantienen El software evoluciona constantemente Maria Isabel Alfonso Galipienso. 2006 escribir código incorrecto Soporta abstracción Facilita la escritura de código legible Soporta una organización modular del software Portabilidad 4 2 Un ejemplo (I) ¿Podéis contestar en menos de 20 segundos cuál de las dos rutinas siguientes realizan de forma correcta lo siguiente?: Devolver el contenido de n bits de una palabra de 32 bits Desde el bit que ocupa la posición p Hasta el bit que ocupa la posición p-n+1 El bit de posición 0 es el de la parte de la derecha n bits Bit 31 ……… Bit p ………… Bit p-n+1 ……… Maria Isabel Alfonso Galipienso. 2006 Bit 0 5 Un ejemplo (II) C unsigned get_bits (unsigned x, int p, int n) { return (x >> (p-n+1)) & ~(~0 << n); } Ada 95 function Get_Bits (X : Bit_Array; P : Bit; N : Offset) return Bit_Array is begin return X (P – N + 1 .. P); end Get_Bits; Maria Isabel Alfonso Galipienso. 2006 6 3 Objetivos de diseño de algunos lenguajes de programación C Portabilidad, lenguaje ensamblador de alto nivel No contempla cuestiones sobre safety o security C++ Lenguaje orientado a objetos compatible con C No contempla cuestiones sobre safety o security Java Soluciona los problemas sobre insecurity de C++ (p.e. no podemos crear un virus con Java) No contempla cuestiones sobre safety Maria Isabel Alfonso Galipienso. 2006 7 El lenguaje Ada Versión "industrial" de Pascal diseñado para desarrollar: Software safe y secure Software que necesita mantenerse Muchos estándares sobre seguridad (safety) recomiendan el uso de Ada para alcanzar niveles altos de integridad Características de C++ adoptadas en Ada Templates (Generics) Excepciones Características de Java adoptadas en Ada Comprobación de índices en Arrays Comprobación de división por cero Agunos lenguajes derivados de Ada: Spark, VHDL, PL SQL Maria Isabel Alfonso Galipienso. 2006 8 4 Algunas aplicaciones industriales en Ada Críticas para las empresas Tecnologías Canal+ : Pago por visionado, control de acceso BNP: Lenguage comercial Philips: Equipamiento de ensamblado de semiconductores Volvo: planta de producción Críticas en cuanto a misiones Astree: Señalización ferroviaria en el ámbito Europeo Weirton Steel - controlador de procesos Mondex (dinero electrónico) Scanning Electron ( microscopio) Críticas en cuanto a safety Airbus A340 Boeing 777 9 Maria Isabel Alfonso Galipienso. 2006 Ada y C/C++ Muchos expertos afirman que ningún sistema de seguridad crítico se debería implementar nunca en C Diseño e Implementación con Ada95 La falta de experiencia en el Diseño (?) e Implementación con C/C++ uso de Ada produce sistemas con un pobre rendimiento La falta de experiencia en el uso de C/C++ produce errores de código Maria Isabel Alfonso Galipienso. 2006 10 5 Indice Características Tareas Comunicación de tareas Objetos protegidos Sentencia requeue Maria Isabel Alfonso Galipienso. 2006 11 ¿Qué es una tarea? Unidad de programa que se ejecuta concurrentemente Sobre un procesador (un único thread de control) Multi-programación (múltiples threads) Multi-proceso (múltiples threads) Entornos distribuidos Siempre hace de Esclavo (Slave) Debe tener un padre (master) A veces es abortable Puede ser abortada por QUALQUIERA (siempre que tenga visibilidad) Ya que debe tener un padre, nunca puede ser una unidad de librería Maria Isabel Alfonso Galipienso. 2006 12 6 Tareas en Ada En un programa en Ada, el usuario puede definir un número de procesos internos (task) para cada uno de los cuales se define un hilo de ejecución Ada permite comunicar y sincronizar tareas asumiendo los modelos de memoria compartida y paso de mensajes Por cada programa Ada se crea un hilo de ejecución (padre) y tantos procesos hijos como tareas se han definido 13 Maria Isabel Alfonso Galipienso. 2006 Declaración de tareas Usando tareas simples declare task RECURSOS ; task body RECURSOS is begin loop null; end loop; end RECURSOS ; begin ... end; Maria Isabel Alfonso Galipienso. 2006 Usando tipos de tareas task type RECURSOS ; task body RECURSOS is begin loop null; end loop; end RECURSOS ; REC : RECURSOS; CTO_REC : array (1..10) of RECURSOS; type USO_REC is access RECURSOS ; RECURSO1: USO_REC ; CTO_REC : array (1..10) of USO_REC; 14 7 Identificación de tareas package Ada.Task_Identification is type Task_Id is private; Null_Task_Id : constant Task_Id; function "=" (Left, Right: Task_Id) return Boolean; function Image (T: Task_Id) return String; function Current_Task return Task_Id; procedure Abort_Task (T : in out Task_Id); function Is_Terminated(T : Task_ID) return Boolean; function Is_Callable (T : Task_ID) return Boolean; private ... -- not specified by the language end Ada.Task_Identification; Image devuelve una cadena (string) que identifica a la tarea Current_Task devuelve un valor que identifica a la tarea 15 Maria Isabel Alfonso Galipienso. 2006 Atributos de tareas Task_Type’Callable; - - is Task in a callable state. - - Devuelve Boolean. Task_Type’Terminated; - - is Task Terminated. - - Devuelve Boolean. E’Count; - - número de llamadas pendientes en una cola de un “entry”. - - devuelve Unversal_Integer; T’Identity; - - Devuelve un valor de Task_ID - - Permitido solo dentro del cuerpo de un entry - - o una sentencia accept. Maria Isabel Alfonso Galipienso. 2006 16 8 Ejecución de tareas La ejecución de una tarea se lleva a cabo en un proceso de dos fases: ACTIVACIÓN: Consiste en la elaboración de las declaraciones del cuerpo de la tarea. EJECUCIÓN: consistente en la ejecución de las sentencias de la tarea. EJEMPLO declare A: T; B: T; begin ... end; padre declare begin end tarea A declarada activación ejecución tarea B declarada activación ejecución Maria Isabel Alfonso Galipienso. 2006 17 Activación/terminación de tareas ACTIVACIÓN Tareas estáticas Tareas dinámicas Dependen del bloque, No dependen de la unidad donde se subprograma o cuerpo de tarea crean, sino de la unidad donde se donde se definan declara el tipo puntero Se activan justo antes de empezar Se activan al ejecutarse el operador la ejecución de la unidad new No puede terminar hasta que Pueden seguir existiendo aunque terminen todas las tareas que termine la unidad progenitora dependen de ella TERMINACIÓN Termina la ejecución del cuerpo Se pone de acuerdo con otras tareas para terminar conjuntamente n Es abortada por otra tarea. n n Maria Isabel Alfonso Galipienso. 2006 18 9 Ejemplos Tareas y paquetes package P is ... end P; package body P is task A; task body A is ... end A; begin -- A comienza aquí -- Sentencia inicial de P end P; -- El programa no termina hasta -- que no haya terminado A Tareas y procedimientos procedure example is task A; -- especificación task B; task body A is --cuerpo ... begin ... end A; task body B is --cuerpo ... begin ... end B; begin -- A y B comienzan aquí -- Las instrucciones de example -- se ejecutan junto con A y B end example; -- espera a A y B 19 Maria Isabel Alfonso Galipienso. 2006 Ejemplos Tareas dinámicas procedure example is task type T; type A is access T; P: A; Q: A := new T; -- Se crea Q.all - - que se ejecuta inmediatamente task body T is ... Tutor de una tarea dinámica declare task type T; type A is access T; begin ... declare --bloque interior X: T; - - el tutor de X es el -- bloque interior begin ... P:= new T; -- Se crea P.all Q:= new T; -- Se otra Q.all -- La primera tarea sigue -- ejecutándose, pero es anónima ... end example; Maria Isabel Alfonso Galipienso. 2006 Y: A := new T; - - el tutor de Y es -- el bloque exterior begin -- X comienza aquí ... end; -- espera a que termine X ... -- Y.all es anónima aquí end ; -- espera a que termine Y.all 20 10 Indice Características Tareas Comunicación de tareas Objetos protegidos Sentencia requeue 21 Maria Isabel Alfonso Galipienso. 2006 Comunicación de tareas Memoria compartida T1 T3 T2 T4 Objetos protegidos Mensajes T1 T3 T2 T4 Maria Isabel Alfonso Galipienso. 2006 Cita extendida 22 11 Indice Características Tareas Comunicación de tareas Objetos protegidos Sentencia requeue 23 Maria Isabel Alfonso Galipienso. 2006 Objetos protegidos (I) Proporcionan un mecanismo de sincronización entre procesos Permiten controlar el acceso a datos compartidos entre múltiples procesos Tienen 3 tipos de operaciones: funciones protegidas, procedimientos protegidos, y entradas (entry). Objeto protegido procedure datos function entry Maria Isabel Alfonso Galipienso. 2006 24 12 Objetos protegidos (II) Los procedimientos protegidos proporcionan acceso mutuamente exclusivo de lectura-escritura a los datos de un objeto protegido. Las funciones protegidas proporcionan acceso concurrente a los datos de sólo lectura. Los entry protegidos también proporcionan acceso exclusivo a los datos de lectura-escritura. Los entry protegidos tienen una barrera específica (expresión booleana). Dicha barrera debe ser cierta antes de la llamada a entry para poder acceder a los datos. Maria Isabel Alfonso Galipienso. 2006 25 Tipos protegidos. Ejemplo (I) package Mailbox_Pkg is type Parcels_Count is range 0 .. Mbox_Size; type Parcels_Index is range 1 .. Mbox_Size; type Parcels_Array is array ( Parcel_Index ) of Parcels protected type Mailbox is entry Send (Item : Parcels); -- almacena un elemento entry Receive (Item : out Parcels); -- recupera un elemento procedure Clear; function Number_In_Box return Integer; private Count : Parcels_count := 0; Out_Index : Parcels_Index := 1; In_Index : Parcels_Index := 1; Data : Parcels_Array ; end Mailbox; end Mailbox_Pkg; Maria Isabel Alfonso Galipienso. 2006 26 13 Tipos protegidos. Ejemplo (II) package body Mailbox_Pkg is protected body Mailbox is entry Send ( Item : Parcels) when Count < Mbox_Size is -- bloquea hasta que haya espacio begin Data ( In_Index ) := Item; In_Index := In_Index mod Mbox_size + 1; Count := Count + 1; end Send; entry Receive ( Item : out Parcels ) when Count > 0 is -- bloquea hasta que hayan elementos begin Item := Data( Out_Index ); Out_Index := Out_Index mod Mbox_Size + 1; Count := Count -1; end Receive; 27 Maria Isabel Alfonso Galipienso. 2006 Tipos protegidos. Ejemplo (III) procedure Clear is begin Count := 0; Out_Index := 1; In_Index := 1; end Clear; --sólo un usuario cada vez function Number_In_Box return Integer is -- varios usuarios pueden acceder a la vez begin return Count; end Number_In_Box; end Mailbox; end Mailbox_Pkg; Maria Isabel Alfonso Galipienso. 2006 28 14 Tipos protegidos. “Broadcast” (I) Supongamos que una tarea tiene que comunicar un mensaje a un cierto número de tareas que están esperando. Todas las tareas estarán en espera en la “entrada” correspondiente, que estará "abierta" sólo cuando llegue un nuevo mensaje. protected type Broadcast is entry Receive (M : out Message); -- recupera un mensaje entry Send (M : Message); -- envía un mensaje private New_message: Message; Message_arrived: Boolean := False; end Broadcast; Maria Isabel Alfonso Galipienso. 2006 29 Tipos protegidos. “Broadcast” (II) protected body Broadcast is entry Receive (M : out Message) when Message_Arrived is begin M:= New_Message; if Receive’Count = 0 then Message_Arrived := False; end if; end Receive; entry Send (M : Message) is begin if Receive’Count > 0 then Message_Arrived := True; New_Message:= M; end if; end Send; end Broadcast; Maria Isabel Alfonso Galipienso. 2006 30 15 Indice Características Tareas Comunicación de tareas Objetos protegidos Sentencia requeue Maria Isabel Alfonso Galipienso. 2006 31 Sentencia requeue (I) requeue Entry_Name [with abort]; Requeue permite que una llamada a un entry se sitúe al final de la cola para procesarla más tarde. Sin la opción abort, la entrada “reencolada” es protegida frente a una posible cancelación. Maria Isabel Alfonso Galipienso. 2006 32 16 Sentencia requeue (II) Una llamada a requeue puede darse entre llamadas a entry de tareas y de objetos protegidos. Se puede dar una llamada a requeue: dentro del mismo entry, a otro entry en la misma unidad a otra unidad Ejemplos de uso de requeue: Problema de control de recursos Implementación de "eventos" Maria Isabel Alfonso Galipienso. 2006 33 Control de recursos (I) type Request_Range is range 1..Max; protected Resource_Controller is entry Request(R: out resource; Amount: Request_Range); procedure Free (R: Resource; Amount: Request_Range); private entry Assign(R: out Resource; Amount: Request_Range); Freed: Request_Range:= Request_Range'Last; New_Resources_Released: Boolean:= False; To_Try: Natural:= 0; ,,, end Resource_Controller; Maria Isabel Alfonso Galipienso. 2006 34 17 Control de recursos (II) protected body Resource_Controller is entry Request(R: out resource; Amount: Request_Range) when Freed > 0 is begin if Amount <= Freed then Freed:= Freed - Amount; - - Allocate; else requeue Assign; end if; end Request; ... Maria Isabel Alfonso Galipienso. 2006 35 Control de recursos (III) ... entry Assign(R: out resource; Amount: Request_Range) when New_Resources_Released is begin To_Try:= To_Try - 1; if To_Try = 0 then New_Resources_Released:= False; end if; if Amount <= Freed then Freed:= Freed - Amount; -- allocate else requeue Assign; end if; end Assign; ... Maria Isabel Alfonso Galipienso. 2006 36 18 Control de recursos (IV) ... procedure Free(R: Resource; Amount: Request_Range) is begin Freed:= Freed + Amount; -- free resources if Assign'Count > 0 then To_Try:= Assign'Count; New_Resources_Released:= True; end if; end Free; end Resource_Controller; 37 Maria Isabel Alfonso Galipienso. 2006 Sentencia requeue. Eventos protected Event is entry Wait; entry Signal; private entry Reset; Occurred : Boolean := False; end Event; Maria Isabel Alfonso Galipienso. 2006 protected body Event is entry Wait when Occurred is begin null; -- cuerpo vacío end Wait; entry Signal when True is -- barrera es cierta siempre begin if Wait’Count > 0 then Occurred := True; requeue Reset; end if; end Signal; entry Reset when Wait’Count = 0 is begin Occurred := False; end Reset; end Event; 38 19 Ejemplo: Metro circular Se intenta simular el comportamiento del recorrido circular de un metro. El metro realiza paradas en las estaciones. Cada estación es un OBJETO PROTEGIDO. esperan para bajar esperan para subir Estación Estación Tren Estación Estación Estación Estación esperan para subir espera para bajar Maria Isabel Alfonso Galipienso. 2006 39 Estación i Estación entry arrive (destino: estación) when Trainboarding and On_Train < Capacity procedure Stopping (P: pasajeros) entry Alight (destino: estación) when Trainstopped procedure Boarding procedure Closedoors (P: pasajeros) On_Train: Passengers Trainboarding: Boolean Trainstopped: Boolean Maria Isabel Alfonso Galipienso. 2006 40 20 Metro Tarea que realiza las siguientes acciones: loop for S in Station_Address loop Stations(S).Stopping(Volume); Stations(S).Boarding; Stations(S).Closedoors(Volume); delay Travel_Times(S); end loop; end loop; Maria Isabel Alfonso Galipienso. 2006 41 Stopping (p) Procedimiento protegido: On_Train:= P; Trainstopped:= True; Cuando Trainstopped sea cierto, los pasajeros que estaban esperando a llegar a esa estación, podrán bajar (estarán encolados en Alight). Maria Isabel Alfonso Galipienso. 2006 42 21 Boarding Procedimiento protegido: Trainstopped:= False; Trainboarding:= True; Cuando Trainstopped sea falso, ya no podrá bajar ningún pasajero. Cuando Trainboarding sea cierto, los pasajeros que esperan en esa estación podrán subir si quedan plazas (on_train < capacity). Maria Isabel Alfonso Galipienso. 2006 43 Closedoors (p) Procedimiento protegido: P:= On_train; Trainboarding:= False; Cuando Trainboarding sea falso, ya no podrán subir más pasajeros a bordo. Se devuelve el número de pasajeros que lleva el tren (On_train) Maria Isabel Alfonso Galipienso. 2006 44 22 Pasajero Tarea que realiza las siguientes acciones: -- elegir origen y destino Stations(origen).Arrive(destino); Maria Isabel Alfonso Galipienso. 2006 45 Arrive (d) Entry protegido: barrera: when Trainboarding and on_train < capacity On_train:= On_train + 1; requeue Stations(d).Alight; El pasajero sube al metro, cuando el metro llegue a la estación (Trainboarding) y haya plazas libres (on_train < capacity), y después Se queda esperando para bajar en la estación d (requeue Stations(d).Alight). Maria Isabel Alfonso Galipienso. 2006 46 23 Alight (d) Entry protegido: barrera: when Trainstopped On_train:= On_train - 1; El pasajero baja en la estación correspondiente cuando el metro esté "parado" (trainstopped). Maria Isabel Alfonso Galipienso. 2006 47 24