Concurrency-mønstre i indlejrede systemer Temadag om Embeddede systemer Teknologisk Institut, 6. december 2004



Relaterede dokumenter
Specifikation Abstrakt OO OS-API Rev Specifikation. Abstrakt, objektorienteret operativsystem-api

Real-time programming safety in Java and Ada

3C03 Concurrency: Model-based Design

A Profile for Safety Critical Java

Common Language Runtime. Multithreading

INGENIØRHØJSKOLEN I ÅRHUS Elektro- og IKT-afdelingen. I3PRG3 + I3DTM3 + I3ISY1-3. semester

Singleton pattern i Java

Software Construction 1 semester (SWC) Spørgsmål 1

Citrix CSP og Certificate Store Provider

PARALLELIZATION OF ATTILA SIMULATOR WITH OPENMP MIGUEL ÁNGEL MARTÍNEZ DEL AMOR MINIPROJECT OF TDT24 NTNU

Speciale. Evaluering af Java til udvikling af indlejrede realtidssystemer ved brug af en eksisterende Java Optimized Processor (JOP)

Software 1 with Java. Recitation No. 7 (Servlets, Inheritance)

DM507 Algoritmer og datastrukturer

PMDK PC-Side Basic Function Reference (Version 1.0)

Modern Concurrency Abstractions for C#

IBM Network Station Manager. esuite 1.5 / NSM Integration. IBM Network Computer Division. tdc - 02/08/99 lotusnsm.prz Page 1

Distribuerte Objekter. Våren 2010 Professor II Eric Jul F

DM507 Algoritmer og datastrukturer

Design by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater

Singleton pattern i C#

Processer og tråde. dopsys 1

Introduktion til design patterns.

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater

UML modelbaseret softwareudvikling af indlejrede systemer

F# - hvorfor, hvordan og til hvad? Rune Ibsen Jyske Bank

CONNECTING PEOPLE AUTOMATION & IT

CHAPTER 8: USING OBJECTS

Sesam Automationstrend. Spørgsmål til leverandørerne? New Automation Technology

IBM WebSphere Operational Decision Management

ECE 551: Digital System * Design & Synthesis Lecture Set 5

Programmering af sensor netværk

Netværksmålinger. - en introduktion! Netteknik. TCP - IP - Ethernet

Planen for idag. Synkroniseringsmekanismer. Krav til løsning. Kritiske regioner. Bagerens algoritme. Kritisk region via delt lager.

Hvem er vi? Kursus Introduktion. Kursuslærerne. Agenda for i dag

Integrated Total Facility Management for Real Estate, Infrastructure & Facility Management

Kursusarbejde 3 Grundlæggende Programmering

Black Jack --- Review. Spring 2012

Bemærk, der er tale om ældre versioner af softwaren, men fremgangsmåden er uændret.

2a. Conceptual Modeling Methods

Arkitektur principper og design mønstre til realisering af enterprise applikationer baseret på rige domænemodeller (og.net)

Miniprojekt2011. Formålet er at lære og indlære god objektorienteret programudvikling og programmering med Java, samt undervejs at opfylde studiekrav.

Portal Registration. Check Junk Mail for activation . 1 Click the hyperlink to take you back to the portal to confirm your registration

Introduction til.net remoting i C#

Mandatory Assignment 1

Processer og koordinering. dopsys 1

IBM WebSphere Operational Decision Management

CONNECTING PEOPLE AUTOMATION & IT

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

DM507 Algoritmer og datastrukturer

Webkorpora: Yahoo API og perl

Koordinering. dopsys

Det er muligt at chekce følgende opg. i CodeJudge: og

Introduktion til Microsoft R. Steen Dybboe, Pragmatic BI MsBIP 2017 Aarhus

Object-Relational Mapping

Embedded controller, almen.

Programmering i C. Lektion september 2009

Datatekniker med programmering som speciale H5

DM507 Algoritmer og datastrukturer

UML-Light (Note: UML-Light T133, ver. 2004) Finn Overgaard Hansen, IHA

Resource types R 1 1, R 2 2,..., R m CPU cycles, memory space, files, I/O devices Each resource type R i has W i instances.

Eksempel: et ordresystem note 5 Lagdeling s. 1

Processer og koordinering

DM507 Algoritmer og datastrukturer

