ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΔΙΕΡΓΑΣΙΕΣ

Σχετικά έγγραφα
Δίκτυα Επικοινωνιών ΙΙ: Network Programming UDP Sockets, Signals

Παράλληλη Επεξεργασία

Προγραμματισμός συστημάτων UNIX/POSIX. Σήματα (signals)

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Διαχείριση Διεργασιών και Διαδιεργασιακή Επικοινωνία

Διαχείριση Διεργασιών και Διαδιεργασιακή Επικοινωνία

Ντίρλης Νικόλαος- ΕΤΥ 2 ο Φροντιστήριο Παρασκευή, 18/10/2013 Β4. Λειτουργικά Συστήματα- Φροντιστήριο 2

Λειτουργικά Συστήματα (ΗΥ321)

Θέτοντας και επιστρέφοντας την τιµή της προτεραιότητας διεργασίας

Χρονοδρομολογητής Κυκλικής Επαναφοράς

Εισαγωγικά & Βασικές Έννοιες

Πανεπιστήμιο Θεσσαλίας Τμήμα Πληροφορικής

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

Εισαγωγικά & Βασικές Έννοιες

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Ε-85: Ειδικά Θέµατα Λογισµικού

Προγραμματισμός συστημάτων UNIX/POSIX. Διεργασίες (processes)

1. Εισαγωγή. Λειτουργικά Συστήματα Η/Υ. Διεργασίες. Ορισμός ΚΕΦΑΛΑΙΟ 3 - ΔΙΕΡΓΑΣΙΕΣ. Κεφάλαιο 3 «Διεργασίες»

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Διεργασίες και Νήματα (1/2)

Εργαστήριο 5 fork(), exec(), signals

Λειτουργικά Συστήματα (Λ/Σ)

Βασικές Έννοιες Πρ Ταο υγρ τόα χ μ ρ μ ο α ν τισμ ος Π ό ρ ςο ΙΙΙ γραμματισμός 1

Διεργασίες - Σύνοψη. Διακοπές, προνομιούχος κατάσταση Κλήσεις συστήματος. Ορισμός, μεταβάσεις κατάστασης κύκλος ζωής

Διεργασίες και Νήματα (2/2)

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

Προγραμματισμός Ταυτόχρονος Προγραμματισμός

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΟΡΓΑΝΩΣΗ Η/Υ

4 η ιάλεξη: Signals UDP Sockets

UNIX System Programming

Εργαστήριο 7 fork(), exec(), signals

Περιγραφή και Έλεγχος ιεργασιών

Λειτουργικά Συστήματα. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

Λειτουργικά Συστήματα

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα Εργαστηριακές Ασκήσεις

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Λειτουργικά Συστήματα. Ενότητα # 10: Προγραμματισμός UNIX Διδάσκων: Γεώργιος Ξυλωμένος Τμήμα: Πληροφορικής

Υποστήριξη Λ.Σ. ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Λειτουργικά Συστήματα

Εισαγωγή στα Λειτουργικά Συστήματα

Λειτουργικά Συστήματα

Επιτεύγµατα των Λ.Σ.

Λειτουργικά Συστήματα

Διάλεξη Εισαγωγή στη Java, Μέρος Γ

Εισαγωγή στην Πληροφορική

Παρουσίαση 5 ης Άσκησης:

Παρουσίαση 5 ης Άσκησης:

Προγραμματισμός συστημάτων UNIX/POSIX

$./jms console -w <jms in> -r <jms out> -o <operations file> namedpipe. (standard input).

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Λειτουργικά Συστήματα Η/Υ

Κατηγορίες Νηµάτων. Νήµατα Επιπέδου Πυρήνα. Νήµατα Επιπέδου Χρήστη. «Νήµατα Επιπέδου Χρήστη» Ε-85: Ειδικά Θέµατα Λογισµικού

NIKOΛΑΟΣ ΝΤΙΡΛΗΣ 5ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΙΘΟΥΣΑ Β4

