Skip to content

Latest commit

 

History

History
881 lines (713 loc) · 19 KB

practica4-5.md

File metadata and controls

881 lines (713 loc) · 19 KB

Practica 4 Pasaje de Mensajes Asincronico (PMA)

image

Punto a)

chan canalCliente(int)
chan antendido[n]()

process Cliente [id:0..n-1]{
    send canalCliente(id)
    receive atendido[id]()
}

process Empleado {
    while (true){
        receibe canalCliente(id)
        //Atender Empleado
        send atendido[id]()
    }
}

Punto b)

chan canalCliente(int)
chan antendido[n]()

process Cliente [id:0..n-1]{
    send canalCliente(id)
    receive atendido[id]()
}

process Empleado [id: 0..1] {
    while (true){
        receibe canalCliente(id)
        //Atender Empleado
        send atendido[id]()
    }
}

Punto c)

chan canalCliente(int)
chan antendido[n]()

chan canalEmpleado(int)
chan siguiente[2](int)


process Cliente [id:0..n-1]{
    send canalCliente(id)
    receive atendido[id]()
}

process Administrador {
    int idC
    int idE
    while (true){
        receive canalEmpleado(idE)
        if (not empty(canalCliente)){
            receive canalCliente(idC)
        }
        else{
            idC := -1
        }
        send siguiente[idE](idC)
    }
}

process Empleado [id: 0..1] {
    int idC
    while (true){
        send canalEmpleado(id)
        receive siguiente[id](idC)
        if (idC <> -1){
            //Antender Cliente
            send antendido[idC]()
        }
        else {
            delay(15 minutos)
        }
        
    }
}

image

chan canalCliente(int)
chan canalClienteTermino(int)
chan hayPedido()

chan colaMasCorta[p](int)
chan canalComprobante[p](text)

chan canalCaja[5](int)



process Cliente [id: 0..p-1]{

    int idCajero

    send canalCliente(id)
    send hayPedido()

    //Espero recibir la fila mas corta
    receive colaMasCorta[id](idCajero) 
    UsarCajero(idCajero)

    send canalCaja[idCajero](id) //Aviso para que me den el comprobante
    receive canalComprobante[id](comprobante)

    send canalClienteTermino(idCajero)

}

process Cajero [id: 0..4] {
    int idCliente
    text comprobante

    while (true){
        receive canalCaja[id](idCliente)
        generarComprobanmte(idCliente)
        send canalComprobante[idCliente](comprobante)
    }
}

process Coordinado{
    int idCliente
    int idCajero
    Array cajasCantidad[5]=[5](0)
    int menorFila

    while (true){
        receive hayPedido()
        if(not empty(canalClienteTermino)){
            receive canalClienteTermino(idCajero)
            cajasCantidad[idCajero]--
        }
        else if(not empty(canalCliente)){
            receive canalCliente(idCliente)
            idMenorFila = min(cajasCantidad)
            
            send colaMasCorta[idCliente](idMenorFila)
            cajasCantidad[idMenorFila]++
        }
    }
}

image

Cuando nos dicen que son tomados por cualquiera quiere decir que necesitamos un canal para ese proceso y que nos indique cual es el siguiente, y tambien tenemos un proceso coordinador cada vez que tengo que hacer algo si un canal esta vacio

chan canalCliente(int,text)
chan canalPlatosListo[C](text)

process Cliente [id:0..C-1]{
    text plato

    send canalCliente(id,plato)
    receive canalPlatoListo[id](plato)
}

chan canalVendedor(int)
chan vendedorSiguiente[3](text)

chan canalPlatosEspera(text)

process Vendedor[id:0..2]{
    int idCliente
    text Plato
    while (true){
        send canalVendedor(id)
        receive vendedorSiguiente[id](idCliente, Plato)

        if (Plato == "vacio"){
            reponerPackBebidas()
            delayRange(60-180)
        }
        else{
            send canalPlatosEspera(idCliente, Plato)
        }
    }
}

process Coordinador{
    int idVendedor
    int idCliente
    text Plato
    while (true){
        receive canalVendedor(idVendedor)

        if (empty(canalCliente)){
            Plato := 'vacio'
        }
        else{
            receive canalCliente(idCliente, Plato)
        }
        send vendedorSiguiente[idVendedor](idCliente, Plato)
    }
}

process Cocinero(){
    text Plato
    int idCliente
    while(true){
        receive canalPlatosEspera(idCliente, Plato)

        cocinarPlato(Plato)
        send canalPlatosListo[idCliente](Plato)
    }
}

image

En este ejercicio ocurre algo que en los demas no, y es que no tenemos un procesos coordinador, en este caso lo que necesitamos es un semaforo para sincronizacion

chan canalCliente(int)
chan cabinaIr[N]()

