Kako varna je spremenljivka?

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

Kako varna je spremenljivka?

OdgovorNapisal/-a Kroko » 05 Okt 2016, 18:06

Nekaj stvari me bega in ne najdem pravega odgovora. Zaplete se predvsem zato, ker je odvisno od arhitekture in prevajalnika.

Kako "varna" je spremenljivka? Recimo tipa int.

Kaj imam v mislih?

Poznamo oznako volatile. S tem zagotovimo, da se read/write dejansko zgodi ne glede na to, kaj si misli optimizator. Kaj pa vrstni red (reordering, memory barrier)? MS ima to rešeno čeprav ni v specifikaciji standarda.

Atomičnost - se lahko zgodi, da nekdo prebere spremenljivko ko je ta zapisana "samo na pol"? C++11 ima (baje, nisem testiral) to rešeno. Kaj pa navaden C in navaden int? Če pogledam navaden inkrement v asemblerju - so to trije ukazi. To ni atomično.

Če int ni atomičen, kako narediti sinhronizacijo?

PS
V mojem konkretnem primeru gre za multicore mcu, mojo spremenljivko vidita oba na istem naslovu.

PPS
Glede na moje izkušnje problemov ni. Moti me, ker bi po teoriji, ki jo poznam, morali biti problemi. Na maram pa kode, za katero ne vem, zakaj dela.
http://www.planet-cnc.com poskakuješ na eni nogi in žvižgaš alpske podoknice Kroko was here!
Uporabniški avatar
Kroko
 
Prispevkov: 4771
Pridružen: 14 Jan 2015, 12:12
Kraj: Ljubljana
Zahvalil se je: 680 krat
Prejel zahvalo: 1647 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 255

Re: Kako varna je spremenljivka?

OdgovorNapisal/-a blasny » 05 Okt 2016, 19:05

Glede atomic increment:

Uporabit moraš Compare-and-swap instrukcijo, ki je specifična za vsak procesor. Mora biti implementirana v procesorju, ker edino tako je zagotovljena atomičnost. Increment, ki je narejen s tremi instrukcijami: read, increment, write; ne more biti atomičen (kot si že ugotovil)

V C++11 in tudi C11 je to rešeno tako, da so programerji prevajalnika (oz. bolj natančno) standardne knjiznice, delo iskanja pravih instrukcij že opravili zate. V obeh atomic operacije uporabljajo Compare-and-Swap inštrukcije procesorja, kjer je to le mogoče. Če pa taka instrukcija ni na voljo, potem uporabljajo počasnejse Lock mehanizme (običajno mutex). Ali je uporabljena Compare-and-swap ali Mutex pa preveriš tako, da kličeš: http://en.cppreference.com/w/cpp/atomic/atomic_is_lock_free
blasny
 
Prispevkov: 437
Pridružen: 18 Jan 2015, 16:48
Zahvalil se je: 314 krat
Prejel zahvalo: 122 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 15

Re: Kako varna je spremenljivka?

OdgovorNapisal/-a igo » 05 Okt 2016, 19:20

Ali ima n-jedrni procesor tudi n ali vsaj x>1 ločenih demultiplekserjev naslovov za dostop do spremenljivk v RAM-u?
Ali ima RAM dva ločena demultiplekserja naslovov - enega za branje in enega za pisanje?

Če je odgovor 2-krat ne, je očitno na strojnem nivoju (interne zastavice ali signali) rešeno, da dovoli naslednje branje ali pisanje na isti naslov šele po končanem zapisovanju vseh bitov neke spremenljivke ali celo array-a, strukture, ali česa še bolj zapletenega.

Če je kateri izmed odgovorov da, potem pa :cry: .

Prevajalniki višjih jezikov težijo že (warning, error), kadar želiš rezervirati prostor recimo 16 bytov (128 bitov), nato pa do njega dostopati (branje + pisanje = rovarjenje po bitih) s spremenljivimi dolžinami spremenljivk. Vpišeš 32-bitno, bereš srednjih 16 bitov ali obratno in podobne akrobacije. Nekako želi biti prevajalnik bolj pameten od uporabnika in ga prisiliti v razna shiftanja, maskiranja in indeksiranja. Zbirnik tak rezerviran prostor mirno prebavi, C pa očitno ve, koliko bitna je katera spremenljivka, nato pa to še "zašpeca" procesorju.
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
igo
 
Prispevkov: 1492
Pridružen: 11 Apr 2015, 13:38
Kraj: Krško
Zahvalil se je: 174 krat
Prejel zahvalo: 364 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 35


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost