Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

 

Έχω ένα πρόβλημα σχετικά με τους σημαφορους και τον συγχρονισμό διεργασιών χρησιμοποιώντας τους.

 

Έστω ότι έχουμε 6 διεργασίες P1, P2, P3, P4, P5, P6.

 

Η P1 μπορεί να ξεκινήσει οποτεδήποτε.

Η P2 πρέπει να ξεκινήσει μόνο αφού τελειώσει η P1.

Η P3 πρέπει μπορεί να ξεκινήσει οποτεδήποτε.

Η P4 πρέπει να ξεκινήσει μόνο αφού τελειώσει η P2 & P3.

Η P5 πρέπει να ξεκινήσει μόνο αφού τελειώσει η P4.

Η P6 πρέπει να ξεκινήσει μόνο αφού τελειώσει η P3.

 

Ο μόνος περιορισμός είναι ότι πρέπει να αρχικοποιησουμε τους σημαφορους με τη τιμή 1. 

Πώς αποτρέπουμε τις διεργασίες P2, P4,P5,P6 από το να ξεκινήσουν;

Δημοσ.
5 ώρες πριν, Soukoss είπε

Καλησπέρα,

 

Έχω ένα πρόβλημα σχετικά με τους σημαφορους και τον συγχρονισμό διεργασιών χρησιμοποιώντας τους.

 

Έστω ότι έχουμε 6 διεργασίες P1, P2, P3, P4, P5, P6.

 

Η P1 μπορεί να ξεκινήσει οποτεδήποτε.

Η P2 πρέπει να ξεκινήσει μόνο αφού τελειώσει η P1.

Η P3 πρέπει μπορεί να ξεκινήσει οποτεδήποτε.

Η P4 πρέπει να ξεκινήσει μόνο αφού τελειώσει η P2 & P3.

Η P5 πρέπει να ξεκινήσει μόνο αφού τελειώσει η P4.

Η P6 πρέπει να ξεκινήσει μόνο αφού τελειώσει η P3.

 

Ο μόνος περιορισμός είναι ότι πρέπει να αρχικοποιησουμε τους σημαφορους με τη τιμή 1. 

Πώς αποτρέπουμε τις διεργασίες P2, P4,P5,P6 από το να ξεκινήσουν;

Τι πρόβλημα έχεις λοιπόν; Τι σε μπερδεύει; Τι έχεις κάνει μεχρι τώρα που έχεις κολλήσει;

Δημοσ. (επεξεργασμένο)
1 ώρα πριν, Papakaliati είπε

Τι πρόβλημα έχεις λοιπόν; Τι σε μπερδεύει; Τι έχεις κάνει μεχρι τώρα που έχεις κολλήσει;

Καλησπέρα,

Αν έχω καταλάβει καλά τους σημαφορους, αν η τιμή του είναι μεγαλύτερη από 0, επιτρέπεται να εκτελεστεί ο κώδικας και να μπει στο κρίσιμο τμήμα. Αν είναι 0, θα πρέπει να περιμένει, μέχρι να δωθεί κάποιο signal. Παρακαλώ διορθώστε με εάν δεν έχω καταλάβει σωστά.

 

Σε περίπτωση που οι σημαφόροι ήταν αρχικοποιημένοι με την τιμή 0, ο ψευδοκώδικας των διεργασιών θα ήταν ο εξής:

 

Διεργασία P1:

Execute(p1)

Signal(s2)

 

 

Διεργασία P2:

Wait(s2)

Execute (p2)

Signal(s4)

 

 

Διεργασία P3:

Execute (p3)

Signal(s4a)

 

 

Διεργασία P4:

Wait(s4)

Waits(4a)

Execute(p4)

Signal(s5)

 

κ.ο.κ.

 

Στην περίπτωση όμως που η άσκηση ζητάει οι σημαφόροι να είναι αρχικοποιημένοι με την τιμή 1, τι γίνεται αν επιλεγεί τυχαία πρώτη η διεργασία p4; Πώς θα την αποτρέψουμε να ξεκινήσει και να περιμένει τις διεργασίες p2 & p3;

 

Ελπίζω να είμαι κατανοητός και να μην τα έχω μπερδέψει αρκετά στο κεφάλι μου.

Επεξ/σία από Soukoss
Επισκέπτης
Δημοσ. (επεξεργασμένο)

https://el.m.wikipedia.org/wiki/Σημαφόρος_(υπολογιστές)

Θα βαλεις μια μεταβλητη συνθηκης, η οποια θα ελεγχει ποιες διεργασιες εκτελεστηκαν. Θα χρειαστεις δυο σηματοφορους. Ο σηματοφορος δεν ειναι μεταβλητη της εκαστοτε διεργασιας αλλα του λειτουργικου, οι διεργασιες αφου αιτηθουν να μπουν στην κρισιμη περιοχη ελεγχουν αν ο σηματοφορος που εδω εχει την απλη μορφη μια μεταβλητης που συνηθως καλουμε mutex, αν την βρει 1 καλει μια κληση συστηματος down_semsphore (τυχαιο το ονομα) και μπαινει στην κρισημη περιοχη, οι υπολοιπες διεργασιες αφου βρισκουν τιμη του σηματοφορου 0 μπλοκαρονται, βγαινοντας η διεργασια απο την κρισιμη περιοχη εκτελει την κληση της συναρτησης up_semaphore (τυχαιο ονομα) και γυριζει την τιμη του σηματοφορου σε 1. Αυτος εξασφαλιζει οτι μια διεργασια μπαινει στην κρισιμη περιοχη καθε φορα. Θα βαλεις και ενα σηματοφορο εστω id που θα κραταει τα pid οσων διεργασιων εκτελεστηκαν με εναν εξυπνο τροπο πχ οταν εκτελειται η 1 να αυξανει κατα ενα, οταν εκτελειται η 2 κατα δυο κτλ, μην ξεχασεις να μηδενιζεις τον σηματοφορο καθε φορα που τον ελεγχεις. Οι ειδικες συνθηκες που θες να εφαρμοσεις λεγονται μεταβλητες συνθηκης και στο παραδειγμα σου θα πρεπει να ειναι ο ελεγχος του σηματοφορου id αυτες θα μπουν στις διεργασιες πχ η διεργασια 4 θα πρεπει να βρει τον σηματοφορο id = 5 για τρεξει.

Δες βιβλια του Tanenbaum σχετικα. Περιμενε και την γνωμη αλλων παιδιων πανε χρονια απο το πανεπιστημιο....

Edit

Βασικα ο σηματοφορος id δεν προκειται να λειτουργησει με αυτην την μορφη λογω της απαιτησης της διεργασιας 4 να εκτελεστουν δυο αλλες διεργασιες.

Επεξ/σία από Επισκέπτης

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...