.. meta::
:language: it
:description language=it: Appunti di Complex Systems Design - Sistema Produttore-Consumatore
:description language=en: Notes on Complex Systems Design - Producer-Consumer System
:keywords: Complex Systems Design, CCS, producer consumer system
:author: Luciano De Falco Alfano
.. index:: producer consumer
.. _ref_producer_consumer:
Producer Consumer
===================
.. contents::
:local:
..
Lezione del *2018-12-21*.
Specifichiamo un sistema di tipo *Produttore-Consumatore*.
In generale il produttore crea un qualche tipo di informazione, che il consumatore
riceve.
Ipotizziamo che questo sistema sia in grado di tenere *parcheggiate* due informazioni.
Le azioni permesse sono il *deposito* (:math:`deposit`) dell'informazione e
il suo *prelievo* (:math:`withdraw`).
.. index:: pc: sequencial specification
.. _ref_pc_sequencial_specification:
PC: sequencial specification
-------------------------------
Avremo gli stati:
* nessuna informazione depositata (:math:`ProdCons02`),
* una informazione depositata (:math:`ProdCons12`),
* due informazioni depositate (:math:`ProdCons22`).
La gestione degli stati è la seguente.
Senza informazioni depositate, si può solo depositare:
.. math::
ProdCons02 = deposit \cdot ProdCons12
Con una informazione depositata è possibile depositarne un'altra oppure
prelevare l'informazione presente:
.. math::
ProdCons12 = deposit \cdot ProdCons22 + withdraw \cdot ProdCons02
Con due informazioni depositate si può solo prelevare un dato:
.. math::
ProdCons22 = withdraw \cdot ProdCons12
Volendo esprimerla come un automa a stati finiti, avremmo la seguente
rappresentazione:
.. image:: images/pc.*
:align: center
Seguirà una fase di test per verificare se i requisiti hanno qualche problema.
Superata la fase di test andiamo in *refinement*. Ad esempio decidendo
di gestire i depositi tramite due buffer a singola capacità.
.. index:: pc: concurrent specification
.. _ref_pc_concurrent_specification:
PC: concurrent specification
------------------------------
Per un raffinamento con sistemi concorrenti, ipotizziamo di avere in
parallelo: il produttore, il gruppo dei due buffer, il consumatore.
Quindi sarà:
.. math::
PC_{conc,2} = Prod \parallel_{\{ deposit \}} (Buff \parallel Buff) \parallel_{\{ withdraw \}} Cons
In questo modello, il produttore esegue deposito e diviene nuovamente produttore:
.. math::
Prod = deposit \cdot Prod
Un buffer esegue un deposito, dopo di che deve eseguire un prelievo per poi
divenire nuovamente buffer:
.. math::
Buff = deposit \cdot withdraw \cdot Buff
Il consumatore esegue il prelievo e poi diviene nuovamente consumatore:
.. math::
Cons = withdraw \cdot Cons
Analizzando funzionalmente il comportamento dei due modelli, sequenziale e
concorrente, è possibile notare che sono bisimilarmente equivalenti.
L'equivalenza in questione può essere verificata anche formalmente,
ad esempio utilizzando il tool `Edinburgh Concurrency Workbench `_,
o il :ref:`Concurrency WorkBench of the New Century ` (CWB-NC).
Ad esempio, utilizzando il CWB-NC, possiamo scrivere la specifica come segue:
.. code::
***********************************************************************
* ProducerConsumer requirements: PC
* 3 states: PC02, PC12, PC22, with 0 / 1 / 2 data of max 2 data
***********************************************************************
set Act = {deposit, withdraw}
proc PC02 = deposit.PC12
proc PC12 = deposit.PC22 + 'withdraw.PC02
proc PC22 = 'withdraw.PC12
mentre possiamo scrivere la modellazione con due buffer paralleli monodimensionali
così:
.. code::
***********************************************************************
* Buffer cell model: B
* cicle through in.'out.startagain; buffer is two cells in parallel
***********************************************************************
proc B = deposit.'withdraw.B
proc Buffer = (B | B)
un controllo di uguaglianza in bisimulazione di PC02 rispetto Buffer ci dice TRUE:
.. code:: console
...> cwb-nc ccs
/// omissis
cwb-nc> load pc.ccs
/// omissis
cwb-nc> eq -S bisim PC02 Buffer
Building automaton...
States: 8
Transitions: 14
Done building automaton.
TRUE
/// omissis