Διάλεξη 14: Διεργασίες: Έλεγχος & Σήματα (Processes: Control & Signals)

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Λειτουργικά Συστήματα

Λειτουργικά Συστήματα

ΗΜΥ Εργαστήριο Οργάνωσης Υπολογιστών και Μικροεπεξεργαστών

Εργαστήριο 14. Συγχρονισμός Νημάτων (χρήση pthread_mutex_t, pthread_cond_t)

ή α α POSIX Threads ( έ ος 1 ο )

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

ΔΙΑΧΥΤΑ ΚΑΙ ΕΝΣΩΜΑΤΩΜΕΝΑ ΣΥΣΤΗΜΑΤΑ

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Λειτουργικά Συστήματα

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΝΗΜΑΤΑ

ΤρόποςΑξιολόγησης: α) Εργαστήρια (Προαιρετικάµε 20% - 35% βαρύτητα µόνοθετικά) β) Τελική Γραπτή Εξέταση

Δομημένος Προγραμματισμός

Νήµατα. Πολύ σηµαντικό

Εισαγωγή στην Πληροφορική

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος Κανονική Εξέταση Λύσεις

Εικονική Μνήμη (Virtual Μemory)

ΠΛΕ-006 ΠΑΡΑΛΛΗΛΗ ΕΠΕΞΕΡΓΑΣΙΑ Project

Εικονική Μνήμη (Virtual Memory) Προγραμματισμός II 1

Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, μνήμης και Ε/Ε)

Τι είναι ένα λειτουργικό σύστημα (ΛΣ); Μια άλλη απεικόνιση. Το Λειτουργικό Σύστημα ως μέρος του υπολογιστή

Εισαγωγή στην Πληροφορική & τον Προγραμματισμό

Κατανεμημένα Συστήματα

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκό Έτος

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΔΙΕΡΓΑΣΙΕΣ

Σήματα (Signals) Προγραμματισμός II 1

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα

ΚΕΦΑΛΑΙΟ 3: Λειτουργικά Συστήµατα

Σήματα (Signals) Προγραμματισμός II 1

Ενότητα 2 (Κεφάλαιο 3) Περιγραφή και Έλεγχος Διεργασιών. Περιεχόμενα. Ανάγκη ύπαρξης διεργασιών 1

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Λιβανός Γιώργος Εξάμηνο 2017Β

Λειτουργικά Συστήματα

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Διεργασίες και Νήματα

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Προγραμματισμός Ι (ΗΥ120)

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Λειτουργικά Συστήματα (ΗΥ-345) Χειμερινό Εξάμηνο

Μάθημα 3 ο ΔΙΕΡΓΑΣΙΕΣ (PROCESSES)

Transcript:

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΔΙΕΡΓΑΣΙΕΣ

Πολυεπεξεργασία Διεργασία (process) Νήμα (thread) Εργασία (task/job)

Διεργασίες Διεργασία είναι μια (συγκεκριμένη) εκτέλεση κάποιου προγράμματος για λογαριασμό κάποιου χρήστη. Σε μια διεργασία αναγνωρίζουμε Το πρόγραμμα της διεργασίας Τον χρήστη-ιδιοκτήτη Τους πόρους της διεργασίας

Νήματα Βασική έννοια: νήμα εκτέλεσης (thread of execution) Stack Instruction pointer State (registers) Διεργασία Νήμα εκτέλεσης Πρόγραμμα Πόροι Χρήστης

Πολυνηματική επεξεργασία Μια διεργασία μπορεί να έχει πολλαπλά νήματα. Κάθε νήμα ανήκει σε μία διεργασία. Νήμα = πόρος της διεργασίας. Διεργασία Νήμα εκτέλεσης Νήμα εκτέλεσης Νήμα εκτέλεσης Πρόγραμμα Πόροι Χρήστης

Νήματα και διεργασίες Πρόγραμμα Α Β Νήματα Σε μιά διεργασία Ένα πρόγραμμα σε κάθε χρονική στιγμή Ένα ή περισσότερα νήματα Σημ: Το πρόγραμμα μιας διεργασίας μπορεί να αλλάξει.