Teknologispredning i sundhedsvæsenet DK ITEK: Sundhedsteknologi som grundlag for samarbejde og forretningsudvikling

Principper for Samtidighed og Styresystemer

Google App Engine. Google App Engine som platform. Claus Myglegaard Vagner og Jacob von Eyben

Abstrakte datatyper C#-version

METODER ARV KLASSER. Grundlæggende programmering Lektion 5

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

I profil-feltet kan imastra-kunder vælge om upload skal ske ligesom filerne var indsendt til mailboksen eller

IPv6 Application Trial Services. 2003/08/07 Tomohide Nagashima Japan Telecom Co., Ltd.

Hvilket sprog er hurtigst

Boost Concept Check Library

Web- og serverprogrammering

Sortering fra A-Z. Henrik Dorf Chefkonsulent SAS Institute

DET KONGELIGE BIBLIOTEK NATIONALBIBLIOTEK OG KØBENHAVNS UNIVERSITETS- BIBLIOTEK. Index

Schedulering. dopsys 1

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

Schedulering. dopsys 1

Styresystemer og tjenester

Kursusarbejde 2 Grundlæggende Programmering

Opsætning af Backup. Hvis programmet registreres korrekt vises nedenstående skærmbillede. Genstart herefter programmet.

Kursusgang 11. Oversigt: Sidste kursusgang Værktøjer til udvikling og implementering af HCI-design Oversigt over Java Swing

Databaseadgang fra Java

IT-Basecamp Real World Java EE Patterns Adam Bien. Real World Java EE Patterns, Adam Bien Copyright Lund&Bendsen A/S

Oracle PL/SQL. Overview of PL/SQL

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Forelæsning Uge 5 Mandag

Introduktion til OO* og UML

Patient Simulator DPSIMU2. Projektrapport

UNISONIC TECHNOLOGIES CO.,

applikation----x----odbc driver manager----foobar ODBC driver----foobar database

Objektorienteret Programmering

CURRICULUM VITAE. Personlige oplysninger. Michael Alrøe. Uddannelse. Kurser og efteruddannelse. Michael Alrøe. Navn Fødselsår 1964 LinkedIn

Rigtig SQL Programmering

Softwareudvikling: Miljøer

Operativsystemer - dopsys

Hvad er et distribueret objekt? Plan Objekter, objektreferencer, metoder, parameteroverførsel. Objekter: notation

Transkript:

Concurrency-mønstre i indlejrede systemer Temadag om Embeddede systemer Teknologisk Institut, 6. december 2004 Finn Overgaard Hansen, Ingeniørhøjskolen i Århus E-mail: foh@iha.dk Version: 6-12-2004 Agenda Problemet Ønskerne Løsningsforslag RTOS OO abstraktioner Opsummering Slide 2 1

Problemet Udvikling af embeddede systemer Programmeres i C og i stigende omfang i C++ Stigende anvendelse af Objektorienterede metoder Anvendelse af UML som modelleringssprog og som dokumentation [UML-2.0] Anvendelse af et Realtidsoperativsystem (RTOS), der har et C API Sproget C++ mangler dsv. sproglige konstruktioner, der understøtter multiprogrammering Impedansproblemet OOA/OOD modellering af tråde og kommunikation med klasser i C++ Implementering vha. RTOSs C-API Slide 3 Ønskerne Vi vil gerne kunne foretage en sømløs implementering af vores OO design og dets concurrency mekanismer Vi vil gerne kunne udvikle embeddede systemer på en udviklingsmaskine (f.eks. en Windows PC eller en Linux PC), der er forskellig fra target-maskinen (µc/µp) Der er ofte langt bedre værktøjer til rådighed på denne platform Vi vil gerne kunne teste så meget som muligt af det embeddede system på udviklingsmaskinen Med teststubbe der simulerer den rigtige HW Med anvendelse af maskinens operativsystem for test af concurrency Det skal efterfølgende være nemt at flytte applikationen over på targetmaskinen Det er ofte også ønskeligt at kunne portere applikationen til en anden targetplatform Medfører meget ofte også skift af RTOS Man ønsker at denne portering kun vedrører få og lokaliserede dele af koden Slide 4 2

