Middle
Барҳо ва семафорҳо ба чӣ асос ёфтаанд?
sobes.tech AI
Ҷавоб аз AI
Барьерҳо ва семафорҳо дар контексти барномасозии параллелӣ ба механизмҳои ҳамоҳангсозӣ асос ёфтаанд:
-
Семафорҳо: Ба амалҳои атомӣ дар бораи ҳисобкунак асос ёфтаанд. Амали асосӣ:
wait(ёP,гирифтани): Ҳисобкунаро кам мекунад. Агар ҳисобкунар манфӣ шавад, раванд бозмедорад, то он даме, ки раванди дигарsignalиҷро кунад.signal(ёV,озод кардан): Ҳисобкунаро зиёд мекунад. Агар равандҳои бозмондор вуҷуд дошта бошанд, яке аз онҳо бедор мешавад.- Семафорҳо метавонанд бинарӣ (қимати 0 ё 1, ҳамчун mutex кор мекунанд) ё ҳисобӣ (мегузоранд, ки шумораи маҳдуди равандҳо ба манбаъ дастрасӣ пайдо кунанд).
-
Барьерҳо: Ба механизми интизорӣ аз ҷониби ҳамаи иштирокчиён асос ёфтаанд. Раванди, ки ба барьер мерасад, бозмедорад, то ҳама равандҳои дигар, ки дар ҳамоҳангсозӣ иштирок мекунанд, ба он барьер расанд. Пас аз он, онҳо ҳамзамон идома медиҳанд.
Дар таҳияи iOS/macOS, ин консепсияҳо бо истифода аз рамзҳои ҳамоҳангсозии параллелӣ, ба монанди GCD (Grand Central Dispatch) ва OperationQueue амалӣ карда мешаванд.
Масалан, дар GCD:
// Мисоли истифодаи DispatchSemaphore
ҳолати semaphore = DispatchSemaphore(value: 1) // Семофор бинарӣ
// Wait (гирифтани)
semaphore.wait()
// Дастрасӣ ба қисмати критикӣ
semaphore.signal() // Сигнал (озод кардан)
Барьерҳо дар GCD бо истифода аз вазифаҳои барьерӣ (barrier tasks) барои қаторҳои ҳамоҳангшуда амалӣ карда мешаванд:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)
// Воситаҳои оддӣ
concurrentQueue.async {
// ...
}
// Воситаи барьерӣ - танҳо вақте иҷро мешавад, ки ҳамаи вазифаҳои оддӣ пешина анҷом ёфта бошанд
// Ва пас аз он, вазифаҳои нав оғоз намешаванд, то он даме, ки ин анҷом наёбад
concurrentQueue.async(flags: .barrier) {
// ...
}
// Воситаҳои оддӣ, ки пас аз анҷоми вазифаи барьерӣ оғоз мешаванд
concurrentQueue.async {
// ...
}