Χρήση νημάτων Παραλληλισμός: χρήση πολλαπλών CPU από την ίδια διεργασία Πχ. εκτέλεση ενός μεγάλου αριθμητικού υπολογισμού με πίνακες Εκτέλεση του ίδιου κώδικα σε πολλά νήματα ταυτόχρονα Πχ. ένας web server που εξυπηρετεί πολλαπλούς browsers. Πολυπλεξία I/O Η διεργασία να μπορεί να επικαλύπτει Ι/Ο και υπολογισμούς (πχ. Interactive image processing photoshop).

Υλοποίηση νημάτων Ένα stack για κάθε νήμα. Νήματα επικοινωνούν με κοινές μεταβλητές. Code segment Context νήματος Καταχωρητές (Το TLB δεν αλλάζει) Data segment heap Stack 2 Stack 3 Stack 1

Καταστάσεις διεργασίας (μονονηματικής) STARTING STARTING: Η διεργασία δημιουργήθηκε αλλά δεν είναι ακόμη έτοιμη για εκτέλεση. READY RUNNING BLOCKED READY: Είναι έτοιμη για εκτέλεση αλλά δεν εκτελείται. RUNNING: Εκτελείται (αυτή τη στιγμή) σε κάποιο CPU. BLOCKED: Δεν είναι έτοιμη για εκτέλεση (πχ. περιμένει για Ι/Ο) DEAD: Έχει τερματιστεί (γιατί είναι ακόμη στη μνήμη?) DEAD

Δρομολόγηση νημάτων Δύο είδη νημάτων User-level threads: υπεύθυνη η ίδια η διεργασία για δρομολόγησή τους Ο πυρήνας δεν γνωρίζει την ύπαρξή τους Συχνά, non-preemptive δρομολόγηση ΔΕΝ εκμεταλλεύονται πολλαπλά CPUs. System-level threads: υπεύθυνο το ΛΣ για τη δρομολόγηση τους. Εκμεταλλεύονται πολλαπλά CPUs Scheduler του ΛΣ: κατανέμει CPU(s) στα threads των διεργασιών. Κάθε user-level thread εκτελείται από κάποιο systemlevel thread.

Καταστάσεις διεργασίας (πολυνηματικής) STARTING STARTING STARTING STARTING (ένα για κάθε thread) READY BLOCKED READY BLOCKED READY BLOCKED... RUNNING RUNNING RUNNING DEAD DEAD DEAD DEAD

Διεργασίες στα WindowsNT Αντικείμενα: Εργασίες (jobs), διεργασίες (processes), νήματα (threads), ίνες (fibers). Job: Ένα σύνολο από processes που μοιράζονται ρυθμίσεις. Process: Συλλογή από πόρους. Περιέχει 1 threads. Thread: (system thread) Δρομολογείται από τον πυρήνα του ΛΣ. Fiber: user thread. Δρομολογείται από κάποιο thread.

Διεργασίες στο Unix Αντικείμενα: διεργασίες (processes), νήματα (threads). Διάφορα πρότυπα threads: Πακέτο Pthreads DECthreads Pth Solaris LWPs Περιγραφή POSIX standard. Πλέον portable. Από τα πρώτα πακέτα. Μέρος του DEC RPC. Portable user-level threads. Ώριμη υλοποίηση, hybrid system-user threads με καλή υποστήριξη SMP.

Ιεραρχία διεργασιών Κάθε διεργασία χαρακτηρίζεται από έναν ακέραιο, το PID (Process ID Αριθμός Ταυτότητας Διεργασίας). Δεν αλλάζει ποτέ Κάθε διεργασία έχει μια άλλη διεργασία ως γονέα (parent). Αρα, Μπορεί να αλλάξει (πότε?) Οι διεργασίες αποτελούν δέντρο. Ρίζα: διεργασία init με pid=1. init (1) httpd (456) login (789) Xserver xterm xterm bash bash

