1 / 58

Προγραμματισμός Αξιοπιστίας

Προγραμματισμός Αξιοπιστίας. Τεχνικές προγραμματισμού για την εκπόνηση αξιόπιστων συστημάτων λογισμικού. Στόχοι. Περιγραφή τεχνικών προγραμματισμού για αξιόπιστη ανάπτυξη του συστήματος Συζήτηση της αποφυγής λαθών με κατασκευή ελαχιστοποίησης επιρεπούς σε λάθη

Download Presentation

Προγραμματισμός Αξιοπιστίας

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Προγραμματισμός Αξιοπιστίας • Τεχνικές προγραμματισμού για την εκπόνηση αξιόπιστων συστημάτων λογισμικού.

  2. Στόχοι • Περιγραφή τεχνικών προγραμματισμού για αξιόπιστη ανάπτυξη του συστήματος • Συζήτηση της αποφυγής λαθών με κατασκευή ελαχιστοποίησης επιρεπούς σε λάθη • Να περιγράψουμε αρχιτεκτονικές που δέχονται κρίση για λάθη • Να δείξουμε πως χειρισμός κατ΄εξαίρεση μπορεί να χρησιμοποιηθεί για την παραγωγή εύρωστων προγραμμάτων

  3. Θέματα • Τεχνικές αποφυγής λαθών • Αντοχή σε λάθη και ανθεκτικές σε λάθη αρχιτεκτονικές • Χειρισμός κατ’ εξαίρεση και διαχείριση • Αμυντικός προγραμματισμός • Παραδείγματα προγραμμάτων παρουσιάζονται σε Ada και C++

  4. Αξιοπιστία Λογισμικού • Γενικά, όλοι οι πελάτες αναμένουν να έχουν λογισμικό το οποίο είναι αξιόπιστο. Για μη - κρίσιμες εφαρμογές όμως, μπορεί να αποδέχονται κάποιες αστοχίες του συστήματος. • Ορισμένες εφαρμογές όμως έχουν υψηλές απαιτήσεις αξιοπιστίας και πρέπει να χρησιμοποιηθούν ειδικές προγραμματιστικές τεχνικές

  5. Επίτευξη Αξιοπιστίας • Αποφυγή λαθών • Το λογισμικό αναπτύσσεται με τέτοιο τρόπο ώστε να μην περιέχει λάθη • Εύρεση λαθών • Η διαδικασία ανάπτυξης οργανώνεται με τέτοιο τρόπο ώστε τα λάθη στο λογισμικό να βρίσκονται εύκολα και να επισκευάζονται πριν φθάσουν στον καταναλωτή • Αντοχή σε λάθη • Το λογισμικό σχεδιάζεται έτσι ώστε λάθη στο τελικό προϊόν να μην έχουν ως αποτέλεσμα την πλήρη κατάρρευση του συστήματος

  6. Αποφυγή Λαθών • Υπάρχουν σύγχρονες μέθοδοι της τεχνολογίας λογισμικού που επιτρέπουν την παραγωγή λογισμικού χωρίς λάθη. • Λογισμικό χωρίς λάθη σημαίνει συμβατότητα με τις προδιαγραφές. Δεν σημαίνει λογισμικό το οποίο πάντα κάνει το σωστό αφού μπορεί να υπάρχουν λάθη στις προδιαγραφές • Το κόστος για παραγωγή λογισμικού χωρίς λάθη είναι πολύ υψηλό. Είναι αποτελεσματικό ως προς αυτό μόνο σε ορισμένες περιπτώσεις. Πιθανό να είναι φθηνότερη η αποδοχή κάποιων λαθών

  7. Κόστη Απομάκρυνσης Λαθών

  8. Ανάπτυξη Λογισμικού χωρίς Λάθη • Απαιτείται ακριβής (τυπική) εξειδίκευση • Η πληροφορία που κρύβεται στον σχεδιασμό λογισμικού είναι σημαντική • Πρέπει να χρησιμοποιηθεί προγραμματιστική γλώσσα με ακριβείς εκφράσεις και έλεγχο • Εκτεταμένη χρήση επαναλήψεων σε όλα τα στάδια της διαδικασίας • Απαιτεί οργανωτική δέσμευση για ποιότητα • Εκτεταμένος και προσεκτικός έλεγχος του συστήματος είναι απαραίτητος

  9. Ada και C++ • Η Ada έχει σχεδιασθεί για μεγάλης κλίμακας προβλήματα τεχνολογίας λογισμικού και είναι ακριβής γλώσσα. Παρόλα αυτά υπάρχουν μόνο λίγοι μεταγλωττιστές για προσωπικούς Η/Υ • Η C++ χρησιμοποιείται ευρύτατα για ανάπτυξη. Συνδυάζει την αποτελεσματικότητα γλώσσας χαμηλού επιπέδου (C) με αντικειμενοστραφή προγραμματισμό. Υπάρχει καλύτερος έλεγχος τύπων από την C αλλά όχι καλύτερος από την Ada

  10. Δομημένος Προγραμματισμός • Πρωτοσυζητήθηκε στο 1970's • Προγραμματισμός χωρίς gotos • While βρόχοι and if εντολές είναι οι μόνοι τρόποι ελέγχου ροής. • Σχεδιασμός Top-down. • Σημαντικός γιατί προώθησε σκέψεις και συζητήσεις σχετικές με προγραμματισμό.

  11. Δομές Επηρεπείς σε Λάθη • Αριθμοί Floating-point • Έντονα μη ακριβείς. Η έλλειψη ακρίβειας μπορεί να οδηγήσει σε άστοχες συγκρίσεις • Δείκτες • Οι δείκτες που αναφέρονται σε λάθος περιοχές μνήμης οδηγούν σε καταστροφή δεδομένων. Η χρήση ψευδονύμων είναι δύσκολη στην κατανόηση και αλλαγή προγραμμάτων • Δυναμική κατανομή μνήμης • Η κατανομή μπορεί να δημιουργήσει υπερφόρτωση μνήμης • Παραλλελισμός • Μπορεί να οδηγήσει σε λάθη εξαιτίας μη αναμενομένων αλληλεπιδράσεων

  12. Δομές Επηρεπείς σε Λάθη • Επανάληψη • Τα λάθη στην επανάληψη προκαλούν υπερφόρτωση μνήμης • Διακοπές • Προκαλούν τον τερματισμό μίας κρίσιμης διαδικασίας και κάνουν το πρόγραμμα δυσκατανόητο. Είναι συγκρίσιμα με τις εντολές goto. • Δεν συνίσταται ότι αυτές οι δομές πρέπει να αποφεύγονται αλλά πρέπει να χρησιμοποιούνται με μεγάλη προσοχή.

  13. Απόκρυψη Πληροφορίας • Η πληροφορία πρέπει να είναι εκτεθιμένη στα μέρη εκείνα του προγράμματος όπου είναι απαραίτητη. Αυτό σημαίνει ότι απαιατείται η κατασκευή αντικειμένων και αφαιρετικών τύπων δεδομένων που διατηρούν την κατάσταση και τις λειτουργίες αυτής της κατάστασης • Αυτό οδηγεί σε αποφυγή λαθών για τους ακόλουθους τρεις λόγους : • πιθανότητα καταστροφής πληροφορίας από ατύχημα • η πληροφορία περικλείεται από ‘firewalls’ ώστε τα προβλήματα δεν διαχέονται σε άλλα μέρη του προγράμματος • όσο η πληροφορία είναι τοπική, ο προγραμματιστής ωθείται να κάνει λάθη και οι ελεγκτές να βρουν τα λάθη

  14. Τύποι Δεδομένων • Κάθε στοιχείο προγράμματος πρέπει να επιτρέπει πρόσβαση στα δεδομένα τα οποία απαιτούνται για την υλοποίηση της λειτουργίας του • Η αναπαράσταση τύπου δεδομένων πρέπει να συμφωνείται από τους χρήστες αυτού του τύπου • Η Ada, Modula-2 και C++ προσφέρουν υποστήριξη για απόκρυψη πληροφορίας • Ο τύπος συστήματος χρησιμοποιείται για την βελτίωση αναγνωσιμότητας του προγράμματος με απευθείας μοντελοποίηση των οντοτήτων του πραγματικού κόσμου

  15. Δηλώσεις Τύπων • Δηλώσεις τύπων στην C++ • typedef enum { red, redamber, amber, green} TrafficLightColour ;TrafficLightColour ColourShowing, NextColour ; • Δηλώσεις τύπων στην Ada • type POSITIVE is INTEGER range 1..MAXINT ; • type OIL_STATUS is new BOOLEAN ;type DOOR_STATUS is new INTEGER ;type FUEL_STATUS is new BOOLEAN ;

  16. Αντικείμενα και Αφαιρετικοί Τύποι Δεδομένων • Υλοποιούνται στην C++ ως αντικείμενα και στην Ada ως πακέτα • Το όνομα του τύπου δηλώνεται μέσα στο αντικείμενο ή ADT • Οι λειτουργίες τύπων ορίζονται ως procedures ή συναρτήσεις. • Η αναπαράσταση τύπου ορίζεται στο ιδιωτικό μέρος • Οι βασικές αφαιρετικές δομές δεδομένων μπορεί να παραμετροποιηθούν με χρήση του ονόματος του τύπου.

  17. Εξειδικεύσεις της Ada για μία Ακέραια Ουρά package Queue is type T is private ; procedure Put (IQ : in out T; X: INTEGER); procedure Remove (IQ : in out T; X : out INTEGER); function Size (IQ : T ) return NATURAL; private type Q_RANGE is range 0..99 ; type Q_VEC is array ( Q_RANGE ) of INTEGER ; type T is record The_queue: Q_VEC ; front, back : Q_RANGE ; end record; end Queue;

  18. Δήλωση Κλάσεων Ουράς στην C++ class Queue { public: Queue () ; ~Queue () ; void Put ( int x ) ; // adds an item to the queue int Remove () ; // this has side effect of changing the queue int Size( ) ; // returns number of elements in the queue private: int front, back ; int qvec [100] ; } ;

  19. Γενικά • Η συμπεριφορά των αντικειμένων και ADTs τα οποία συντίθενται από άλλα αντικείμενα ή ADTs είναι συχνά ανεξάρτητη από τον τύπο των συμπεριλαμβανομένων αντικειμένων • Τα Generics είναι ένας τρόπος για συγγραφή γενικευμένων, παραμετροποιημένων ADTs και αντικειμένων να οποία πρέπει να χρησιμοποιηθούν αργότερα με ειδικούς τύπους • Και η Ada και C++ έχουν δυνατότητες για ορισμούς βασικών τύπων και κλάσεων

  20. Δήλωση σε Ada για μία Βασική Ουρά generic type ELEM is private ; type Q_SIZE is range <> ; package Queue is type T is private ; procedure Put (IQ : in out T; X: ELEM ); procedure Remove (IQ : in out T; X : out ELEM ); function Size (IQ : in T ) return NATURAL ; private type Q_VEC is array (Q_SIZE) of ELEM ; type T is record The_queue: Q_VEC ; Front : Q_SIZE := Q_SIZE’FIRST ; Back: Q_SIZE := Q_SIZE’FIRST ; end record; end Queue;

  21. Βασική Ουρά στην C++ template <class elem> class Queue { public: Queue ( int size = 100 ) ; // default to queue of size 100 elements ~Queue () ; void Put ( elem x ) ; elem Remove ( ) ; // this has side effect of changing queue int Size ( ) ; private: int front, back ; elem* qvec ; } ;

  22. Εισαγωγή Generics • Γίνεται κατά την διάρκεια της μεταγλώττισης και κατά συνέπεια είναι δυνατός ο έλεγχος τύπου • Ada • type IQ_SIZE is range 0..49 ; type LQ_SIZE is range 0..199 ;package Integer_queue is new Queue (ELEM => INTEGER, Q_SIZE => IQ_SIZE ) ;package List_queue is new Queue (ELEM => List.T, Q_SIZE => LQ_SIZE ) ; • C++ • //Assume List has been defined elsewhere as a typeQueue <int> Int_queue (50) ;Queue <List> List_queue (200) ;

  23. Αντοχή σε Λάθη • Σε κρίσιμες καταστάσεις τα συστήματα λογισμικού πρέπει να είναι ανθεκτικά σε λάθη • Αντοχή σε λάθη σημαίνει ότι το σύστημα μπορεί να συνεχίσει την λειτουργία του ανεξάρτητα από αστοχία συστήματος • Ακόμα και αν το σύστημα έχει αποδειχθεί να είναι ανθεκτικό σε λάθη, πρέπει να είναι ανθεκτικό ακόμα και όταν η εξειδίκευση και αξιολόγηση είναι λάθος

  24. Δραστηριότητες Αντοχής σε Λάθη • Εύρεση Αστοχίας • Το σύστημα μπορεί να βρεί ότι συνέβη μία αστοχία • Εκτίμηση Καταστροφής • Τα μέρη του συστήματος τα οποία έχουν επηρεαστεί από την αστοχία πρέπει να αναζητηθούν • Ανάκτηση Λάθους • Το σύστημα πρέπει να επαναφέρει την κατάστασή του σε μία γνωστή ασφαλή κατάσταση • Επιδιόρθωση Λάθους • Το σύστημα πρέπει να τροποποιηθεί για να αποφευχθεί επανάληψη του λάθους. Καθώς ορισμένα λάθη είναι προσωρινά, αυτό συχνά δεν είναι απαραίτητο.

  25. Εμφάνιση Λάθους • Πολλές αστοχίες λογισμικού είναι παροδικές και εξαρτώμενες από κάποια δεδομένα. Η λειτουργία μπορεί να συνεχισθεί με επανεκκίνηση του συστήματος. • Εάν αυτό είναι αδύνατο, απαιτείται επαναμορφοποίηση του συστήματος με την αντικατάσταση στοιχείων λογισμικού χωρίς το σύστημα να σταματήσει.

  26. Αντοχή σε Λάθη του Υλικού • Εξαρτάται από το triple-modular redundancy (TMR) • Υπάρχουν τρία επαναλαμβανόμενα παρόμοια στοιχεία που παίρνουν την ίδια είσοδο και των οποίων οι έξοδοι συγκρίνονται • Εάν μία έξοδος είναι διαφορετική αγνοείται και υποθέτουμε ότι έχει συμβεί αστοχία στοιχείου • Βασίζεται ότι οι περισσότερες αστοχίες οφείλονται σε αστοχίες στοιχείων και όχι αστοχίες σχεδιασμού και στην χαμηλή πιθανότητα για ταυτόχρονη αστοχία πολλών στοιχείων

  27. Αξιοπιστία Λογισμικού με TMR

  28. Αναλογίες στο Λογισμικό • N-μορφή προγραμματισμού • Η ίδια εξειδίκευση υλοποιείται σε ένα αριθμό διαφορετικών εκδόσεων. Όλες οι εκδόσεις υπολογίζουν ταυτόχρονα και η κύρια έξοδος επιλέγεται. Αυτή είναι η συχνότερα προτιμώμενη μέθοδος. Όμως δεν παρέχει αντοχή σε λάθη αν υπάρχουν λάθη εξειδίκευσης • Βlocks επανάκτησης • Οι εκδόσεις εκτελούνται ακολουθιακά. Η έξοδος η οποία αντιστοιχεί σε ένα έλεγχο αποδοχής επιλέγεται. Η αδυναμία είναι να βρούμε τον έλεγχο αποδοχής.

  29. N-έκδοσης Προγραμματισμός

  30. N-έκδοσης Προγραμματισμός • Οι διαφορετικές εκδόσεις του συστήματος σχεδιάζονται και υλοποιούνται από διαφορετικές ομάδες. Υποθέτουμε ότι η πιθανότητα να γίνουν τα ίδια λάθη είναι μικρή • Όμως η εμπειρία λέει ότι οι ομάδες με κοινό τρόπο δεν κατανοούν σωστά τις εξειδικεύσεις και χρησιμοποιούν τους ίδιους αλγόριθμους στα συστήματά τους

  31. Βlocks Ανάκτησης

  32. Βlocks Ανάκτησης • Χρήση διαφορετικού αλγόριθμου για κάθε έκδοση για να ελαχιστοποιηθεί η πιθανότητα για κοινά λάθη • Όμως, ο σχεδιασμός του τεστ αποδοχής ε’ιναι δύσκολος και πρέπει να είναι ανεξάρτητος του υπολογισμού που χρησιμοποιείται • Όπως ο N-εκδόσεων προγραμματισμός, είναι δυνατά τα λάθη εξ αιτίας της εξειδίκευσης

  33. Χειρισμός κατ’ Εξαίρεση • Ένα πρόγραμμα κατ΄εξαίρεση είναι ένα λάθος ή κάποιο απρόσμενο γεγονός όπως η πρώτη της τάσης • Οι δομές χειρισμού κατ’ εξαίρεση επιτρέπουν τον χειρισμό των γεγονότων χωρίς συνεχή έλεγχο της κατάστασης για την ανίχνευση εξαιρέσεων • Η χρήση κανονικών εντολών ελέγχου για την ανεύρεση εξαιρέσεων σε μία ακολουθία ένθετων κλήσεων προσθέτει πολλές επιπλέον ρντολές και κόστος στον προγραμματισμό

  34. Εξαιρέσεις σε Ένθετες Κλήσεις Συναρτήσεων

  35. Χειρισμός Εξαιρέσεων στην Ada • Η Ada έχει ενσωματωμένο μηχανισμό εξαιρέσεων και έτσι ονόματα μπορούν να συνδεθούν με εξαιρέσεις • Η μεταφορά προσοχής σε εξαιρέσεις ονομάζεται ανάσυρση εξαίρεσης (keyword raise) • Μία μονάδα προγράμματος σε Ada μπορεί να έχει ένα χειριστή εξαιρέσεων που είναι τμήμα του προγράμματος που ορίζει πως επεξεργάζονται οι εξαιρέσεις • Όταν ανασύρεται μία εξαίρεση ο κώδικας μεταφέρεται στον χειριστή εξαιρέσεων αυτόματα

  36. Ενσωματωμένες Εξαιρέσεις στην Ada • CONSTRAINT_ERROR • Διαπιστώνεται όταν αποδίδεται μία τιμή σε μία μεταβλητή έξω από την περιοχή • NUMERIC_ERROR • Διαπιστώνεται όταν ένα λάθος εμφανίζεται σε μία αριθμητική πράξη (π.χ. διαίρεση με μηδέν) • PROGRAM_ERROR • Όταν παραβιάζεται μία δομή ελέγχου • STORAGE_ERROR • Όταν γίνεται υπερφόρτωση δυναμικής αποθήκευσης • TASKING_ERROR • Διαπιστώνεται όταν μία επικοινωνία μεταξύ διεργασιών αποτυγχάνει.

  37. Χειρισμός Εξαιρέσεων στην C++ • Το Keyword throw σημαίνει ανάσυρση μίας εξαίρεσης. Ο χειριστής υποδεικνύεται με το keyword catch • Οι εξαιρέσεις ορίζονται ως κλάσεις και μπορούν να κληρονομήσουν ιδιότητες από άλλες κλάσεις εξαιρέσεων • Συνήθως, οι εξαιρέσεις χειρίζονται πλήρως στο μπλοκ που αναδεικνύονται και δεν αφήνεται διάδοση τους • Όλες οι εξαιρέσεις ορίζονται από τον χρήστη και δεν είναι ενσωματωμένες στο σύστημα

  38. Έλεγχος Θερμοκρασίας • Ελέγχει ένα καταψύκτη και κρατάει την θερμοκρασία του σε καθορισμένη περιοχή • Ανοίγει και κλείνει την ψυκτική αντλία • Ενεργοποιεί τον συναγερμό όταν η θερμοκρασία ξεπερνά ένα μέγιστο • Χρησιμοποιεί εξωτερικές οντότητες: αντλία, θερμοκρασία, αισθητήρα, συναγερμό • Η εξωτερική διαμεριζόμενη κατάσταση κρατιέται σε ένα πακέτο που ονομάζεται Globals (στην Ada)

  39. Ελεγκτής Καταψύκτη (Ada) • See portait slide

  40. Ελεγκτής Θερμοκρασίας (C++) • See portrait slide

  41. Αμυντικός Προγραμματισμός • Προσέγγιση στην ανάπτυξη προγράμματος όπου υποθέτουμε ότι υπάρχουν λάθη τα οποία δεν έχουν βρεθεί στο πρόγραμμα • Το πρόγραμμα περιλαμβάνει κώδικα για την εύρεση και ανάκτηση από τέτοια λάθη • Δεν απαιτεί ελεγκτή με ανοχές σε λάθη

  42. Προστασία από Αστοχία • Συστήματα τύπων επιτρέπουν εύρεση πολλών πιθανών καταστροφικών αστοχιών στην διάρκεια της μεταγλώττισης • Ο έλεγχος περιοχής και εξαιρέσεων επιτρέπει την εύρεση μίας σημαντικής ομάδας αστοχιών να βρίσκονται κατά την διάρκεια του τρεξίματος • Διεκδικήσεις καταστάσεων μπορούν να αναπτυχθούν και να συμπεριληφθούν στο πρόγραμμα για την εύρεση άλλων κλάσεων αποτυχιών του συστήματος

  43. Έλεγχος Περιοχής σε Ada • Οι τύποι δηλώνονται ως μία επιτρεοπόμενη περιοχή, π.χ. 1..100 • Ο Έλεγχος περιοχής στην Ada αυτόματα αναδεικνύει μία εξαίρεση CONSTRAINT_ERROR εάν υπάρχει κάτι εκτός περιοχής • Ο έλεγχος περιοχής εφαρμόζεται σε μία απλή μεταβλητή. Έλεγχοι οι οποίοι εφαρμόζονται μεταξύ περιοχών (π.χ. εάν A=0 τότε B=1) δεν μπορούν να εφαρμοσθούν • Τα λάθη εκτός περιοχής απαιτούν επιπλέον ελέγχους για να ευρεθεί η αιτία των λαθών

  44. Διεκδικήσεις Κατάστασης • Λογικά κατηγορήματα σε μεταβλητές κατάστασης του συστήματος. • Συμπεριλαμβάνονται απευθείας σε μία γλώσσα αλλά προκαλούν προβλήματα μεταγλώττισης ένα χρησιμοποιούνται ποσοτικοποιητές • Συνήθως υλοποιούνται ως ελεγκτές προγραμμάτων • Είναι απλοποιημένες αν όλες οι λειτουργίες κατάστασης είναι μέσω αφαιρετικών τύπων δεδομένων. Σε πολλές περιπτώσεις τα κατηγορήματα απαιτείται να σχετίζονται μόνο με ADT.

  45. Τύπος Ζυγού Αριθμού • See portrait slide

  46. Έλεγχος Διεκδίκησης • See portrait slide

  47. Εκτίμηση Καταστροφής • Analyse system state to judge the extent of corruption caused by a system failure • Must assess what parts of the state space have been affected by the failure • Generally based on ‘validity functions’ which can be applied to the state elements to assess if their value is within an allowed range

  48. Τεχνικές Εκτίμησης Ζημιών • Έλεγχοι αθροισμάτων χρησιμοποιούνται για την εκτίμηση ζημίας στην μεταφορά δεδομένων • Επιπλέον δείκτες χρησιμοποιούνται για έλεγχο δομών δεδομένων • Έλεγχος για διεργασίες που δεν τερματίζουν χρησιμοποιείται επίσης. Εάν δεν υπάρχει απόκριση σε συγκεκριμένο χρόνο τότε υποθέτουμε ότι υπάρχει κάποιο πρόβλημα

  49. Τύπος στην Ada με Εκτίμηση Ζημίας • See portrait slide

  50. Κλάση στην C++ με Εκτίμηση Ζημίας template <class elem> class Robust_array { public: Robust_array (int size = 20) ; ~Robust_array () ; void Assign ( int Index, elem Val) ; elem Eval (int Index) ; // Damage assessment functions // Assess_damage takes a pointer to a function as a parameter // It sets the corresponding element of Checks if a problem is // detected by the function Test void Assess_damage ( void (*Test ) (boolean*)) ; boolean Eval_state (int Index) ; boolean Is_damaged () ; private: elem* Vals ; boolean* Checks ; } ;

More Related