Sobes.tech
Middle

Πώς πραγματοποιείται η πολυνηματικότητα σε μια συσκευή με έναν πυρήνα;

sobes.tech AI

Απάντηση από AI

Σε μια συσκευή με έναν πυρήνα, η πολυνηματικότητα εξομοιώνεται από το λειτουργικό σύστημα μέσω του μηχανισμού του χρονικού πλαισίου και της αλλαγής πλαισίου.

  • Χρονικό πλαίσιο: Σε κάθε νήμα αποδίδεται ένα μικρό χρονικό διάστημα επεξεργαστή.
  • Προληπτική πολυδιεργασία: Το λειτουργικό σύστημα διακόπτει την εκτέλεση ενός νήματος στο τέλος του χρονικού πλαισίου του ή όταν περιμένει πόρους (π.χ. είσοδο/έξοδο).
  • Αλλαγή πλαισίου: Η κατάσταση του τρέχοντος νήματος (αρχεία καταγραφής επεξεργαστή, δείκτης εντολής, κατάσταση μνήμης) αποθηκεύεται και φορτώνεται η κατάσταση του επόμενου νήματος.
  • Ψευδαίσθηση παράλληλης εκτέλεσης: Χάρη στην ταχεία εναλλαγή μεταξύ νημάτων, δημιουργείται η εντύπωση ότι εκτελούνται παράλληλα, αν και σε κάθε χρονική στιγμή λειτουργεί μόνο ένα νήμα.

Το iOS χρησιμοποιεί πλαίσια όπως το GCD (Grand Central Dispatch) και τις Ουρές Ενεργειών, που αποσκοπούν στην αφαίρεση αυτών των χαμηλού επιπέδου μηχανισμών, απλοποιώντας τη διαχείριση της πολυνηματικότητας για τον προγραμματιστή. Το GCD χρησιμοποιεί ομάδες νημάτων και διαχειρίζεται αυτόματα τον κύκλο ζωής και τον προγραμματισμό τους στους διαθέσιμους πυρήνες επεξεργαστή (ακόμα και σε έναν).

Για παράδειγμα, με χρήση GCD:

import Foundation

// Δημιουργία ασύγχρονης εργασίας
DispatchQueue.global(qos: .userInitiated).async {
    // Κώδικας που θα εκτελεστεί σε φόντο
    // Σε μια συσκευή με έναν πυρήνα, αυτός ο κώδικας θα εναλλάσσεται
    // με την εκτέλεση άλλων νημάτων/κύριου νήματος
    print("Εκτελείται σε φόντο")
}

// Το κύριο νήμα συνεχίζει την εκτέλεση
print("Εκτελείται στο κύριο νήμα")

Ακόμα και σε μια συσκευή με έναν πυρήνα, το GCD θα τοποθετήσει αυτή την εργασία σε ουρά και θα της αποδώσει χρονικά πλάνα για εκτέλεση, εναλλάσσοντας μεταξύ αυτής και του κύριου νήματος (και άλλων νημάτων, αν υπάρχουν) για τη δημιουργία της ψευδαίσθησης της παράλληλης εκτέλεσης.