OO RTOS indkapsling OO RTOS Abstraction Layer C++ application RTOS (C) C++ application RTOS (C) µprocessor/ µcontroller µprocessor/ µcontroller Slide 5 OO RTOS Abstraction Layer Application classes OO RTOS Abstraction Layer Real Time Operating System (RTOS) or Real Time Kernel Slide 6 3

Nogle løsningsmuligheder Anvendelse af Concurrency mønstre Thread, Monitor [POSA2], Active Object [POSA2] Udviklet som Wrapper Facades til RTOS, [POSA2] mønster Anvendelse af ACE framework [ACE] En C++ open source implementering af [POSA2] wrapper facade mm. Anvendelse af et Real-Time CASE værktøj med kodegenerering Rhapsody fra firmaet [ILogix] Rational Rose Technial Developer fra [IBM-Rational] (den tidligere Rational Rose Real-Time) JThreads/C++, Java-like Threads for C++ JThreads/C++ is a registered trademark of IONA Technologies, [IONA], Version 2.0.0b1, 30 Oct 2003. Part of Orbacus ORB available for Windows, Unix, Linux, Solaris Slide 7 Two useful OS Abstractions RTOS abstraction Thread virtual void run() #enter() #exit() Monitor «Thread» User thread class +run() «Monitor» User class +operation1() +operation2() Slide 8 4

Monitor Object Multiple threads of control accessing the same object concurrently UML Stereotype Annotations «Thread» Thread1 «Monitor» Passive object «Thread» Thread2 Active objects «Thread» Thread3 Slide 9 Multiprogrammerings eksempel (UML 2.0) «Monitor» Input Device «Thread» XX Output Device1 «Thread» Producer «Monitor» FifoQueue «Monitor» Configuration Data «Thread» Consumer «Thread» Configuration maintainer Output Device2 Slide 10 5

RTKernel Thread Class (C++) class Thread public: Thread(char* threadname,int threadpriority, int threadstacksize,); virtual void run()=0; // NB! Pure virtual virtual void start(); void sleep(int millisecs) virtual ~Thread(); static void RTKAPI threadmapper(void* p) ((Thread *)p)->run(); // call of task loop function private: int stacksize; ; int priority: char* name; RTKTaskHandle handle; RTKernel: RTOS fra [OnTime] Slide 11 RTKernel Thread implementation // Inheritance version Thread::Thread(char* threadname,int threadpriority, int threadstacksize) name= threadname; priority= threadpriority; stacksize= threadstacksize; char* name; handle= 0; void Thread::start() // create & start thread if (handle ==0) handle= RTKRTLCreateThread(Thread::threadMapper, priority,stacksize,0, this, name); void Thread::sleep(int millisec) RTKDelay(CLKMilliSecsToTicks(milliSec)); Slide 12 6

Anvendelse af Thread Class i Producer (1) #include Thead.h class Producer : public Thread public: Producer(char* threadname,int threadpriority, int stacksize) : Thread(threadName,threadPriority,threadStackSize) ~Producer(); virtual void run(); private: // ; // implementation of thread loop Slide 13 Anvendelse af Thread Class i Producer (2) class Producer : public Thread public: Producer(char* threadname, int threadpriority, int stacksize, InputDevice *pid,configurationdata *pcd,fifoqueue *pfq) : Thread(threadName,threadPriority,threadStackSize), pinputdevice(pid), pconfigurationdata(pcd), pfifoqueue(pfq) ~Producer(); virtual void run(); // implementation of thread loop private: InputDevice *pinputdevice; ConfigurationData *pconfigurationdata; FifoQueue *pfifoqueue; ; Slide 14 7

Producer Thread - loop void Producer::run() int sleeptime; while (1) sleeptime= pconfigurationdata->getsleeptime(); speed= pinputdevice->getvalue(); // do some calculation pfifoqueue->put(speed); sleep(sleeptime); Slide 15 Example of a main program int main() // create monitor objects InputDevice inputdevice; ConfigurationData configurationdata; FifoQueue fifoqueue; ; // create Producer thread Producer myproducer( ProducerThread, MAX_PRIORITY, StackSize5k, &inputdevice, &configurationdata,&fifoqueue); // create other threads // Consumer myconsumer =. // start treads myproducer.start(); myconsumer.start(); // main task loop while (1) ; Slide 16 8

