Rozszerzenia JML-a do weryfikacji programów wielowatkowych

Podobne dokumenty
Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Specyfikacje w praktyce na przykładzie JML-a. Sesja I

Specyfikacje formalne

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Programowanie obiektowe

Techniki zabezpieczania kodu - kontrola wyjatków. Temat VIII

Język Java wątki (streszczenie)

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Współbieżność w środowisku Java

Dokumentacja do API Javy.

Model pamięci. Rafał Skinderowicz

Język Java wątki (streszczenie)

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

WSPÓŁBIEŻNOŚĆ. MATERIAŁY:

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Referencje do zmiennych i obiektów

Programowanie współbieżne Laboratorium nr 12

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Programowanie obiektowe

Kurs programowania. Wykład 8. Wojciech Macyna

Dziedziczenie. dr Jarosław Skaruz

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Podstawy programowania w języku C++

Programowanie obiektowe

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Java. Programowanie Obiektowe Mateusz Cicheński

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Generatory. Michał R. Przybyłek

Wykład 8: Obsługa Wyjątków

Języki i Techniki Programowania II. Wykład 7. Współbieżność 1

Programowanie współbieżne Wykład 5. Rafał Skinderowicz

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Aplikacje w środowisku Java

Programowanie obiektowe

Aplikacje w środowisku Java

Diagramy klas. dr Jarosław Skaruz

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Rozdział 4 KLASY, OBIEKTY, METODY

Wstęp do programowania 2

Współbieżność w Javie

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

TEMAT : KLASY DZIEDZICZENIE

Wątki w Javie. Piotr Tokarski

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Podstawy współbieżności

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Zaawansowany kurs języka Python

Programowanie obiektowe

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Wykład 8: klasy cz. 4

Multimedia JAVA. Historia

procesów Współbieżność i synchronizacja procesów Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak

Platformy Programistyczne Podstawy języka Java

Programowanie obiektowe

Programowanie obiektowe

Monitory. Jarosław Kuchta

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Oracle PL/SQL. Paweł Rajba.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Wykład 5. Synchronizacja (część II) Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Aplikacje internetowe i rozproszone - laboratorium

Współbieżność w Javie

Definiowanie własnych klas

Java: interfejsy i klasy wewnętrzne

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Programowanie obiektowe

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Programowanie w języku Java WYKŁAD

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Programowanie obiektowe i zdarzeniowe

Sposoby przekazywania parametrów w metodach.

Programowanie i projektowanie obiektowe

Java Język programowania

Wykład 4: Klasy i Metody

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Projektowanie algorytmów rekurencyjnych

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Transkrypt:

Rozszerzenia JML-a do weryfikacji programów wielowatkowych 20 maja 2009

Plan prezentacji 1 Postawienie problemu Możliwości JML-a Problematyczne przeploty Wyrażanie zachowań bezpiecznych w programach wielowatkowych 2 Idea atomowości Teoria redukcji Liptona Atomowość i niezależność w teorii Liptona 3 Notacje już istniejace w JML-u 4 Statystyki Aleksander wystapień Lewandowski poszczególnych rozszerzeń