chan usarCabina(int)
chan esperandoTicket[N](text)

chan hayPedido()//Canal Solo para Sincronizacion

process Cliente []{
    int cabinaCorta
    text dinero
    text ticket

    send canalCliente(id)
    
    //Solicitamos al empleado para una cabina
    hayPedido()
    receive cabinaIr[id](cabinaCorta)
    usarCabina(cabinaCorta)

    //Solicitamos al empleado para pagar
    hayPedido()
    send pagarEmpleado(id, dinero, cabinaCorta)

    receive esperandoTicket[id](ticket)
}

process Empleado{
    Arreglo cabinas[10] = [10,0]
    int cabinaChica
    int idCliente
    text Ticket

    while (true){
        //Podemos tener dos casos de pedidos
        receive hayPedido() 
        // Si tengo las cabinas llenas tengo que preguntar
        // Asi espero a que la gente termine
        if (not empty(pagarEmpleado)) || (cabinas.todasOcupadas()){
            receive pagarEmpleado(idCliente, dinero, cabinaChica)
            cabinas.push(cabinaChica)//Vuelvo a agregar la cabina usada
            Ticket = Cobrar(idCliente,dinero)
            
            send esperandoTicket[idCliente](Ticket)
        }
        else{
            receive canalCliente(idCliente)
            cabinaChica = cabinas.popChica()
            send cabinaIr[idCliente](cabinaChica)
        }            

    }
}

image

send canalUsuario(text)

proces Usuarios[id:0..n-1]{
    text documento

    while (true){
        documento = generarDocumento()
        send canalUsuario(documento)
    }
}

chan canalDirector(text)

process Director {
    text documento
    while (true){
        documento = generarDocumento()
        send canalDirector(documento)
    }
}


chan canalImpresora(int)
chan imprimir[3](text)

proces Impresora[id:0..2]{
    text documento
    while(true){
        send canalImpresora(id)
        receive imprimir[id](documento)
        imprimirDocumento(docuemtno)
    }
}

process Coordinador(){
    int idIpresora
    text documento
    while (true){
        receive canalImpresora(idImpresora)

        if (not empty(canalDirector)){
            receive canalDirector(documento)
        }
        else{
            receive canalUsuario(documento)
        }
        send imprimir[idImpresora](documento)
    }
}

Practica 4 Pasaje de Mensajes Sincronico (PMS)

image image

process Examinador[id:0..R-1]{
    texto direccion
    while (true){
        direccion = BuscarSitioInfectado()
        admin!etiquetaExaminador(direccion)
    }
}

process Analizador{
    texto direccion
    text resultado
    while (true){
        Admin!etiquetaAnalizador()
        Admin?etiquetaExaminador(direccion)
        resultado = examinarSitio(direccion)
    }
}

process Admin{
    text direccion
    Cola sitiosEspera
    text elemento
    do
        Examinador[*]?etiquetaExaminador(direccion) --> sitiosEspera.push(direccion)
        [] not empty (sitiosEspera); Analizador?etiquetaAnalizador()
            --> 
                elemento = pop(sitiosEspera)
                Analizador!etiquetaExaminador(elemento)
    od
}

image

process PrimerEmpleado{
    text muestra
    while (true){
        muestra = prepararMuestra()
        Admin!muestrasGeneradas(muestra)
    }
}

process Admin{
    cola muestrasEspera
    text muestraActual

    do PrimerEmpleado?muestrasGeneradas(muestraActual) --> muestrasEspera.push(muestraActual)
    [] not empty(muestrasEspera); SegundoEmpleado?estoySegundoEmpleado() -->
        muestraActual = muestrasEspera.pop()
        SegundoEmpleado!muestrasGeneradas(muestraActual) 
    od
}


process SegundoEmpleado{
    texto muestra
    texto resultado
    while (true){
        Admin!estoySegundoEmpleado()
        Admin?muestrasGeneradas(muestra)

        muestra = ArmarSetAnalisis(muestra)

        TercerEmpleado!muestraArmada(muestra)
        TercerEmpleado?muestraAnalizada(resultado)

        archivar(resultado)
    }
}

process TercerEmpleado{
    texto muestra
    texto analizada
    while (true){
        SegundoEmpleado?muestraArmada(muestra)
        analizada = analizarMuestra(muestra)
        SegundoEmpleado!muestraAnalizada(analizada)
    }
}

image

Punto A

process Alumno[id:0..n-1]{
    text examen
    int nota

    examen = Resolver(examen)
    Profesor!examenTerminado(examen)
    Profesor?examenCorregido(nota)
}

process Profesor{
    text examen
    int nota

    while (true){
        Alumno?examenTerminado(examen)
        nota = corregir(examen)
        Alumno!examenCorregido(nota)
    }
}

Punto B