System calls για διεργασίες Κλήση pid_t fork() int execve(prog,argv,envp) pid_t wait(status) pid_t waitpid(pid,status,opts) void _exit(status) pid_t getpid() pid_t getppid() Περιγραφή Δημιουργεί μια νέα διεργασία, που είναι αντίγραφο της καλούσας διεργασίας. Αλλάζει το εκτελέσιμο πρόγραμμα της τρέχουσας διεργασίας. Ελέγχει και (πιθανώς) περιμένει μέχρι μια διεργασία να τερματίσει. Τερματίζει την τρέχουσα διεργασία. Επιστρέφει PID τρέχουσας διεργασίας. Επιστρέφει γονέα τρέχουσας διεργασίας.

Δημιουργία διεργασίας Γίνεται ΜΟΝΟΝ από τη fork. H fork καλείται μια φορά και επιστρέφει δυο φορές: Στη διεργασία που την κάλεσε (γονέας της νέας διεργασίας) επιστρέφει το PID της νέας διεργασίας-παιδιού. Στη νέα διεργασία επιστρέφει (pid_t)0. Η νέα διεργασία κληρονομεί: Αντίγραφο της μνήμης (κώδικα + δεδομένα). Όλους τους ανοιχτούς file descriptors (αρχεία, sockets, pipes κλπ). Ιδιοκτήτη και άδειες εκτέλεσης, περιβάλλον (environment), όρια πόρων (resource limits), current directory, τερματικό ελέγχου... ΔΕΝ κληρονομεί File locks Pending signals (?).

Εκτέλεση προγράμματος MONON από την execve. execve(char* filename,char* argv[], char* envp[]) Αντικαθιστά το τρέχον πρόγραμμα με ένα νέο Φορτώνεται από το δίσκο. Ξεκινά εκτέλεση από τη συνάρτηση main του προγράμματος, όπου περνά παραμέτρους argv. Περιβάλλον το envp. ΔΕΝ ΑΛΛΑΖΕΙ ΔΙΕΡΓΑΣΙΑ (pid, ppid, χρήστης κλπ). To νέο πρόγραμμα κληρονομεί: Τα ανοιχτά file descriptors (ίσως... close_on_exex). Τερματικό ελέγχου, τρέχον directory, resource limits, file locks,

Τερματισμός διεργασίας Κανονικά: με την _exit void exit(int status) Έκτακτα: σφάλμα εκτέλεσης. Με signals (δες παρακάτω...) H exit δεν επιστρέφει ποτέ. Status: η τερματισθείσα διεργασία επιστρέφει μια τιμή εξόδου τύπου int που μπορεί να διαβαστεί από το γονέα της. Σύμβαση: status == 0 σημαίνει κανονική εκτέλεση,!=0 σημαίνει πρόβλημα. Αλλά το ΛΣ αδιαφορεί.

Ανάγνωση τιμής εξόδου Με χρήση (από τον γονέα) της waitpid: pid_t waitpid(pid_t pid, int* status, int options) Εμπλέκεται (is blocked) μέχρι να μπορεί να επιστρέψει. pid: -1: επέστρεψε για οποιοδήποτε τερματισμένο παιδί >0: επέστρεψε για το συγκεκριμένο παιδί-pid <-1 ή 0: επέστρεψε για διεργασία σε συγκεκριμένο process group (??) status: αποθηκεύεται εκεί η τιμή εξόδου (αν!=0) options: 0 ή WNOHANG (οπότε δεν εμπλέκεται).

Έλεγχος διεργασιών - signals Signals = Interrupts για διεργασίες Ασύγχρονη εκτέλεση. Υλοποίηση μέσω stack. Πηγές: Πυρήνας Άλλες διεργασίες Έννοια Interrupt Interrupt handler Interrupt vector Interrupt mask Αντιστοιχία Signal Signal handler Sigaction( ) Signal mask

