Φροντιστήρια Κατανεµηµένα Συστήµατα Ι Μάθηµα Βασικής Επιλογής, Χειµερινού Εξαµήνου Τοµέας Εφαρµογών και Θεµελιώσεων Γιώργος Μυλωνάς Παρασκευή, 31 Οκτωβρίου, 2008 Αίθουσα Β3 2 ώρες την εβδοµάδα Παρασκευή 11:00-13:00, Β3 Θεωρία Απορίες - ιευκρινίσεις Προετοιµασία εξέτασης Ασκήσεις Απορίες - ιευκρινίσεις Απαντήσεις Πρακτική Γλώσσα προγραµµατισµού nesc Υλοποίηση αλγορίθµων στο περιβάλλον TinyOS Εκτέλεση στο περιβάλλον TOSSIM Εργαστήρια Απορίες Σχετικά µε το εργαστήριο 3 ώρες την εβδοµάδα Υπολογιστικό - ύο ϐάρδιες Τρίτη 15:00-18:00 Πέµπτη 15:00-18:00 4 σετ εργαστηρίων (αν προλάβουµε ;) 1-2 ϑέµατα Πρακτική Εκτέλεση αλγορίθµων στο περιβάλλον TOSSIM Υλοποίηση αλγορίθµων σε nesc Για κάθε ολοκληρωµένη παρακολούθηση +0.75 bonus στον τελικό ϐαθµό Για οτιδήποτε χρειαστείτε ϑα µε ϐρείτε στο ΤΜΗΥΠ: Προκατ τµήµατος Καθηµερινά - µέχρι τις 5 το απόγευµα Τηλ. - 2610 997541 Μέσω e-mail: mylonasg@ceid.upatras.gr Χρήστος Κονίνης: koninis@ceid.upatras.gr
Ανάλυση συστηµάτων Μοντέρνα συστήµατα Μια ϐασική µέθοδος για την µελέτη ενός συστήµατος είναι η top-down προσέγγιση µε ιεραρχικό τρόπο. Αρχικά αφαιρούµε όλες τις τεχνικές λεπτοµέρειες και µελετάµε το σύστηµα σε υψηλό επίπεδο Στην συνέχεια, µελετάµε συγκεκριµένες παραµέτρους και τους τρόπους που επηρεάζουν την απόδοση του συστήµατος Επίπεδο προς επίπεδο ϐήµα, ϐήµα καταλήγουµε στο τελικό σύστηµα, στις πραγµατικές συνθήκες Αυτή η προσέγγιση οδηγεί σε καλά αποτελέσµατα για να οργανώσουµε ενα µεγάλο εύρος δοµών Οι ιεραρχικές, κεντρικοποιηµένες προσεγγίσεις έχουν οδηγήσει σε πολύ καλές λύσεις: τα σηµερινά συστήµατα π.χ. συστήµατα διαχείρισης δεδοµένων, κινητής τηλεφωνίας Οµως ο κόσµος γίνεται ολοένα και πιο πολύπλοκος. Είναι αδύνατο να αγνοήσουµε ότι πολλά µοντέρνα συστήµατα έχουν τελείως διαφορετική δοµή π.χ. η ευστάθεια και αποδοτικότητα των σύγχρονων πολιτικό-οικονοµικών συστηµάτων ϐασίζεται σε αποκεντρωτικούς, κατανεµηµένους µηχανισµούς που πρέπει να αυτό-οργανώνονται Το Internet είναι ένα γνήσιο παράδειγµα µιας αντίστοιχης προσέγγισης σε τεχνολογικό επίπεδο Ακόµα δεν µπορούµε να αντιληφθούµε πως να οργανώσουµε τεράστιες συλλογές συσκευών µε ετερογενείς δυνατότητες Πρόσφατα παρατηρείται µια στροφή από κεντρικοποιηµένα συστήµατα σε κατανεµηµένα δίκτυα που αυτο-οργανώνονται Κατανεµηµένα συστήµατα Θεωρητική Μελέτη Κατανεµηµένων συστηµάτων Ενα κατανεµηµένο σύστηµα: Αποτελείται από ένα πλήθος αυτόνοµων κόµβων που επικοινωνούν µεταξύ τους µε κάποιο τρόπο για την επίτευξη ενός συγκεκριµένου κοινού στόχου Μπορεί να χαρακτηρίζεται από πλήθος παραµέτρων Πλήθος περιπτώσεων που µπορεί να χρησιµοποιηθεί ένα τέτοιο σύστηµα Πλήθος απαιτήσεων λειτουργικότητας ανάλογα µε την εφαρµογή Η µελέτη των κατανεµηµένων συστηµάτων είναι ιδιαίτερα περίπλοκη διαδικασία. Η µελέτη ενός κατανεµηµένου συστήµατος σε ϑεωρητικό επίπεδο προϋποθέτει: Την µοντελοποίηση του συστήµατος αφαίρεση των τεχνικών λεπτοµερειών Αυτό προϋποθέτει ότι µπορούµε να αναγνωρίσουµε τα τεχνικά χαρακτηριστικά που έχουν κεντρική σηµασία Οσο πιο αφαιρετικό είναι το µοντέλο, τόσο γενικότερη είναι η µελέτη µας Ορισµός του προβλήµατος σύµφωνα µε το µοντέλο Σχεδιασµός αλγοριθµικών λύσεων Μελέτη της συµπεριφοράς του συστήµατος Απόδειξη ορθότητας Μέτρηση πολυπλοκότητας
Περιορισµοί Θεωρητικής Μελέτης Πειραµατική Μελέτη Κατανεµηµένων συστηµάτων Η µελέτη ενός κατανεµηµένου συστήµατος σε ϑεωρητικό επίπεδο προσφέρει ένα ϐασικό υπόβαθρο για την κατανόηση της συµπεριφοράς και την αυστηρή διατύπωση της απόδοσης του. Οµως εµπεριέχει κινδύνους: Η αφαίρεση ορισµένων τεχνικών λεπτοµερειών µπορεί να µας οδηγήσει σε µη ϱεαλιστικές / µη εφαρµόσιµες λύσεις Η µέτρηση της πολυπλοκότητας δεν υπολογίζει τις κρυφές σταθερές Μια λύση χειρότερης πολυπλοκότητας µπορεί στην πράξη να είναι καλύτερη Μερικές ϕορές είναι πολύ δύσκολο (και ίσως αδύνατο) να αναλυθεί η συµπεριφορά ενός συστήµατος µε ϑεωρητικά εργαλεία Μια διαφορετική προσέγγιση είναι η υλοποίηση συστηµάτων και η πειραµατική αξιολόγηση τους Υλοποίηση της λύσης σε πειραµατικό πλαίσιο π.χ. προσοµοιωτής, εργαστηριακές εγκαταστάσεις Μελέτη της συµπεριφοράς του συστήµατος σύµφωνα µε ελεγχόµενα σενάρια Μέτρηση της πραγµατικής απόδοσης του συστήµατος Αµεση επιβεβαίωση για την εφαρµοσιµότητα µιας λύσης στις πραγµατικές υφιστάµενες τεχνολογίες Τα αποτελέσµατα είναι µεταφέρσιµα στις πραγµατικές συσκευές ιττή Προσέγγιση Κύκλος Θεωρητικής και Πειραµατικής Προσέγγισης Η κάθε προσέγγιση έχει ϑετικά και αρνητικά σηµεία: Η Θεωρητική µελέτη προσφέρει λύσεις που είναι αποδείξιµα σωστές, αποδοτικές... που µπορεί να µην είναι εφαρµόσιµες ή πολύ δύσκολο να προγραµµατιστούν Η πρακτική µελέτη αντιµετωπίζει άµεσα τα τεχνολογικά ϑέµατα... που µπορεί να µην είναι καινοτόµες και αποδοτικές σε µεγάλα συστήµατα Για να είµαστε αποτελεσµατικοί πρέπει να ακολουθήσουµε διττή προσέγγιση.
Η πλατφόρµα που ϑα χρησιµοποιήσουµε στο εργαστήριο Αποτελείται από τρία ϐασικά µέρη: TinyOS: ϐιβλιοθήκη - λειτουργικό σύστηµα nesc: γλώσσα προγραµµατισµού TOSSIM: εξοµοιωτής Πλεονεκτήµατα: Σχετική ευκολία χρήσης οκιµασµένες λύσεις Υπάρχουσα τεκµηρίωση Εκδοση 1.1.x Λειτουργικό σύστηµα TinyOS Πολύ µικρό σε µέγεθος (και απαιτήσεις) Σχεδιασµένο ειδικά για συστήµατα µε λιγοστούς πόρους και προσανατολισµένο στην εξοικονόµηση ενέργειας (ασύρµατα δίκτυα αισθητήρων) Μπορεί να χρησιµοποιηθεί για τη ανάπτυξη κατανεµηµένων συστηµάτων (ειδικού) σκοπού Παρέχει ένα σύνολο από υπηρεσίες στο χρήστη (ασύρµατη και σειριακή επικοινωνία, χειρισµός interrupt, κτλ) Είναι περισσότερο µία ϐιβλιοθήκη, παρά ένα λειτουργικό σύστηµα (από µια άποψη) Open-source project, διαθέσιµο για Windows και Linux Στα Windows χρειάζεται το CygWin για να λειτουργήσει Είναι εγκατεστηµένο σε συγκεκριµένα µηχανήµατα στο υπολογιστικό κέντρο Γλώσσα προγραµµατισµού nesc Περιβάλλον εξοµοίωσης TOSSIM Το προγραµµατιστικό µοντέλο του TinyOS nesc = network embedded system C Βασίζεται στη C Τα αρχεία nesc έχουν την κατάληξη.nc Το TinyOS και οι ϐιβλιοθήκες του είναι γραµµένες κι αυτές σε nesc Η σύνταξή της διευκολύνει κάποιες λειτουργίες σε συστήµατα µε περιορισµένους πόρους Πολύ εύκολος τρόπος επικοινωνίας µεταξύ διεργασιών (που εκτελούνται σε διαφορετικές συσκευές) Μικρός κώδικας απλή διαχείριση µνήµης Ενας εξοµοιωτής για το TinyOS Επιτρέπει πειραµατική µελέτη κώδικα nesc στο PC σας Περιβάλλον σε γραµµή εντολών και σε γραφικό (παραθυρικό) περιβάλλον Αρκετά ευέλικτος, υπάρχουν αρκετά plugin που επεκτείνουν τη λειτουργικότητά του Προσφέρει εύκολο τρόπο για να ορίσουµε τοπολογίες δικτύων Μπορούµε να µελετήσουµε σφάλµατα επικοινωνίας και σφάλµατα τερµατισµού
Γενικά Θέµατα Προγραµµατισµού στην nesc (1) Βασίζεται στην C εµπλουτισµένη µε ορισµένα στοιχεία αντικειµενοστραφούς προγραµµατισµού Χρησιµοποιεί το µοντέλο των Interface (ϐλ. JAVA) Αντί για αντικείµενα έχει Components Ολες οι τοπικές µεταβλητές είναι αυστηρά private Η διασύνδεση µε άλλα Components γίνεται αυστηρά µέσω Interfaces εν προσφέρει καθολικό χώρο ονοµάτων Βασίζεται στην ιδέα της συνδεσµολογίας των Components ιαχωρισµός υλοποίησης και διασύνδεσης Μια προσέγγιση µε στόχο την επεκτασιµότητα και προσαρµοστικότητα του κώδικα Γενικά Θέµατα Προγραµµατισµού στην nesc (2) Εισαγωγή στα Components Οταν γίνεται η µεταγλώττιση του κώδικα, η διασύνδεση µεταξύ των component γίνεται στατικά. Ενα component δεν µπορεί να έχει (απ ευθείας) πρόσβαση σε µεταβλητή σε άλλο component Ενα component δηλώνει τις λειτουργίες που µπορεί να εκτελέσει ΚΑΙ τις λειτουργίες άλλων component που ϑέλει να καλέσει, όταν γράφουµε τον κώδικα 3 λόγοι γι αυτό: 1. Αποδοτική υλοποίηση 2. Η λειτουργία των software components να µοιάζει µε αυτή των hardware components. 3. Επαναχρησιµοποίηση κώδικα Ενα µέρος της δυσκολίας στη nesc έγκειται στον τρόπο που γίνεται η διασύνδεση µεταξύ components Μπορούµε να δούµε κάθε component σαν ένα µαύρο κουτί Καθορίζει τις εισόδους και τις εξόδους του, δηλώνοντας ότι χρησιµοποιεί ένα interface και ότι παρέχει κάποιο άλλο interface Ενα component µπορεί να παρέχει και να χρησιµοποιεί πολλά interface. Οταν ένα component χρησιµοποιεί κάποιο interface, το κάνει για να έχει πρόσβαση στη λειτουργικότητα κάποιου άλλου component Οταν ένα component παρέχει κάποιο interface, δηλώνει τον τρόπο που τα υπόλοιπα component µπορούν να το χρησιµοποιήσουν
Η οµή των Προγραµµάτων / Εφαρµογών Παράδειγµα Εφαρµογής (1) Το component LCR υλοποιεί έναν αλγόριθµο εκλογής αρχηγού. Μια εφαρµογή χωρίζεται σε δύο µέρη: Modules: Τα component που υλοποιούµε τις λειτουργίες του συστήµατος. Κάθε module ορίζει τα interface χρησιµοποιεί και παρέχει και κατόπιν υλοποιεί τις λειτουργίες. Configurations: Ορίζουν τη διασύνδεση των component που χρησιµοποιεί µια εφαρµογή. Οι εφαρµογές που ϑα αναπτύξουµε ϑα έχουν πολλά modules αλλά µόνο ένα configuration. Χρησιµοποιεί τα interface SendMsg και ReceiveMsg για την ανταλλαγή µηνυµάτων Το αρχείο LCR.nc περιέχει το module LCR 1. Ορίζει τα interface που χρησιµοποιεί 2. Υλοποιεί το component LCR Για να λειτουργήσει πρέπει να διασυνδεθεί µε το component GenericComm Το αρχείο MyApp.nc περιγράφει το configuration MyApp 1. ηλώνει την χρήση των component LCRM και GenericComm 2. Συνδέει τα interface SendMsg και ReceiveMsg που προσφέρει το GenericComm µε αυτά που χρησιµοποιεί το LCR Παράδειγµα Εφαρµογής (2) Παράδειγµα Εφαρµογής (3) LCR.nc module LCR{ provides { interface LeaderElection; uses { interface SendMsg; interface ReceiveMsg; implementation { //... MyApp.nc configuration MyApp { implementation { components LCR, GenericComm; LCR.SendMsg -> GenericComm.SendMsg; LCR.ReceiveMsg -> GenericComm.ReceiveMsg;
Εισαγωγή στα Interfaces (1) Εισαγωγή στα Interfaces (2) Τα interface παρέχουν δύο µηχανισµούς: command και event Command: ένα component που ϑέλει να χρησιµοποιήσει τις λειτουργίες ενός άλλου, πρέπει να χρησιµοποιήσει ένα command από αυτά που προσφέρει το interface στην ουσία πρόκειται για παραδοσιακές συναρτήσεις Event: ένα καλούµενο component όταν ολοκληρώσει την εργασία που του έχει ανατεθεί ϑα στείλει το αντίστοιχο event στο component που το έχει καλέσει γνωστά και ως call back Commands και Events χρησιµοποιούνται σε διαφορετικές χρονικές στιγµές Σε ένα component που το προσφέρει ένα interface το command είναι σηµείο εισόδου και το event είναι σηµείο εξόδου... σε ένα component που χρησιµοποιεί ένα interface το command είναι σηµείο εξόδου και το event είναι σηµείο εισόδου Ανάλογα µε το αν παρέχουν ή χρησιµοποιούν το interface, τα component πρέπει να προσφέρουν την υλοποίηση των αντίστοιχων command ή event Το component που προσφέρει ένα interface πρέπει να υλοποιεί όλα τα command Το component που χρησιµοποιεί ένα interface πρέπει να υλοποιεί όλα τους διαχειριστές των event Παράδειγµα Interface (1) Παράδειγµα Interface (2) Ενα πολύ ϐασικό interface είναι το StdControl Χρησιµοποιείται για να αρχικοποιήσει, να εκκινήσει ή να σταµατήσει ένα component Ορίζει 3 command δεν προσφέρει καµία έξοδο (event) Η λειτουργία του κώδικά µας ξεκινά από την αρχικοποίηση ενός component που ονοµάζεται Main StdControl.nc interface StdControl { command result_t init(); command result_t start(); command result_t stop(); Μπορούµε να σκεφτούµε τα event ως µια µορφή interrupt, αφού είπαµε ότι τα software µοιάζουν στη λειτουργία τους µε τα hardware components... ή ως ένα signal (ϐλ. POSIX) Για κάθε event πρέπει να υλοποιήσουµε ένα διαχειριστή (event handler) ReceiveMsg.nc interface ReceiveMsg { event TOS_MsgPtr receive(tos_msgptr m);
Παράδειγµα Interface (3) Γενικά, µπορούµε να ϕανταστούµε πώς υπάρχει µια ϱοή ελέγχου από τα ανώτερα component προς τα κατώτερα Οσο πάµε πιο κάτω πλησιάζουµε πιο πολύ στο TinyOS Οταν καλούµε µια εντολή µπορούµε να ϑεωρήσουµε ότι πάµε πιο κάτω, ενώ όταν µας επιστρέφεται ένα event πάµε προς τα πάνω. SendMsg.nc interface SendMsg { command result_t send(uint16_t address, uint8_t length, TOS_MsgPtr msg); event result_t senddone(tos_msgptr msg, result_t success); Παράδειγµα Interface (4) LeaderElection.nc interface LeaderElection { command result_t init(uint16_t deviceid); async command result_t elect(); event result_t electdone(uint16_t leaderid, uint8_t isleader); command uint8_t getstatus(); command uint16_t getleaderid(); Παράδειγµα Εφαρµογής Επικοινωνία στο TinyOS µε Active Messages Μια πολύ απλή εφαρµογή Εχουµε ένα πλήρες δίκτυο Οι συσκευές διατηρούν έναν αριθµό (είσοδος από κάποιο component ) Θέλουµε να υπολογίσουν το άθροισµα όλων των αριθµών Η επικοινωνία στο TinyOS γίνεται ασύρµατα Ο τρόπος που χειριζόµαστε το ασύρµατο µέσο (στο εργαστήριο) δεν δηµιουργεί ουσιαστικές ασυµβατότητες µε το ϑεωρητικό µοντέλο Χρησιµοποιούνται 3 component : Main, GenericComm, Sum Τα Active Messages είναι ένας µηχανισµός για επικοινωνία παράλληλων και κατανεµηµένων συστηµάτων, ο οποίος ϐασίζεται στην ανταλλαγή µηνυµάτων Τα Active Messages επελέγησαν ως τρόπος επικοινωνίας µεταξύ κόµβων που τρέχουν TinyOS Μέσω του µηχανισµού αυτού µπορούµε να υλοποιήσουµε διάφορους αλγόριθµους για κατανεµηµένα συστήµατα που ϑα δούµε στο µάθηµα Κάθε µήνυµα αποτελείτε από ένα header και ένα µέρος data Ο header του περιέχει τον αριθµό ενός handler, ο οποίος καλείται από το σύστηµα για να διαχειριστεί το µήνυµα Μοιάζει µε τον αριθµό στα TCP port, π.χ. 80 για το http
Active Message Handlers Ταυτότητες διεργασιών και ειδικές διευθύνσεις Ο προγραµµατιστής καθορίζει τον αριθµό του AM handler, υποθέτουµε ότι όλοι οι κόµβοι ξέρουν πώς να χειριστούν τον αριθµό αυτό Στο πρόγραµµά µας καθορίζουµε ποιο κοµµάτι του κώδικα αναλαµβάνει να επεξεργαστεί το µήνυµα µε ΑΜ αριθµό Χ Οταν ϕτάσει ένα µήνυµα µε αριθµό ΑΜ 25, το component GenericComm καλεί προς εκτέλεση τον αντίστοιχο κώδικα ιαβάζουµε τα data του µηνύµατος, κάνουµε επεξεργασία και αν χρειάζεται στέλνουµε µήνυµα (προφανώς ανάλογα µε τον αλγόριθµο) Πάνω σε αυτή τη λογική µπορούµε να χτίσουµε τον κατανεµηµένο αλγόριθµό µας Κάθε κόµβος του συστήµατος έχει µια ταυτότητα (την αναθέτουµε εµείς) Η επικοινωνία µε τους άλλους κόµβους γίνεται µε τη χρήση του αριθµού αυτού Υπάρχουν και µερικές ειδικές διευθύνσεις που µπορούµε να χρησιµοποιήσουµε: 1. Broadcast διεύθυνση, µετάδοση προς όλους τους κόµβους που ϐρίσκονται στην εµβέλεια µετάδοσής µας 2. Serial port διεύθυνση, προς τη σειριακή ϑύρα του κόµβου Προσοχή: πρέπει να υπάρχει κάποιο πρωτόκολλο δροµολόγησης για multihop επικοινωνία, αλλιώς µιλάµε για 1-hop επικοινωνία (όπως στην ϑεωρία) Λογική αποστολής και λήψης µηνυµάτων Ορισµός Μηνύµατος Αποστολέας: 1. Εχουµε δεσµεύσει ένα buffer, τον οποίο χρησιµοποιούµε για να αποθηκεύσουµε τα δεδοµένα που ϑα στείλουµε 2. Αποφασίζουµε ποιον AM handler χρησιµοποιούµε (το port του άλλου κόµβου στο οποίο ϑα πάει το µήνυµα) 3. Στέλνουµε το µήνυµα Παραλήπτης: Sum.h typedef struct SumMsg { uint16_t value; SumMsg; 1. Λαµβάνει το µήνυµα και διαβάζει τον AM handler 2. Καλεί το αντίστοιχο κοµµάτι του κώδικα για να χειριστεί το µήνυµα
Sum.nc module Sum { provides { interface StdControl; uses { interface SendMsg; interface ReceiveMsg; implementation { u_int16 m_value = ###; u_int16 m_sum = 0; TOS_Msg m_msg; Sum.nc command result_t StdControl.start() { SumMsg * msg = (SumMsg *) m_msg.data; msg->value = m_value; m_sum += m_value; dbg(dbg_temp, "Node %d -- value %d\n", TOS_LOCAL_ADDRESS, m_value); call SendMsg.send(TOS_BCAST_ADDR, sizeof(summsg), &m_msg); Sum.nc Sum.nc event result_t SendMsg.sendDone(TOS_MsgPtr msg, bool success) { dbg(dbg_temp, "Node %d -- value sent\n", TOS_LOCAL_ADDRESS); return SUCCESS; event TOS_MsgPtr ReceivMsg.receive( TOS_MsgPtr recv_packet) { SumMsg * msg = (SumMsg *) recv_packet->data; dbg(dbg_temp, "Node %d -- rcvd value %d\n", TOS_LOCAL_ADDRESS, msg->value); m_sum += msg->value; return SUCCESS; command result_t StdControl.stop() { dbg(dbg_temp, "Node %d -- tot value %d\n", TOS_LOCAL_ADDRESS, m_sum);
ιασύνδεση Το περιβάλλον που ϑα χρησιµοποιήσουµε MyApp.nc includes Sum; configuration MyApp { implementation { components Main, GenericComm as Comm, Sum; Main.StdControl -> Sum.StdControl; Main.StdControl -> Comm; Το TinyOS είναι διαθέσιµο για Windows και Linux Το περιβάλλον που ϑα χρησιµοποιήσουµε περιλαµβάνει: τις ϐιβλιοθήκες του TinyOS ενα µεταγλωττιστή (ncc) για κώδικα nesc, ο οποίος ϐγάζει εκτελέσιµο κώδικα για διάφορες πλατφόρµες διάφορα εργαλεία για την ανάπτυξη εφαρµογών TinyOS και άλλα πολλά... :) Sum.SendMsg -> Comm.SendMsg[11]; Sum.ReceiveMsg -> Comm.ReceiveMsg[11]; Το περιβάλλον Cygwin οµή ϕακέλων της εγκατάστασης του TinyOS (2) Το Cygwin µας παρέχει σε Windows ένα περιβάλλον παρόµοιο µε ένα Unix σύστηµα. Βασίζεται σε µια ϐιβλιοθήκη που µεταφράζει POSIX system calls σε win32 system calls, και υπάρχουν διαθέσιµες εφαρµογές που ϐρίσκουµε σε Unix συστήµατα (π.χ. υπάρχει bash shell, gcc, κτλ) Apps: στο ϕάκελο αυτό περιέχονται διάφορες έτοιµες εφαρµογές (οι περισσότερες είναι για ασύρµατα δίκτυα αισθητήρων) Doc: εδώ ϐρίσκονται κάποια (χρήσιµα) tutorial για το σύστηµα, specifications,διαγράµµατα εφαρµογών, κ.α. Tools: εδώ ϐρίσκουµε χρήσιµα εργαλεία για την ανάπτυξη εφαρµογών (συνήθως σε Java) TOS: στο ϕάκελο αυτό ϐρίσκουµε τις ϐιβλιοθήκες του TinyOS, τους ορισµούς των interfaces, drivers για διάφορες πλατφόρµες, κτλ.
Ενδεδειγµένη επιλογή εγκατάστασης Ενδεδειγµένη επιλογή εγκατάστασης (2) Μέσω virtualization... Xubuntos = Xubuntu + TinyOS Live CD - toilers.mines.edu/public/xubuntos VMWare TinyOS image - docs.tinyos.net/index.php/getting_started Οπότε... Κατεβάζετε το VMWare Player (δωρεάν) Κατεβάζετε το virtual machine image (π.χ. για το TinyOS 2.1) Ακολουθείτε τις οδηγίες για να ϱυθµίσετε ποια έκδοση του TinyOS ϑα χρησιµοποιείτε