process Alumno[id:0..n-1]{
    text examen
    int nota

    examen = Resolver(examen)
    Admin!examenTerminado(id, examen)
    Profesor[*]?examenCorregido(nota)
}

process Admin{
    text examen
    int idAlumno
    int idProfesor
    cola examenesResueltos

    do Alumno[*]?examenTerminado(idAlumno, examen) --> examenesResueltos.push(idAlumno, examen)
    [] not empty(examenesResueltos); Profesor[*]?estoyProfe(idProfesor) -->
        idAlumno, examen = pop(examenesResueltos)
        Profesor[idProfesor]!(idAlumno, examen)
    od
}

process Profesor[id:0..p-1]{
    text examen
    int nota
    int idAlumno
    while (true){
        Admin!estoyProfe(id)
        admin?examenTerminado(idAlumno, examen)
        nota = corregir(examen)
        Alumno[idAlumno]!examenCorregido(nota)
    }
}

Punto C

process Alumno[id:0..n-1]{
    text examen
    int nota

    Admin!llegoAlumno()
    Admin?comenzarAlumno()
    examen = Resolver(examen)
    Admin!examenTerminado(id, examen)
    Profesor[*]?examenCorregido(nota)
}

process Admin{
    text examen
    int idAlumno
    int idProfesor
    cola examenesResueltos

    for (i=0; i<N; i++){
        Alumno[*]?llegoAlumno()
    }
    for (i=0; i<N; i++){
        Alumno[*]!comenzarAlumno()
    }

    do Alumno[*]?examenTerminado(idAlumno, examen) --> examenesResueltos.push(idAlumno, examen)
    [] not empty(examenesResueltos); Profesor[*]?estoyProfe(idProfesor) -->
        idAlumno, examen = pop(examenesResueltos)
        Profesor[idProfesor]!(idAlumno, examen)
    od
}

process Profesor[id:0..p-1]{
    text examen
    int nota
    int idAlumno
    while (true){
        Admin!estoyProfe(id)
        admin?examenTerminado(idAlumno, examen)
        nota = corregir(examen)
        Alumno[idAlumno]!examenCorregido(nota)
    }
}

image

process Persona[id:0..p-1]{
    text tiempoAcceso

    Admin!llegoPersona(id)
    Encargado?turnoPersona(tiempoAcceso)

    UsarSimulador(tiempoAcceso)
    Encargado!terminoPersona()
}
process Admin{
    int idPersona
    cola personasLlegada

    do Persona[*]?llegoPersona(idPersona) --> personasLlegada.push(idPersona)
    []  not empty(personasLlegada); Encargado?estoyEncargado() -->
            idPersona = pop(personasLlegada)
            Encargado!recibirPersona(idPersona)
    od
}
process Encargado{
    int idPersona
    text tiempoAcceso
    while (true) {
        Admin!estoyEncargado()
        Admin?recibirPersona(idPersona)
        tiempoAcceso = calcularTiempo(idPersona)
        Persona[idPersona]!turnoPersona(tiempoAcceso)
        Persona[idPersona]?terminoPersona()
    }
}

image

process Espectador[id:0..p-1]{
    text tiempoAcceso

    Admin!llegoEspectador(id)
    Turno?turnoEspectador(tiempoAcceso)

    UsarMaquina(tiempoAcceso)
    Turno!terminoEspectador()
}
process Admin{
    int idEspectador
    cola espectadorLlegada

    do Espectador[*]?llegoEspectador(idEspectador) --> espectadorLlegada.push(idEspectador)
    []  not empty(espectadorLlegada); Turno?estoyTurno() -->
            idEspectador = pop(espectadorLlegada)
            Turno!recibirPersona(idEspectador)
    od
}
process Turno{
    int idEspectador
    text tiempoAcceso
    while (true) {
        Admin!estoyTurno()
        Admin?recibirPersona(idEspectador)
        tiempoAcceso = calcularTiempo(idEspectador)
        Persona[idEspectador]!turnoPersona(tiempoAcceso)
        Persona[idEspectador]?terminoPersona()
    }
}

Practica 5 Ada

image

Parte a

Procedure ejercicio1 is
Task Puente is
    entry INGRESO_AUTO;
    entry INGRESO_CAMIONETA;
    entry INGRESO_CAMION;
    entry SALIR_AUTO;
    entry SALIR_CAMIONETA;
    entry SALIR_CAMION;
END puente;

Task type vehiculo

arrAuto: array (1..A) of vehiculo;
arrCamioneta: array (1..A) of vehiculo;
arrCamion: array (1..A) of vehiculo;

Task body vehiculo  is
begin
    if ("Auto") then
        Puente.INGRESO_AUTO;
    else if ("Camioneta") then
        Puente.INGRESO_CAMIONETA;
    else if ("Camion") then
        Puente.INGRESO_CAMION;
    
    if("Auto")then
        Puente.SALIR_AUTO;
    else if("Camioneta")then
        Puente.SALIR_CAMIONETA;
    else 
        Puente.SALIR_CAMION;
