Middle
Kokie būdai yra, kaip užtikrinti sriegių saugumą iOS programose?
sobes.tech AI
Atsakymas iš AI
iOS srauto saugumo užtikrinimui naudojami šie pagrindiniai mechanizmai:
-
Mutex (mūtuoks):
pthread_mutex_t: žemo lygio C API iš POSIX:NSLock: objektinis blokavimo mechanizmas, Foundation dalis:NSRecursiveLock: leidžia rekursinį blokavimą tą pačią srautą:
import Foundation let lock = NSLock() var sharedResource = 0 func modifySharedResource() { lock.lock() // Kritinė sekcija sharedResource += 1 lock.unlock() } -
Spin Lock:
OSSpinLock: pasenęs ir nerekomenduojamas dėl prioritetų problemų ir perteklinio CPU naudojimo ilgesnį laiką laukiančiuose:os_unfair_lock: efektyvesnė alternatyva,OSSpinLockdalis, os.xnu:
import os.lock var unfairLock = os_unfair_lock() var anotherResource = 0 func updateResource() { os_unfair_lock_lock(&unfairLock) // Kritinė sekcija anotherResource += 1 os_unfair_lock_unlock(&unfairLock) } -
Semaphore (semaforas):
DispatchSemaphore: Grand Central Dispatch semaforas, valdymas prieigos prie išteklių skaitikliu:
import Foundation let semaphore = DispatchSemaphore(value: 1) // Skaitiklis = 1 (panašus į mūtuoką) var limitedResource = 0 func accessLimitedResource() { semaphore.wait() // sumažina skaitiklį, blokuoja jei <= 0 // Kritinė sekcija limitedResource += 1 semaphore.signal() // padidina skaitiklį } -
Lygiagretus eilė su barjerų užduotimis:
- naudojama lygiagretinė eilė (concurrent queue) GCD, skaitymui ir rašymui:
import Foundation let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent) var protectedArray: [Int] = [] func addItem(_ item: Int) { concurrentQueue.sync(flags: .barrier) { // užduotis su .barrier žyma vykdoma išskirtinai protectedArray.append(item) } } func readArray() -> [Int] { var arrayCopy: [Int] = [] concurrentQueue.sync { // įprasta sinchroninė užduotis (skaitymas) gali būti vykdoma paraleliai su kitais skaitymais arrayCopy = protectedArray } return arrayCopy } -
Atomarinės operacijos:
- žemo lygio operacijos, garantuojančios atomarumą (vykdomos kaip vienetas, be pertraukų):
import Darwin // kai kurios atomarinės funkcijos, pvz., OSAtomic... var atomicCounter: Int32 = 0 func incrementAtomicCounter() -> Int32 { // pavyzdys atomarinės operacijos return OSAtomicIncrement32(&atomicCounter) }- Swift turi eksperimentinius
Atomic<Value>tipusswift-atomicsbibliotekoje:
-
Gijos sanitizatorius:
- įrankis, kuris aptinka duomenų lenktynes (data races) vykdymo metu:
Mechanizmo pasirinkimas priklauso nuo užduoties:
- Paprastas išskirtinis prieigos būdas:
NSLock,DispatchSemaphore(value: 1),os_unfair_lock: - Rekursyvus užraktas:
NSRecursiveLock: - Skaitymas/rašymas: lygiagretinė eilė su
.barrier: - Prieigos apribojimas (resursų pulas):
DispatchSemaphore(skaitiklis > 1): - Paprasti skaitikliai/ženkliai: atomarinės operacijos (jei taikoma ir reikalinga maksimalus našumas, būkite atsargūs):
Reikėtų vengti:
OSSpinLock:- naudoti globalius užraktus be būtinybės:
- ankstyvas optimizavimas naudojant žemo lygio primitivius be jų darbo supratimo.