Monitor Object Pattern Structure (POSA2) Client 2..* Monitor Object sync_method1() sync_methodn() enter() exit() Monitor uses 1 * uses 1 * Monitor Condition wait() notify() notify_all() [POSA2] Needed to implement wait in a monitor Slide 17 Implementation Strategier for simpel Monitor «Monitor» Passive object Without use of The Scoped Locking Idiom Monitor #enter() #exit() Passive object Operation() operation() mymonitor.enter() // critical section mymonitor.exit() Passive object Operation() operation() enter() // critical section exit() 1 mymonitor Monitor enter() exit() Slide 18 9

Problemer med Monitor operationer Every public monitor operation accessed by clients should start with acquiring the lock (enter monitor or acquire) and end with releasing the lock (exit monitor or release) The programmer could forget it in some return path The solution is not exception-safe Slide 19 Solution: Scoped Locking C++ Idiom (POSA2) Define a guard class whose constructor acquires a lock when control enters a scope and whose destructor automatically releases the lock when control leaves the scope void MonitorClassX::operation() Thread_Mutex_Guard myguard(*threadmutex); // Critical section code // return; // destructor called automatically [POSA2] Slide 20 10

Anvendelse af Guard class «Monitor» UserClass 1 «uses» 1 Et objekt pr. igangværende operationskald Thread_Mutex_Guard Thread_Mutex_Guard() ~Thread_Mutex_Guard() acquire(): void release(): void 1 Thread_Mutex Thread_Mutex() ~Thread_Mutex() acquire(): void release(): void acquire/release eller enter/exit [POSA2] Slide 21 Thread_Mutex_Guard Class class Thread_Mutex_Guard public: Thread_Mutex_Guard(Thread_Mutex &lock) : lock_(&lock), owner_(false) acquire(); void acquire() lock_->acquire(); owner_=true; void release() if (owner_) owner_=false; lock_->release(); ~Thread_Mutex_Guard() release(); private: Thread_Mutex *lock_; // Pointer to our lock bool owner_; // is lock held by this object? [POSA2] ; // disallowing copy and assignment Thread_Mutex_Guard(const Thread_Mutex_Guard &); void operator=(const Thread_Mutex_Guard &); Slide 22 11

Thread_Mutex Example (Solaris imp.) class Thread_Mutex public: Thread_Mutex() mutex_init(&mutex_,usync_thread,0); ~Thread_Mutex() mutex_destroy(&mutex_); void acquire() mutex_lock(&mutex_); void release() mutex_unlock(&mutex_); private: // Solaris-specific Mutex mechanism mutex_t mutex_; ; // disallow copying and assignment Thread_Mutex(const Thread_Mutex &); void operator=(const Thread_Mutex &); friend class Thread_Condition; [POSA2] Slide 23 Tread_Condition Example (Solaris imp.) class Thread_Condition public: Thread_Condition(const Thread_Mutex &m) : mutex_(m) cond_init(&cond_, USYNC_THREAD, 0); ~Thread_Condition() cond_destroy(&cond_); void wait(time_value *timeout= 0) cond_timedwait(&cond_, &mutex_.mutex_, timeout==0? 0 : timeout->msec()); void notify() cond_signal(&cond_); void notify_all() cond_broadcast(&cond_); private: condt_t cond_; // SOLARIS condition variable const Thread_Mutex &mutex_; ; [POSA2] Slide 24 12

Abstract Factory (GoF) AbstractFactory Client CreateProductA() CreateProductB() AbstractProductA ConcreteFactory1 CreateProductA() CreateProductB() ConcreteFactory2 CreateProductA() CreateProductB() ProductA2 ProductA1 AbstractProductB «create» ProductB2 ProductB1 «create» Slide 25 Anvendelse af AbstractFactory «Singleton» RTOSFactory createthread() createmonitor() // etc. Client Thread RTKernelThread Monitor Win32Factory createthread() createmonitor() RTKernelFactory createthread() createmonitor() RTKernelMonitor Slide 26 13