end vehiculo;

Task Body Puente is
    pesoActual:int = 0
begin
    SELECT
        WHEN (pesoActual + 1 <= 5) => ACCEPT INGRESO_AUTO
    OR
        WHEN (pesoActual + 2 <= 5) => ACCEPT INGRESO_CAMIONETA
    OR
        WHEN (pesoActual + 3 <= 5) => ACCEPT INGRESO_CAMION
    OR
        ACCEPT SALIR _AUTO;
        pesoActual -= 1;
    OR
        ACCEPT SALIR_CAMIONETA;
        pesoActual -= 2;
    OR
        ACCEPT SALIR_CAMION;
        pesoActual -= 3;
    END SELECT
end Puente;


begin
    null
end ejercicio1

Parte b

Procedure ejercicio1 is
Task Puente is
    entry INGRESO_AUTO;
    entry INGRESO_CAMIONETA;
    entry INGRESO_CAMION;
    entry SALIR_AUTO;
    entry SALIR_CAMIONETA;
    entry SALIR_CAMION;
END puente;

Task type vehiculo

arrAuto: array (1..A) of vehiculo;
arrCamioneta: array (1..A) of vehiculo;
arrCamion: array (1..A) of vehiculo;

Task body vehiculo  is
begin
    if ("Auto") then
        Puente.INGRESO_AUTO;
    else if ("Camioneta") then
        Puente.INGRESO_CAMIONETA;
    else if ("Camion") then
        Puente.INGRESO_CAMION;
    
    if("Auto")then
        Puente.SALIR_AUTO;
    else if("Camioneta")then
        Puente.SALIR_CAMIONETA;
    else 
        Puente.SALIR_CAMION;
end vehiculo;

Task Body Puente is
    pesoActual:int = 0
begin
    SELECT
        WHEN (pesoActual + 1 <= 5) and (INGRESO_CAMION`COUNT = 0) => ACCEPT INGRESO_AUTO
    OR
        WHEN (pesoActual + 2 <= 5) and (INGRESO_CAMION`COUNT = 0) => ACCEPT INGRESO_CAMIONETA
    OR
        WHEN (pesoActual + 3 <= 5) => ACCEPT INGRESO_CAMION
    OR
        ACCEPT SALIR _AUTO;
        pesoActual -= 1;
    OR
        ACCEPT SALIR_CAMIONETA;
        pesoActual -= 2;
    OR
        ACCEPT SALIR_CAMION;
        pesoActual -= 3;
    END SELECT
end Puente;


begin
    null
end ejercicio1

image

Procedure Ejercicio2 is

Task Empledo is
    Entry Pagar(dinero:IN text; comprobante OUT:text)
End Empleado;

Task Type Cliente;

arrCliente: array [1..N] of Cliente;

Task Body Cliente
    text:comprobante
    text:dinero
begin
    SELECT
        Empleado.Pagar(dinero, comprobante)
    OR DELAY 600
        null
    END SELECT
end Cliente

Task Body Empleado is

Begin

end Empleado;
    text:comprobante
    text:dinero
begin
    loop
        ACCEPT Pagar(dinero: in text, comprobante out text) do
            comprobante = realizarComprobante(dinero)
        end Pagar;
    end loop;
end Ejercicio2;

image

Procedure ejercicio3 is
Taks Central is
end Central;

Task type Periferico;

Task body Central is
begin
    Accept Senial1
    loop
        Select 
            Accept Senial1
        or
            Accept Senial2
            Timer.Empiezo
            loop
                Select
                    when (Termino`count = 0) => Accept Senial2
                or
                    Accept Termino
                    Breack;
                end Select;
            end Loop
    end loop
end Central

Task Body Periferico1 is 
Begin
    loop
        // Genera Señal
        Select 
            Central.Señal1;
        Or Delay 120;
            null;
        End Select;
    end loop;
End Periferico1;


Task Body Periferico2 is 
Begin
    // Genera Señal
    loop
        Select
            Central.Señal2;
            // Genera Señal
        Else
            delay(60)
        End Select;
    end loop;
End Periferico2;
begin
end ejercicio3;

image

Procedure Ejercicio4 is
Type Medico is
    Entry peticionPersona()
    Entry peticionEnfermera()
end Medico

Type Body Medico is
Begin

End Medico;

Type Body Persona is
    Contador:int;
Begin
    Contador:0
    Loop
        Select
            Medico.peticionPersona()
        or Delay 300
            Contador+=1;
            if (Contador < 3)then
                delay(600)
            fi
        End Select;
    End Loop
End Persona

begin
    Null
End Ejercicio4;

image image

image

image

image