Κυριότερα signals (POSIX) signal SIGHUP SIGINT SIGCHLD SIGILL SIGABRT SIGFPE SIGKILL SIGSEGV SIGALRM SIGTERM SIGSTOP SIGCONT Περιγραφή Διακοπή σύνδεσης με το τερματικό ελέγχου Πλήκτρο διακοπής (<Ctrl>-C) από πληκτρολόγιο Τερματισμός διεργασίας-παιδιού Illegal instruction Κλήση abort() Floating Point Exception (πχ διαίρεση με 0) Άμεσος τερματισμός διεργασίας Παράνομη πρόσβαση στη μνήμη Ξυπνητήρι (συνεργάζεται με την κλήση alarm( )) Σήμα τερματισμού διεργασίας Σήμα σταματήματος διεργασίας Σήμα συνέχισης διεργασίας

Ρουτίνες χειρισμού signals (POSIX) struct sigaction handler mask flags sigaction(int num, newaction, oldaction) sigprocmask(how, set, oldset) sigpending(set) kill(pid, sig) sigsuspend(maskset) Handler - pointer to function, SIG_DFL, SIG_IGN. Mask signals masked when handler called Flags ONESHOT, NOMASK, RESTART, ONSTACK, Θέτει το νέο sigaction για το δεδομένο signal Block και unblock διάφορα signals Εξετάζει ποια signals (που μπλοκάρονται) είναι σε αναμονή (pending) Στέλνει το sig στο process με το pid. Εμπλέκεται και περιμένει για κάποια συγκεκριμένα signals.

Παράδειγμα: Τερματισμός παιδιού Διεργασία Α ο γονέας, διεργασία Β το παιδί. Τερματισμός Β -> signal SIGCHLD στην Α void sigchld_handler(int sig) { pid_t pid; int status; pid=wait(&status); printf( Child %d exit, status %d\n,pid,status); } struct sigaction ca; ca.handler = sigchld_handler; sigaction(sigchld, &ca, NULL);

Άλλες περιπτώσεις Αν ο γονέας τερματίσει πρίν το παιδί καλέσει την exit: Νέος γονέας η init (pid == 1) Η init θα καλέσει τη wait Αν το παιδί τερματίσει πρίν ο γονέας καλέσει τη waitpid: To παιδί είναι στην κατάσταση DEAD. Διατηρείται στον πίνακα διεργασιών για να διαβαστεί το exit status. zombie

Είδη διεργασιών Χρήστη Δαίμονες (daemons) Non-interactive διεργασίες (χωρίς τερματικό ελέγχου). Προσφέρουν υπηρεσίες (services), πχ. ο web server, print server, κλπ. Πυρήνα (kernel processes) Βρίσκονται συνέχεια εντός του πυρήνα Πώς; πχ. εκτελούν μόνιμα κάποιο ειδικά φτιαγμένο system call Εκτελούν βασικές λειτουργίες διαχείρισης... Init, idle (swapper), κλπ. Βελτιστοποίηση χρήσης μνήμης Υλοποίηση NFS (Network File System) Διαχείριση ενέργειας (power management, πχ. σε laptops)

Βασική υλοποίηση διεργασιών Process table (πίνακας διεργασιών) Ένα array από PCB (Process Control Block). struct PCB { }; Pid_t pid; #define MAXPROC 4096 PCB process_table[maxproc];

Πίνακας διεργασιών Παράμετροι διεργασίας Χρήστης (ομάδες χρηστών). Process ID, parent, job id, Χρόνος εκτέλεσης, κύκλοι CPU που χρησιμοποιήθηκαν κλπ. όρια εκτέλεσης Signal handlers, mask Παράμετροι ανα thread Context Thread state Προτεραιότητα και άλλες παράμετροι δρομολόγησης Παράμετροι μνήμης και Ε/Ε Διευθύνσεις text, data, stack segments. Ιδεατή μνήμη Root directory, current directory File descriptors

Scheduler - curproc PCP process_table[maxprox] PCB* curproc 0 1 2 3 4 /* Σχηματική υλοποίηση scheduler */ void schedule() { PCB* oldproc; oldproc = curproc; curproc = select_next(); 5 } if(curproc!= oldproc) swap(curproc->context, oldproc->context);

