Senior
227
Қалай приоритеттердің инверсиясы?
AI-дан жауап
sobes.tech AI
Басымдылықтарды кері қайтару — бұл нақты уақыт операциялық жүйелеріндегі жоспарлау мәселесі, онда жоғары басымдылықты тапсырма төменгі басымдылықты тапсырмамен блокталады, ол қажетті ресурсты ұстайды. Бұл, орташа басымдылықты тапсырма төменгі басымдылықты тапсырманы ығыстырып, ол жоғары басымдылықты тапсырманы блоктағанда болады.
Мысал сценарий:
- H тапсырмасы (жоғары басымдылық) R ресурсына қол жеткізуді тырысады және R бос емес болғандықтан блокталады.
- L тапсырмасы (төменгі басымдылық) R ресурсын ұстайды.
- M тапсырмасы (орташа басымдылық) орындалуға дайын болып, L-ді ығыстырады.
- Осылайша, H, жоғары басымдылық болғанымен, M аяқталғанша күтеді, содан кейін L қайта бастайды және R босатады.
Шешімдер:
- Басымдылық мұрагерлік протоколы (Priority Inheritance Protocol): Ресурсты ұстап тұрған тапсырма, жоғары басымдылықты тапсырма қажет болғанда, уақытша осы жоғары басымдылықты тапсырманың басымдылығын мұраға алады.
- Басымдылық шегі протоколы (Priority Ceiling Protocol): Әрбір ресурстың ең жоғары басымдылық шегі тағайындалады, ол осы ресурсты қолдана алатын тапсырманың ең жоғары басымдылығы. Тапсырма ресурсты тек қана алуға құқылы, егер оның басымдылығы ресурсты қолданатын басқа тапсырмалардан жоғары болса немесе ол өзі осы ресурсты ұстап тұрса.
// Жоспарлаудың нақты механизмдерін қолданбай, қарапайым демонстрация мысалы
import Foundation
let resource = NSCondition()
var resourceInUse = false
func lowPriorityTask() {
print("Төмен басымдылық: Ресурсты алуға тырысады...")
resource.lock()
while resourceInUse {
resource.wait()
}
resourceInUse = true
print("Төмен басымдылық: Ресурс алынды.")
// Жұмыс имитациясы
Thread.sleep(forTimeInterval: 2)
resourceInUse = false
print("Төмен басымдылық: Ресурс босатылды.")
resource.signal()
resource.unlock()
}
func mediumPriorityTask() {
print("Орташа басымдылық: Жүреді...")
// Жұмыс имитациясы, ол төменгі басымдылықты тапсырманы ығыстыруы мүмкін
Thread.sleep(forTimeInterval: 3)
print("Орташа басымдылық: Аяқталды.")
}
func highPriorityTask() {
print("Жоғары басымдылық: Ресурсты алуға тырысады...")
resource.lock()
while resourceInUse {
print("Жоғары басымдылық: Ресурсты күтуде...")
resource.wait()
}
resourceInUse = true
print("Жоғары басымдылық: Ресурс алынды.")
// Жұмыс имитациясы
Thread.sleep(forTimeInterval: 1)
resourceInUse = false
print("Жоғары басымдылық: Ресурс босатылды.")
resource.signal()
resource.unlock()
}
let lowQ = DispatchQueue(label: "com.example.low", qos: .utility) // Төменгі басымдылық
let mediumQ = DispatchQueue(label: "com.example.medium", qos: .userInitiated) // Орташа басымдылық
let highQ = DispatchQueue(label: "com.example.high", qos: .userInteractive) // Жоғары басымдылық
// Төменгі, жоғары, орташа тапсырмаларды орындау тәртібі
lowQ.async { lowPriorityTask() }
Thread.sleep(forTimeInterval: 0.1) // Төменгі тапсырмаға бастауға мүмкіндік беру
highQ.async { highPriorityTask() }
Thread.sleep(forTimeInterval: 0.2) // Жоғары тапсырмаға блокталуға мүмкіндік беру
mediumQ.async { mediumPriorityTask() }
// Нақты операциялық жүйеде жоспарлаушы басымдылықтарды басқарады,
// мұнда бұл тек блоктау/күту принципін көрсету үшін.
RunLoop.main.run(until: Date(timeIntervalSinceNow: 7))