Snow Leopardin uusista lowlevel-ominaisuuksista

Friday, August 28th 2009 at 23:19 in Apple

Applelta on ilmestynyt artikkeli, joka listaa Snow Leopardin uusia ominaisuuksia kehittäjän näkökulmasta. Nostan tähän suomeksi esiin muutaman kiinnostavimman:

Grand Central
Tarjoaa sovelluksille helpon mekanismin multicore-prosessorien hyödyntämiseen. Sovelluksen lähdekoodiin merkitään alueita, joita saa ajaa rinnakkain, ja GCD käynnistelee niitä sitten eri coreihin samaan aikaan.
NSCache/libcache
Antaa sovelluksen varata omia välimuistejaan siten, että käyttöjärjestelmä voi vapauttaa niitä, mikäli muistia tarvitaan "oikeaan" käyttöön.
64-bit kernel
64-bittisyys mahdollistaa tietysti suuremman muistin käytön, mutta nyt kaikkea ylimääräistä voidaan hyödyntää myös levyvälimuistina. Lisäksi kun käytössä on useita näytönohjaimia, niiden näyttömuistia voidaan hyödyntää yhtaikaa (vaikka se ylittäisi 1.5GB).
OpenCL
OpenCL:llä voi tehdä pieniä ohjelmia (kerneleitä), joita ajetaan näytönohjainten huipputehokkaissa GPU-prosessoreissa. Sovellus voi kirjoittaa näytönohjaimen videomuistiin dataa, jota kernel sitten käsittelee GPU:ssa ja palauttaa tulokset niinikään videomuistin kautta. Hello-esimerkki näyttää mallia.
Sudden Termination
Tämä on mielenkiintoinen optimointi, joka nopeuttaa sellaisten sovellusten sulkeutumista, joiden ei tarvitse tallennella mitään lopuksi. Ne tapetaan välittömästi SIGKILL-signaalilla käyttöjärjestelmän sammuessa. Kaipaisikohan Windows jotain vastaavaa? :D

Itse odottelen vielä omaa Snow Leopardiani, jonka pitäisi saapua ensi viikolla..

2 Comments
Ossi 31.8.2009 11:34:19

Luin tuon Grand Central Dispatcherin kuvauksen ja olin aika "häh". Siis mikä ihme siinä on pihvinä? Semaforien ja säiekäsittelyn hienosäätö?

Normaali tapahan sovellusten tekemiseksi monia prosessoreita tukeviksi on yksinkertaisesti tehdä niihin säikeitä (tai Unix-maailmassa spawnata / forkata aliprosesseja huolehtimaan joistain asioista). Säikeethän sitten jaetaan käyttiksen puolesta automaattisesti eri prosessoreille ja suoritetaan niin nopeasti kuin mahdollista - criticalsectioneita lukuun ottamatta. Onko nyt siis ideana merkitä jonkinasteisia ei-kriittisiä sektioita yksisäikeiseen koodiin, jotka saa suorittaa yht'aikaisesti? Kuulostaa hurjalta. Mistä muuten teit tuon tulkinnan? Itse en löydä sitä noista Applen dokumenteista.

Jäin itse jotenkin sellaiseen käsitykseen, että tässä Grand Central Dispatchissa koodaajat voivat lähettää joitain asynkronisia tehtäviä GCD:n työjonoon ja tämä sitten suorittaa nämä omia aikojaan. No ei ole kyllä kovin maata järisyttävä. Koodaajalle hyöty on lähinnä siinä, että ei tarvitse kirjoittaa omaa säiekäsittelyä näistä asynkronisista kutsuista.

Vai onko idea enemmänkin siinä, että monia ennen ei-säievarmoja funktioita on nyt saatu säievakaiksi ja siirretty kutsuttavaksi GCD:n kautta?

Sudden termination on ajatuksena ihan hauska. Veikkaan tosin, että aika moni koodaaja laittaa vain vaikiona NSProcessInfo.disableSuddenTermination() varmuuden vuoksi :).

OpenCL puolestaan kuulostaa hyvin mielenkiintoiselta. On hyvin mielenkiintoista nähdä, saavuttaako se suosiota. Nyt se on aika Apple only.

kennu 31.8.2009 12:14:12

GCD:n idea on juuri se, että työjonoon laitetaan joukko asynkronisia tehtäviä ja odotellaan niiden valmistumista. Jos olet harrastanut säieohjelmointia, tiedät varmaan miten tuskallisen monimutkaista ja bugiherkkää niitä on koodata jaettuine muisteineen, muuttujine ja lukituksineen. Moniydinprosessorin hyödyntämiseksi yhtäaikaisia säikeitä pitäisi olla vielä aika paljon käytössä, eikä vain jotain yksinkertaista socket-listeneriä. Apple suositteleekin siirtymistä GCD:n operaatiojonoihin, pois thread-ohjelmoinnista.

GCD:n ohjelmointi perustuu closureihin, eli koodiblokkeihin, joilla on omat sisäiset muuttujansa. Closuret ovat tuttuja JavaScriptistä. Esimerkiksi JavaScriptissä:

var muuttuja = arvo1; setTimeout(function() { muuttuja = arvo2; }, 1000);

muodostaa closuren, jossa muuttuja perii ensin globaalin arvon ja muuttuu sen jälkeen lokaaliksi, eikä sen muuttelu häiritse pääohjelmaa.

Nyt sitten Objective-C:ssä voi tehdä samanlaisia closureita käsittääkseni näin:

int muuttuja = arvo1; x = ^{ muuttuja = arvo2; };

Noita voi sitten ajella NSOperationQueuessa, joka olisi tyypillisesti yhteinen koko sovellukselle:

NSOperationQueue *aQueue; aQueue = [[NSOperationQueue alloc] init]; [aQueue addOperationWithBlock:x]; [aQueue addOperationWithBlock:y]; [aQueue addOperationWithBlock:^{ muuttuja = z; }]; [aQueue waitUntilAllOperationsAreFinished];

Lisää tietoa Applen Concurrency Programming Guidesta. Disclaimer, en ole vielä kokeillut näitä käytännössä.


You can use Markdown to format your comment:

  • > quoted text
  • *italic* text
  • **bold** text
  • `code block` (multi-line is ok, whitespace is preserved)
  • [link text](http://www.google.com "link title")

Separate paragraphs in your text with two newlines