Main program med abstract factory int main(int argc, char *argv[]) RTOSFactory *rtosfactory; //.. if (strcmp(osstring, RTKernel )==0) rtosfactory= RTKernelFactory::Instance(); else if (strcmp(osstring, Win32 ) ==0) rtosfactory= Win32Factory::Instance(); // Create of Monitor objects InputDevice inputdevice; ConfigurationData configurationdata; FifoQueue fifoqueue; Producer myproducer(&inputdevice,&configurationdata,&fifoqueue); Thread *producertread= rtosfactory->createthread(myproducer, ProducerThread, HIGH_PRIORITY, StackSize5k); // etc. Slide 27 To alternative løsninger Som i det forrige eksempel: Producer myproducer(&inputdevice,&configurationdata,&fifoqueue); Thread *producertread= rtosfactory->createthread(myproducer, ProducerThread, HIGH_PRIORITY, StackSize5k); Alternativt integreret i Producer klassen Producer::Producer(&inputDevice,&configurationData,&fifoQueue) producertread= rtosfactory->createthread(this, ProducerThread, HIGH_PRIORITY, StackSize5k); Slide 28 14

«invoke» POSA2 Active Object Design Pattern Proxy method_1() method_n() 1 1 1 1 Scheduler dispatch() insert() Activation List insert() remove() «instantiate» «obtain result from» Client Future «instantiate» «write to» Concrete MethodReq1 Method Request can_run() call() * «execute» Concrete MethodReqN Servant method_1() method_n() [POSA2] Slide 29 Rhapsody OSAL: OS Abstraction Layer The OSAL consists of a set of interfaces (abstract classes) that provide all the required operating system services for the application, including: Tasking services Synchronization services Message queues Communication port Timer service OSAL Slide 30 15

Rhapsody supporterede operativsystemer C++ Borland Linux Microsoft, MicrosoftDLL MicrosoftWinCE MSStandardLibrary OsePPCDiab, OseSFK PsosPPC, PsosX86 QNXNeutrinoCW, QNXNeutrinoGCC Solaris2, Solaris2GNU VxWorks C Microsoft PsosPPC PsosX86 VxWorks Java JDK Slide 31 Portering af Rhapsody til MIT_OS <env>=mit_os Kræver udvikling af disse filer Slide 32 16

Java JThreads/C++ (1) C++ Java-like Threads for C++ Slide 33 Java JThreads/C++ (2) C++ Slide 34 17

Java Character Buffer (1) public class CharacterBuffer private char[] data_ = null; private int len_ = 0; synchronized public void addchar(char c) if(data_ == null len_ == data_.length) byte[] newdata = new byte[len_+128]; if (data_!= null) System.arraycopy(data_, 0, newdata, 0, len_); data_ = newdata; data_[len_++] = c; Slide 35 C++ JTreads CharacterBuffer (2) class CharacterBuffer : public JTCMonitor char* data_; int len_; int max_; public: CharacterBuffer(): data_(0), len_(0), max_(0) ~CharacterBuffer()delete[] data_; void addchar(char c) JTCSynchronized synchronized(*this); if (len_ >= max_) char* newdata = new char[len_+128]; memcpy(newdata, data_, len_); delete[] data_; data_ = newdata; max_ += 128; data_[len_++] = c; Slide 36 18

Opsummering Anvendelse af et OO RTOS abstraktionslag kan medføre en sømløs implementering af et OO design Anvendelse af Thread og Monitor konceptet giver en mere sikker (typecheck) og simplere multiprogrammering Der findes flere løsningsmuligheder Concurrency mønstre er en hjælp ved udvikling af eget OO RTOS lag og ved anvendelse af kommercielle eller Open Source løsninger Applikationerne bliver dog afhængige af det anvendte OO RTOS lag Slide 37 References [POSA2] Pattern-Oriented Software Architecture Volume 2. Patterns for Concurrent and Networked Objects. Douglas Schmidt, Michael Stal, Hans Rohnert, Frank Bushmann, Wiley 2000 [GoF] Design Patterns, Gamma et.al, Addison-Wesley 1995 [UML-2.0]: Unified Modeling Language Ver. 2.0 se www.omg.org/uml [ACE]: Adaptive Communication Environment - www.cs.wustl.edu/~schmidt/ace.html [IONA]: www.iona.com/devcenter/orbacus/jtc.htm [ILogix]: www.ilogix.com [IBM-Rational]: http://www- 306.ibm.com/software/awdtools/developer/technical/ [OnTime] Embedded RTOS for x86 systems, http://www.ontime.de/ Slide 38 19