System call execution Παράδειγμα: getpid(), getppid(), struct PCB { pid_t pid, parentid; }; pid_t getpid() { return curproc->pid; } pid_t getppid() { return curproc->parentid; }

Υλοποίηση signals Δύο ειδών: σύγχρονα και ασύγχρονα. Σύγχρονα signals: τα λαμβάνει η διεργασία όταν δεν μπορεί να προχωρήσει. πχ. SIGSEGV, SIGILL, SIGKILL κλπ Έρχονται από το kernel, οφείλονται σε interrupt Ασύγχρονα signals: Κατά την αποστολή στη διεργασία Α: Το signal καταγράφεται ως pending (επικείμενο) στο PCB της διεργασίας Α (που το λαμβάνει). Κατά την επόμενη δρομολόγηση της διεργασίας Α (ασύγχρονα signals) ή άμεσα (σύγχρονα signals) : Ελέγχεται η μάσκα, αν δεν επιτρέπει εκτέλεση, συνεχίζει η κανονική ροή της διεργασίας. Δημιουργείται στο stack της διεργασίας το κατάλληλο stack frame και καλείται ο signal handler. Στην περίπτωση πολλών νημάτων, χρησιμοποιείται κάποιο από αυτά (η επιλογή του είναι περίπλοκη).

Προγραμματισμός threads POSIX Threads (pthreads) POSIX: Portable Operating System Interface http://www.opengroup.org Unix spec: 1003.1 (το λεγόμενο POSIX.1 standard) http://www.unix.org/version3/ Τα pthreads είναι ένα API για τη γλώσσα C. Όλες οι δηλώσεις: #include <pthread.h>

PThreads: Βασικοί τύποι Τύπος pthread_t Περιγραφή thread id: χαρακτηρίζει κάποιο thread. pthread_attr_t Αντικείμενο που χρησιμοποιείται για να παραμετροποιήσει κάποιο thread. pthread_key_t Per-thread data: χρησιμοποιείται για αποθήκευση τιμών ανά νήμα. pthread_mutex_t pthread_cond_t pthread_rwlock_t Δομές συγχρονισμού: θα μελετηθούν αργότερα.

PThreads: Χειρισμός threads Συνάρτηση int pthread_create(t, a, func, arg) pthread_t* t; const pthread_attr_t* a void* (*func)(void*); void* arg; int pthread_exit(val) void* val; int pthread_join(t, vp) pthread_t* t; void** vp; pthread_t pthread_self() int pthread_equal(t1, t2) pthread_t t1, t2; Περιγραφή Ξεκινά νέο thread, με attributes a (μπορεί να είναι NULL) εκτελώντας την func με όρισμα arg. Το thread id αποθηκεύεται στο t. Τερματίζει το τρέχον thread επιστρέφοντας val. Περιμένει το t να τερματίσει, αποθηκεύει στο vp την τιμή επιστροφής. Επιστρέφει το id του τρέχοντος thread. Συγκρίνει δύο thread ids.

Παράδειγμα void* foo(void* arg) { printf( Hello %s, I am a thread\n, (char*)arg); return arg; // το ίδιο με pthread_exit(arg) } pthread_t t; static char* name = vsam ; pthread_create(&t, NULL, foo, name); // do other stuff pthread_join(t, NULL); // ignore return value

Λεπτομέρειες για threads Threads και η fork() Όταν γίνει fork(), κληρονομούνται τα threads του πατέρα? Απάντηση: ΟΧΙ!!!! Πολλά προβλήματα (εκτός αν το παιδί καλέσει exec()) Threaded libraries??? Threads και signals Όταν έρθει κάποιο signal, ποιο thread θα το εκτελέσει? Απάντηση: περίπλοκο. (pthread_kill) Ένα signal vector για όλη τη διεργασία Ένα signal mask ανα thread (pthread_sigmask) Cancellation pthread_cancel: Προσπαθεί να τερματίσει «βίαια» ένα άλλο thread. ΠΟΛΥ ΠΡΟΒΛΗΜΑΤΙΚΟ.