Τα smartphone Google Pixel είναι από τα ταχύτερα τηλέφωνα Android στην αγορά. Το Energy Aware Scheduling (EAS) είναι εν μέρει ο λόγος που το τηλέφωνο είναι τόσο ομαλό.
Πολύ πίσω στο παρελθόν, όταν το Linux ήταν απλώς μια ιδέα στο μυαλό του Linus Torvalds, οι CPU ήταν μονοπύρηνες οντότητες που απαιτούσαν τεράστια ποσότητα ενέργειας για λίγη ισχύ. Ο πρώτος εμπορικά διαθέσιμος επεξεργαστής, ο Intel 4004, έτρεχε με ρυθμό ρολογιού 740 kHz σε έναν μόνο πυρήνα. Τότε, δεν υπήρχε ανάγκη για προγραμματιστή φόρτωσης. Ο προγραμματισμός φόρτωσης προοριζόταν για τα διπύρηνα "μεγαθήρια" όπως το IBM Power 4 που κυκλοφόρησε μερικές δεκαετίες μετά. Αυτά έτρεχαν σε θηριώδη 1,1 GHz έως 1,9 GHz και απαιτούσαν προγράμματα και το σύστημα για να χρησιμοποιήσει σωστά αυτούς τους πυρήνες. Πώς φτάσαμε από αυτά τα μηχανήματα σε αλγόριθμους λογισμικού που χρησιμοποιούν πολλαπλούς πυρήνες; Μπορεί να έχετε ακούσει για το Energy Aware Scheduling (EAS) στα φόρουμ μας στο παρελθόν. Είναι μέρος του λόγου για τον οποίο τα smartphone Google Pixel αποδίδουν τόσο καλά. Τι υπέροχο έχει η ΕΑΣ και πώς φτάσαμε σε αυτό το σημείο; Προτού μπορέσουμε να το εξηγήσουμε αυτό, πρέπει να μιλήσουμε για χρονοπρογραμματιστές φόρτωσης Linux.
Η εξέλιξη των προγραμματιστών φόρτωσης Linux
Προγραμματισμός Round-Robin
Η στρογγυλή επεξεργασία είναι μια απλή έννοια για να εξηγηθεί και να κατανοηθεί, και ακόμη πιο απλή για να κατανοήσουμε τα μειονεκτήματά της. Το Round-robin χρησιμοποιεί τον τεμαχισμό χρόνου για να κατανείμει χρόνο σε κάθε διαδικασία. Ας υποθέσουμε ότι έχουμε τέσσερις διεργασίες που εκτελούνται στον υπολογιστή μας.
- Διαδικασία Α
- Διαδικασία Β
- Διαδικασία Γ
- Διαδικασία Δ
Τώρα, ας κάνουμε τη δουλειά του χρονοπρογραμματιστή. Θα διαθέσουμε 100 χιλιοστά του δευτερολέπτου (time-slicing) σε κάθε διαδικασία πριν προχωρήσουμε στην επόμενη. Αυτό σημαίνει ότι η διαδικασία Α μπορεί να πάρει 100 χιλιοστά του δευτερολέπτου για να κάνει την επεξεργασία της, στη συνέχεια μεταβαίνει στη διαδικασία Β και ούτω καθεξής. Εάν η εργασία μιας εφαρμογής διαρκεί 250 χιλιοστά του δευτερολέπτου για να γίνει, θα χρειαστεί να περάσει αυτή τη διαδικασία 3 φορές μόνο για να ολοκληρώσει τη δουλειά της! Τώρα κλιμακώστε το σε διαφορετικούς πυρήνες, έτσι ώστε η Διεργασία Α και η Διεργασία Β να εκχωρηθούν στον πυρήνα 1 και η Διεργασία Γ και η Διεργασία Δ να εκχωρηθούν στον πυρήνα 2. Αυτό αντικαταστάθηκε από τον προγραμματισμό O(n) (ο οποίος ήταν σαν το round-robin, αλλά χρησιμοποιώντας εποχές και επιτρέπει τη δυναμική κατανομή του χρόνος), μετά προγραμματισμός O(1) (ελαχιστοποίηση γενικών εξόδων, απεριόριστη υποστήριξη διεργασιών), και τέλος ο Πλήρως Δίκαιος Προγραμματιστής (CFS). Το CFS συγχωνεύτηκε στην έκδοση 2.6.23 του πυρήνα Linux τον Οκτώβριο του 2007. Έχει αναθεωρηθεί από τότε και εξακολουθεί να είναι ο προεπιλεγμένος προγραμματιστής στα συστήματα Linux.
Εντελώς δίκαιος προγραμματιστής
Το Completely Fair Scheduler υπάρχει στο Android από την έναρξή του και χρησιμοποιείται σε μη μεγάλα. ΜΙΚΡΕΣ συσκευές. Χρησιμοποιεί έναν έξυπνο αλγόριθμο για τον προσδιορισμό της σειράς επεξεργασίας, του χρόνου που διατίθεται κ.λπ. Είναι ένα παράδειγμα μιας λειτουργικής υλοποίησης του καλά μελετημένου αλγόριθμου προγραμματισμού που ονομάζεται "σταθμισμένη δίκαιη ουρά". Αυτό εστιάζει βασικά στην παροχή προτεραιότητας σε διεργασίες συστήματος και σε άλλες διεργασίες υψηλής προτεραιότητας που εκτελούνται στο μηχανή. Αν ήταν να τρέξει σε ένα μεγάλο. ΜΙΚΡΗ συσκευή, όλοι οι πυρήνες θα θεωρούνταν ίσοι. Αυτό είναι κακό, καθώς πυρήνες χαμηλής ισχύος μπορεί να αναγκαστούν να εκτελούν εντατικές εφαρμογές ή ακόμα χειρότερα, μπορεί να συμβεί το αντίθετο. Η αποκωδικοποίηση για την ακρόαση μουσικής μπορεί να γίνει στον μεγάλο πυρήνα, για παράδειγμα, αυξάνοντας άσκοπα την κατανάλωση ενέργειας. Αυτός είναι ο λόγος που χρειαζόμαστε έναν νέο προγραμματιστή για μεγάλα. LITTLE, που μπορεί πραγματικά να αναγνωρίσει και να χρησιμοποιήσει τη διαφορά στους πυρήνες με αποδοτικό τρόπο ενέργειας. Εκεί έρχεται η Ετερογενής Πολλαπλή Επεξεργασία (HMP), ο τυπικός προγραμματιστής φόρτωσης που τρέχουν τώρα τα περισσότερα τηλέφωνα Android.
Ετερογενής Πολυεπεξεργασία
Αυτός είναι ο τυπικός προγραμματιστής φόρτωσης για κάθε μεγάλο. LITTLE συσκευή που κυκλοφόρησε τα τελευταία χρόνια, εκτός από το Google Pixel. Η HMP κάνει χρήση των μεγάλων. ΛΙΓΗ αρχιτεκτονική, που εκχωρεί χαμηλή προτεραιότητα, λιγότερο εντατική εργασία στους μικρούς πυρήνες που καταναλώνουν λιγότερη ενέργεια. Το HMP είναι «ασφαλές» όπου ξέρει τι πρέπει να πάει στους μεγάλους πυρήνες και τι στους μικρούς πυρήνες, χωρίς να κάνει λάθη. Απλώς λειτουργεί και απαιτεί πολύ λιγότερη προσπάθεια για να εγκατασταθεί από την πλευρά της ανάπτυξης από κάτι σαν το EAS, στο οποίο θα μπούμε σε λίγο. Το HMP είναι απλώς μια επέκταση του CFS για να το κάνει ενήμερο.
Η HMP δεν δέχεται εικασίες, ούτε προβλέπει μελλοντικές διαδικασίες. Αυτό είναι καλό, αλλά γι' αυτό η συσκευή δεν μπορεί να είναι τόσο ρευστή όσο αυτές που τρέχουν EAS και είναι επίσης ο λόγος που καταναλώνει λίγο περισσότερη μπαταρία. Αυτό, τέλος, μας φέρνει στο Energy Aware Scheduling (EAS), το οποίο πιστεύω ακράδαντα ότι είναι το μέλλον στην ανάπτυξη ROM και πυρήνα καθώς περισσότεροι OEM το υιοθετούν.
Προγραμματισμός Ενέργειας
Το Energy Aware Scheduling (EAS) είναι το επόμενο μεγάλο πράγμα για το οποίο μιλούν οι χρήστες στα φόρουμ μας. Εάν χρησιμοποιείτε ένα OnePlus 3 (ή ένα Google Pixel, προφανώς) σίγουρα έχετε ακούσει για αυτό στα φόρουμ. Κυκλοφόρησε στο mainstream με τον Qualcomm Snapdragon 845, οπότε αν έχετε μία από αυτές τις συσκευές έχετε ήδη ένα smartphone με δυνατότητα EAS. ΕΑΣ με τη μορφή πυρήνων όπως π.χ RenderZenith και ROM όπως VertexOS και PureFusion καταλάμβαναν καταιγιστικά τα φόρουμ του OnePlus 3 στην ακμή του. Φυσικά, το Google Pixel συνοδεύεται από EAS. Με τις υποσχέσεις για βελτιωμένη διάρκεια ζωής της μπαταρίας και καλύτερες επιδόσεις, ποια είναι η ατάκα;
Το Energy Aware Scheduling δεν είναι τόσο απλό όσο δεν είναι καθολικό για κάθε συσκευή όπως το CFS ή το HMP. Το EAS απαιτεί κατανόηση του επεξεργαστή στον οποίο λειτουργεί, με βάση ένα ενεργειακό μοντέλο. Αυτά τα ενεργειακά μοντέλα κατασκευάζονται από ομάδες μηχανικών που δοκιμάζουν συνεχώς και εργάζονται για να προσφέρουν βέλτιστη απόδοση. Καθώς τα Snapdragon 820 και 821 είναι βασικά τα ίδια, οι προσαρμοσμένοι πυρήνες στο OnePlus 3 χρησιμοποιούν το ενεργειακό μοντέλο Google Pixel. Οι συσκευές με το Snapdragon 845 μπορούν να χρησιμοποιήσουν το EAS και το OnePlus 6 το κάνει σε κάποιο βαθμό. Δεν είναι τόσο συντονισμένη όσο θα ήταν μια συσκευή Google Pixel, αλλά κάνει τη δουλειά. Ακολουθεί ένα παράδειγμα για το πώς, παρά το γεγονός ότι το OnePlus 6 έχει καλύτερο επεξεργαστή με EAS, το Pixel 2 XL εξακολουθεί να τον κερδίζει σε ομαλότητα. Και οι δύο αυτές εικόνες ελήφθησαν από το δικό μας αναθεώρηση προσανατολισμένη στην ταχύτητα του OnePlus 6.
Εάν δυσκολεύεστε να κατανοήσετε τα γραφήματα, μπορείτε να ρίξετε μια ματιά στην παρακάτω εικόνα για καθοδήγηση. Οτιδήποτε ξεπερνά την πράσινη γραμμή υποδηλώνει πτώση καρέ και, στη χειρότερη περίπτωση, αισθητό τραυλισμό.
Η υλοποίηση του EAS στο OnePlus 6 είναι ενδιαφέρουσα, καθώς δεν φαίνεται να είναι μια ολοκληρωμένη εφαρμογή όπως θα βρίσκατε σε ένα Google Pixel με το ίδιο SoC. Ούτε οι συντονίσιμες χρονοπρογραμματιστή δεν έχουν πολύ νόημα, οπότε αυτό πιθανώς εξηγεί γιατί δεν είναι τόσο αποδοτική απόδοση όσο θα περίμενε κανείς. Είναι εξαιρετικά συντηρητικό στην κατανάλωση ενέργειας, με το σύστημα να δίνει προτεραιότητα στους πυρήνες χαμηλής ισχύος για το μεγαλύτερο μέρος της εργασίας.
Τα συντονίσιμα είναι απλώς ένα σύνολο παραμέτρων που μεταβιβάζονται στον κυβερνήτη της CPU, το οποίο αλλάζει τον τρόπο με τον οποίο αντιδρά ο κυβερνήτης σε ορισμένες καταστάσεις όσον αφορά τη συχνότητα. Στη συνέχεια, ο προγραμματιστής αποφασίζει πού τοποθετεί εργασίες σε διαφορετικούς επεξεργαστές. Τα συντονίσιμα του OnePlus 6 έχουν οριστεί να δώσουν προτεραιότητα στην εργασία σε πυρήνες χαμηλής ισχύος. Επίσης, δεν βοηθάει το γεγονός ότι το Google Pixel 2 έχει τεράστια ενίσχυση εισόδου, διατηρώντας συνεχώς και τους 8 πυρήνες online. Η Google χρησιμοποιεί επίσης ένα εξισορροπητής διακοπής που βοηθά στην αφαίρεση των πτώσεων του πλαισίου και στη βελτίωση της απόδοσης.
Πώς λειτουργεί λοιπόν το EAS; Γιατί είναι τόσο αποτελεσματικό μόνο σε ορισμένες συνθήκες;
Το Energy Aware Scheduling εισάγει την ανάγκη χρήσης ενός ενεργειακού μοντέλου και όπως αναφέρθηκε παραπάνω απαιτεί πολλές δοκιμές και δουλειά για να γίνει τέλειο. Το EAS επιχειρεί να ενοποιήσει τρία διαφορετικά βασικά μέρη του πυρήνα τα οποία δρουν όλα ανεξάρτητα και το ενεργειακό μοντέλο βοηθά στην ενοποίηση τους.
- Προγραμματιστής Linux (CFS, που αναφέρεται παραπάνω)
- Cpuidle Linux
- Linux cpufreq
Η ενοποίηση και των 3 μερών κάτω από τον χρονοπρογραμματιστή και ο υπολογισμός τους από κοινού δίνει δυνατότητες εξοικονόμησης ενέργειας, καθώς ο υπολογισμός τους μαζί τους επιτρέπει να είναι όσο το δυνατόν πιο αποδοτικοί. Το CPUIdle προσπαθεί να αποφασίσει πότε η CPU πρέπει να μεταβεί σε κατάσταση αδράνειας, ενώ η CPUFreq προσπαθεί να αποφασίσει πότε θα αυξήσει ή θα μειώσει τη CPU. Και οι δύο αυτές μονάδες έχουν πρωταρχικό στόχο την εξοικονόμηση ενέργειας. Όχι μόνο αυτό, στη συνέχεια κατηγοριοποιεί τις διαδικασίες σε τέσσερις cgroups, που είναι top-app, system-background, foreground και background. Οι εργασίες που πρόκειται να υποβληθούν σε επεξεργασία τοποθετούνται σε μία από αυτές τις κατηγορίες και στη συνέχεια δίνεται στην κατηγορία ισχύς CPU και η εργασία ανατίθεται σε διαφορετικούς πυρήνες CPU. Η κορυφαία εφαρμογή είναι η υψηλότερη προτεραιότητα ολοκλήρωσης, ακολουθούμενη από το προσκήνιο, το παρασκήνιο και μετά το παρασκήνιο συστήματος. Το φόντο έχει τεχνικά την ίδια προτεραιότητα με το σύστημα-background, αλλά το σύστημα-background συνήθως έχει επίσης πρόσβαση σε περισσότερους μικρούς πυρήνες. Στην πραγματικότητα, το Energy Aware Scheduling παίρνει βασικά μέρη του πυρήνα Linux και τα ενοποιεί όλα σε μια διαδικασία.
Κατά την αφύπνιση της συσκευής, η EAS θα επιλέξει τον πυρήνα στην πιο ρηχή κατάσταση αδράνειας, ελαχιστοποιώντας την ενέργεια που απαιτείται για την αφύπνιση της συσκευής. Αυτό βοηθά στη μείωση της απαιτούμενης ισχύος κατά τη χρήση της συσκευής, καθώς δεν θα αφυπνίσει το μεγάλο σύμπλεγμα εάν δεν χρειάζεται. Η παρακολούθηση φορτίου είναι επίσης ένα εξαιρετικά κρίσιμο μέρος του EAS και υπάρχουν δύο επιλογές. Το "Per-Entity Load Tracking" (PELT) χρησιμοποιείται συνήθως για την παρακολούθηση φόρτωσης, οι πληροφορίες χρησιμοποιούνται στη συνέχεια για να καθοριστούν οι συχνότητες και ο τρόπος ανάθεσης εργασιών σε όλη την CPU. Η "Παρακολούθηση φόρτωσης υποβοηθούμενης από παράθυρα" (WALT) μπορεί επίσης να χρησιμοποιηθεί και είναι αυτό που χρησιμοποιείται στο Google Pixel. Πολλές EAS ROM στα φόρουμ μας, όπως το VertexOS, επιλέγουν να χρησιμοποιούν το WALT. Πολλές ROM θα κυκλοφορήσουν δύο εκδόσεις του πυρήνα με WALT ή PELT, επομένως είναι στο χέρι του χρήστη να αποφασίσει. Το WALT είναι πιο εκρηκτικό, με υψηλές κορυφές στη συχνότητα της CPU, ενώ το PELT προσπαθεί να παραμείνει πιο συνεπές. Ο ανιχνευτής φορτίου στην πραγματικότητα δεν επηρεάζει τη συχνότητα της CPU, απλώς ενημερώνει το σύστημα σε ποια θέση είναι η χρήση της CPU. Μια υψηλότερη χρήση της CPU απαιτεί υψηλότερη συχνότητα και επομένως ένα σταθερό χαρακτηριστικό του PELT είναι ότι προκαλεί αργή άνοδο ή μείωση της συχνότητας της CPU. Το PELT τείνει να ξεφεύγει προς την αναφορά υψηλότερου φορτίου CPU, επομένως μπορεί να παρέχει υψηλότερη απόδοση με υψηλότερο κόστος μπαταρίας. Κανείς δεν μπορεί πραγματικά να πει σε αυτή τη χρονική στιγμή ποιο σύστημα παρακολούθησης φορτίου είναι καλύτερο, ωστόσο, καθώς και οι δύο μέθοδοι παρακολούθησης φορτίου βελτιώνονται και βελτιώνονται συνεχώς.
Είτε έτσι είτε αλλιώς, είναι προφανές ότι, ανεξάρτητα από τη μέθοδο παρακολούθησης φορτίου που χρησιμοποιείται, υπάρχει αύξηση της απόδοσης. Αντί να επεξεργάζονται απλώς εργασίες σε οποιονδήποτε επεξεργαστή, η εργασία αναλύεται και εκτιμάται η ποσότητα ενέργειας που απαιτείται για την εκτέλεση της. Αυτή η έξυπνη τοποθέτηση εργασιών σημαίνει ότι οι εργασίες ολοκληρώνονται με πολύ πιο αποτελεσματικό τρόπο, ενώ παράλληλα κάνει το σύστημα πιο γρήγορο στο σύνολό του. Το EAS έχει να κάνει με την πιο ομαλή δυνατή διεπαφή χρήστη με ελάχιστη κατανάλωση ενέργειας. Εδώ μπαίνουν στο παιχνίδι άλλα εξωτερικά στοιχεία, όπως το schedtune.
Το Schedtune ορίζεται σε κάθε cgroup από δύο συντονίσιμα που εξασφαλίζουν καλύτερο έλεγχο των εργασιών που πρέπει να ολοκληρωθούν. Δεν ελέγχει μόνο την κατανομή των εργασιών σε πολλαπλές CPU, αλλά και εάν το αντιληπτό φορτίο πρέπει να διογκωθεί προκειμένου να διασφαλιστεί ότι οι εργασίες που είναι ευαίσθητες στον χρόνο ολοκληρώνονται ταχύτερα. Με αυτόν τον τρόπο, οι εφαρμογές και οι υπηρεσίες στο προσκήνιο που χρησιμοποιεί ο χρήστης δεν θα επιβραδύνουν και θα προκαλέσουν περιττά προβλήματα απόδοσης.
Ενώ ο Προγραμματισμός Ενέργειας με επίγνωση είναι το επόμενο μεγάλο πράγμα, μπορεί επίσης να υποστηριχθεί ότι είναι ήδη εδώ και ήταν εδώ και αρκετό καιρό. Με ολοένα και περισσότερες συσκευές να φτάνουν στην επικρατούσα τάση με τον Προγραμματισμό Ενημερότητας Ενέργειας, μια νέα εποχή απόδοσης επεξεργασίας μέσω κινητού είναι εδώ.
Τα πλεονεκτήματα και τα μειονεκτήματα των Round-Robin, CFS, HMP και EAS
Ενώ οι δεξιότητές μου στα γραφικά είναι κατώτερες, έχω συγκεντρώσει μια εικόνα που θα πρέπει να συνοψίζει τα πλεονεκτήματα και τα μειονεκτήματα καθενός από αυτούς τους προγραμματιστές.
Θα ήθελα να εκφράσω ένα ιδιαίτερο ευχαριστώ στον Αναγνωρισμένο Συνεργάτη XDA Μουσταφά Βαέλ του οποίου οι επεξηγήσεις για διάφορες πτυχές της ΕΑΣ βοήθησαν πολύ στο να γίνει δυνατό αυτό το άρθρο. Θα ήθελα επίσης να ευχαριστήσω τον XDA Recognized Developer joshuous, Αναγνωρισμένος προγραμματιστής XDA RenderBroken και Ο Mostafa Wael για το άρθρο του στην EAS. Για όσους από εσάς βρήκατε ενδιαφέρον για ανταλλακτικά που σχετίζονται με το EAS, το Linaro έχει πολλή τεκμηρίωση για το EAS που μπορείτε να διαβάσετε.