Możliwości JML-a Problematyczne przeploty Wyrażanie zachowań bezpiecznych Specyfikacja JML-owa metody extract() public class LinkedQueue { protected /*@ spec_public non_null @*/ LinkedNode head; protected /*@ spec_public non_null @*/ LinkedNode last; //@ public invariant head.value == null; /*@ public normal_behavior @ requires head == last; @ assignable \nothing; @ ensures \result == null; @ also public normal_behavior @ requires head!= last; @ assignable head, head.next.value; @ ensures head == \old(head.next) && \result == \old(head.next.value); @*/ public synchronized Object extract() { synchronized (head) { Object x = null; LinkedNode first = head.next; if (first!= null) { x = first.value; first.value = null; head = first; } return x; } }

Internal Interference Możliwości JML-a Problematyczne przeploty Wyrażanie zachowań bezpiecznych

External Interference Możliwości JML-a Problematyczne przeploty Wyrażanie zachowań bezpiecznych

Postawienie problemu Możliwości JML-a Problematyczne przeploty Wyrażanie zachowań bezpiecznych które metoda zdobędzie i zwolni w czasie wykonania chroniace części stanów obiektów Obiekty używane jako blokady i momenty w których te obiekty sa zablokowane Zbiory blokad trzymanych przez watek Fakt ochrony obiektu poprzez blokadę trzymana przez obecny watek

Specyfikacja ograniczeń danych Możliwości JML-a Problematyczne przeploty Wyrażanie zachowań bezpiecznych Jakie aliasy obiektu istnieja w środowisku Kto jest właścicielem obiektu Lokalność obiektu względem metody/watku Efekty wykonania metody na istniejacych lokacjach

Idea atomowości Idea atomowości Teoria redukcji Liptona Atomowość i niezależność w teorii Liptona Sekwencję instrukcji wykonywana przez dany watek nazwiemy atomowa jeżeli dla każdego wykonania programu zawierajacego tę sekwencję (być może przeplatana wykonaniami instrukcji innych watków) istnieje równoważne wykonanie w którym instrukcje rozważanej sekwencji wykonywane sa bezpośrednio po sobie.

Teoria redukcji Liptona Idea atomowości Teoria redukcji Liptona Atomowość i niezależność w teorii Liptona Fragment kodu, będacy sekwencja prymitywnych instrukcji wykonywanych przez jeden watek, nazywamy tranzycja. Intuicyjnie: prawym (lewym) spychaczem (right/left mover) nazywamy taka tranzycję α, dla której jeśli następnikiem (poprzednikiem) α jest tranzycja β należaca do innego watku, to α i β moga zostać zamienione i nie będzie miało to wpływu na stan wynikowy. Tranzycja spychajac a (commuting transition) nazywamy trakzycję która jest lewym lub prawym spychaczem.

Teoria redukcji Liptona c.d. Idea atomowości Teoria redukcji Liptona Atomowość i niezależność w teorii Liptona Program P, zawierajacy sekwencję tranzycji S, jest równoważny programowi P/S, w który S jest zamodelowane jako pojedyncza niepodzielna tranzycja wtedy i tylko wtedy gdy zbiór stanów końcowych P jest równy zbiorowi stanów końcowych P/S

Przykład Postawienie problemu Idea atomowości Teoria redukcji Liptona Atomowość i niezależność w teorii Liptona Rozważmy metodę m, która zajmuje blokadę, czyta zmienna chroniona przez tę blokadę, zmienia jej wartość po czym zwalnia blokadę. Załóżmy, że kolejne kroku tej metody sa przeplecione z tranzycjami E 1, E 2, E 3 wykonywanymi przez inne watki. Ponieważ akcje metody m sa spychaczami (zajęcie i zwolnienie blokady odpowiednio lewymi i prawymi, przypisanie do chronionej zmiennej obustronnym) więc istnieje równoważne wykonanie metody nie przeplecione z operacjami innych watków.

Idea atomowości Teoria redukcji Liptona Atomowość i niezależność w teorii Liptona Atomowość i niezależność w teorii Liptona Atomowym fragmentem kodu nazwiemy fragment pasujacy do wzorca R N? L, gdzie R oznacza zero lub więcej tranzycji będacych prawymi spychaczami, L zero lub więcej tranzycji będacych lewymi spychaczami, a N? zero lub jedna tranzycję nie będac a żadnym spychaczem. Niezależnym fragmentem kodu nazwiemy fragment pasujacy do wzorca I, gdzie I oznacza zero lub więcej tranzycji będacych obustronnymi spychaczami.

Notacje już istniejace w JML-u Notacje już istniejace w JML-u Aby uzyskać dostęp do zmiennej <ident> wszystkie blokady wymienione w <store-ref-list> musza być trzymane przez watek: <monitors-for-clause> ::= monitors_for <ident> <- <store-ref-list> ; \lockset(): obiekt typu JMLObjectSet reprezentujacy zbiór wszystkich blokad trzymanych przez watek.

Notacje już istniejace w JML-u locks l 1,..., l n <locks-clause> ::= locks <store-ref-list> ; Występuje w ciele specyfikacji po nagłówku (po requires). Stwierdza, że metoda blokuje (i zwalnia) tylko te blokady które sa wymienione. Zauważmy, że zachodzi: ensures \old(\lockset().has(l 1 ) &&... && \lockset().has(l n ) ==>\independent; Dzięki powyższej implikacji mamy dolne ograniczenie na zbiór blokad potrzebnych do tego, żeby metoda była niezależna.

lock_protected o Notacje już istniejace w JML-u <lock-protected-expression> ::= lock_protected(<store-ref>); Dostęp do obiektu wskazywanego przez o jest chroniony niepustym zbiorem blokad i watek trzyma je wszystkie. Chroniony jest obiekt, nie wskaźnik.

Modyfikator dostępu rep Notacje już istniejace w JML-u Do użycia w deklaracjach pól w klasach. Poza obiektem klasy nie może być referencji do tego miejsca na stercie. Czasem użycie takiego modyfikatora może umożliwić modularna weryfikację atomowości...

Przykład Postawienie problemu Notacje już istniejace w JML-u public class BetterLinkedQueue { protected /*@ spec_public non_null rep @*/ LinkedNode head; protected /*@ spec_public non_null rep @*/ LinkedNode last; //@ public invariant head.value == null; /*@ public normal_behavior @ requires head == last; @ locks this, head; @ assignable \nothing; @ ensures \result == null; @ also public normal_behavior @ requires head!= last; @ locks this, head; @ assignable head, head.next.value; @ ensures head == \old(head.next) && \result == \old(head.next.value); @*/ public /*@ atomic @*/ synchronized /*@ readonly @*/ Object extract() { synchronized (head) { /*@ readonly @*/ Object x = null; /*@ rep @*/ LinkedNode first = head.next; if (first!= null) { x = first.value; first.value = null; head = first; } return x; } }

Modyfikator dostępu readonly Notacje już istniejace w JML-u Do użycia we wszystkich deklaracjach referencji do obiektów. Obiekt wskazywan przez oznaczona referencję nie może byc przy jej użyciu modyfikowany. Przez aliasy może.

thread_local o Notacje już istniejace w JML-u <thread-local-expression> ::= thread_local(<store-ref>); Tylko dany watek może osiagn ać o poprzez łańcuch referencji. Użyteczne w modularnym weryfikowaniu atomowości, ponieważ dostęp do zminnych lokalnych dla watku jest niezależny. Zapewnia, że race condition nie wystapi. Pomocniczy operator: thread_safe(o) thread_local(o) lock_protected(o)

Przykład Postawienie problemu Notacje już istniejace w JML-u /*@ normal_behavior @ requires c!= null && \thread_local(c); @ assignable elementcount, elementdata; @ ensures elementcount == c.size() && \fresh(elementdata); @also @ exceptional_behavior @ requires c == null; @ assignable \nothing; @ signals (Exception e) e instanceof NullPointerException; @*/ public /*@ atomic @*/ Vector(Collection c) { elementcount = c.size(); elementdata = new Object[(int)Math.min((elementCount*110L)/100,Integer.MAX_VALUE)]; c.toarray(elementdata); }

Modyfikator atomic Notacje już istniejace w JML-u Jeśli metoda zostanie wywołana w stanie spełniajacym warunki wstępne to musi spełniać wymagania atomowości w sensie Liptona. Eliminuje przeploty internal interference. Może dziedziczyć sekcję krytyczna. Przykład...

Dziedziczenie blokady - przykład Notacje już istniejace w JML-u public class ArrayBlockingQueue<E> { private /*@ spec_public non_null rep @*/ final E[] items; //@ monitors_for items <- lock; private /*@ spec_public rep @*/ final ReentrantLock lock; /*@ normal_behavior @ requires lock.islocked() && 0 < i && i < items.length; @ ensures \result == \old((i + 1) % items.length) && \independent; @*/ final /*@ atomic @*/ int inc(int i) { return (++i == items.length)? 0 : i; }

Prefykat \independent Notacje już istniejace w JML-u Metoda jest niezależna, wtedy kiedy wszystkie tranzycje sa niezależne. Używany tylko w klauzuli ensures. Przykłady: operacje na zmiennych lokalnych względem watku, dostęp do zmiennych zablokowanych na rzecz watku Przykładowy kod...(poprzedni slajd)

Czekanie na spełnienie warunku Notacje już istniejace w JML-u Predykat when: <when-clause> ::= when <predicate> ; Znacznik commit

Notacje już istniejace w JML-u Czekanie na spełnienie warunku - przykład /*@ public normal_behavior @ locks this.lock; @ when count!= 0; @ assignable items[takeindex], takeindex, count; @ ensures \result == \old(items[takeindex]) && takeindex == \old(takeindex + 1) @ && count == \old(count - 1); @*/ public /*@ atomic @*/ E take() throws InterruptedException { final ReentrantLock lock = this.lock; lock.lockinterruptibly(); try { try { while (count == 0) notempty.await(); } catch (InterruptedException ie) { notempty.signal(); // propagate to non-interrupted thread throw ie; } /*@ commit: @*/ E x = extract(); return x; } finally { lock.unlock(); } }

Inne Postawienie problemu Notacje już istniejace w JML-u Należy pamiętać, że projekt pochodzi z czasów Javy 1.5. Obsługa klas dziedziczacych po interfejsie java.utli.concurrent.locks.lock - jest. Obsługa klasy java.util.concurrent.reentrantlock - jest.

Statystyki wystapień rozszerzeń Statystyki wystapień poszczególnych rozszerzeń Statystyki powodzenia weryfikacji poszczególnych rozszerzeń Klasy oznaczone * pochodza z pakietu java.util.concurrent z Javy 1.5

Statystyki wystapień poszczególnych rozszerzeń Statystyki powodzenia weryfikacji poszczególnych rozszerzeń Statystyki powodzenia weryfikacji rozszerzeń Klasy oznaczone * pochodza z pakietu java.util.concurrent z Javy 1.5