Cross: Programiranje OS-a

Jul 16, 2013 281 Replies

I opet bi trebalo biti br¾e? Npr. uèitati 100 MB i slo¾iti u memoriju, ili uèitati samo 30 MB, dekomprimirati i slo¾iti u memoriju! ©to je br¾e?

Ovisno da li je ono sto ti program u pitanju radi CPU intensive, ili I/O intensive, kakav si sa slobodnom memorijom, da li je neki low-power low-CPU laptop/mobile device ili 16-CORE desktop koji trosi struje kao pecnica itd.

Primjeti da se ne radi samo o CPU potrebnom za dekompresiju, nego neke stvari koje ne trose nista vremena na raw I/O (tipa seek), moraju trositi nekih resursa na compressed. Recimo, da imas executable od 200MB i startao si ga, ovako ti izgleda usporedba 4 osnovne mogucnosti (postoje i manje varijacije na temu, ali to cemo ignorirati za potrebe ove skolice):

(1) raw I/O varijanta (dakle ono standardno, bez kompresije):

- OS ucita 4kb sa diska sa offseta 0 iz .exe (velikog 200MB na disku)

- execute na offset 0

- program nesto malo radi pa napravi JMP na 100ti MB

- OS ucita 4kb sa diska sa offseta 100MB iz .exe

- execute na offset 100MB [itd]

Prednost: bez CPU/memory overheada, inicijalno mali I/O Nedostatak: sto dalje se izvrsava program, tim veci I/O (ucitavanje uncompressed podataka), te vece zauzece diska za .exe

(2) compressed varijanta 1 (demand paging loading, full compression):

- OS ucita 1kb sa diska sa offseta 0 iz .exe (velikom 50MB na disku)

- OS dekomprimira taj 1kB i dobije 4kB uncompressed

- execute na offset 0

- program nesto malo radi pa napravi JMP na 100ti MB

- Oops. Gdje je uncompressed offset 100000000 u compressed fileu? to se ne moze znati. Pa OS mora citati sa diska sve dok ne procita 100MB uncompressed. Dakle treba procitati i dekomprimirati recimo 25MB compressed dok ne dodje do 100tog MB uncompressed; te tek tada moze ucitati 1kb compressed sa diska sa offseta 100MB iz .exe!

- OS dekomprimira taj 1kB i dobije 4kB uncompressed

- execute na offset 100MB

- (2a) procitanih 25MB sa diska odbaciti (pa ces ustedjeti memoriju, ali slijedeci put opet moras citati sve!) ili (2b) procitanih 25MB sa diska zadrzati u memoriji da imas za sljedeci puta (ali trosis memoriju!) [itd]

Prednost: dosta manji I/O (compressed data) za linearno citanje Nedostatak: puno veci CPU usage *uvijek*. Ako je I/O citanje random a ne linearno, puno veci I/O pocetno. Nakon toga za ostala random citanja je ili i dalje puno veci I/O (2a) ili puno veca potrosnja memorije (50MB).

(3) compressed varijanta 2 (demand paging loading, lower segmented compression: .exe je pakiran u segmentima od recimo 8MB sto daje dosta losiju kompresiju od (2))

- OS ucita 1kb sa diska sa offseta 0 iz .exe (velikom 100MB na disku)

- OS dekomprimira ta 1kB i dobije 4kB uncompressed

- execute na offset 0

- program nesto malo radi pa napravi JMP na 100ti MB

- Oops. Gdje je uncompressed offset 100000000 u compressed fileu? Ne znamo. Ali znamo [zapisalo smo u exe, zato i niza kompresija uz ostalo] da: - 8MB compressed pocinje na npr 17MB uncompressed - 16MB compressed pocinje na npr 35MB uncompressed - 24MB compressed pocinje na npr 51MB uncompressed - 32MB compressed pocinje na npr 55MB uncompressed - 40MB compressed pocinje na npr 65MB uncompressed - 48MB compressed pocinje na npr 79MB uncompressed - 56MB compressed pocinje na npr 91MB uncompressed - 64MB compressed pocinje na npr 101MB uncompressed Na osnovu toga, OS zna da sa diska treba procitati samo 8MB izmedju 56MB i 64MB compressed. Pa onda OS procita tih 8MB i dekomprimira ih.

- execute na offset 100MB

- (3a) procitanih 8MB sa diska odbaciti ili (3b) procitanih 8MB sa diska zadrzati u memoriji da imas za sljedeci puta [itd]

Prednost: relativno manji I/O (compressed data) za linearno citanje Nedostatak: primjetno veci CPU usage *uvijek*. Ako je I/O citanje random a ne linearno, nesto veci I/O pocetno. Nakon toga za ostala random citanja je i dalje primjetno veci I/O (3a) ili nesto veca potrosnja memorije (3b)

(4) compressed varijanta 3 (full loading, full compression):

- OS ucita svih 50MB compressed sa diska

- OS dekomprimira tih 50MB compressed u 200MB uncompressed

- execute na offset 0

Prednost: dosta manji I/O (compressed data) *uvijek*! nema I/O pauza u toku izvrsavanja programa (ako imas dovoljno memorije)!

Nedostatak: ogroman CPU load, velike pauze kod startanja programa (nema demand paging loadinga, pa se uvijek ucitava i dekomprimira 100% programa bez obzira sto ces koristiti mozda samo 30% koda tog programa), ogromna potrosnja memorije (i vezano uz to: nemogucnost koristenja vise velikih programa odjednom bez kupovine dodatne memorije itd, nemanje memorije za cachiranje I/O podataka i write-back casha na diska, dakle sporiji writeovi i readovi podataka sa diska itd).

Pouka1: there ain't free lunch! Pouka2: stvari *nikada* nisu tako jednostavnima kako izgledaju.

Tako da - probaj staviti tu kvacicu na "compress drive" pa vidi da li ce ti u tvom slucaju biti brze ili sporije. Ili nabavi executable compressor pa probaj s njim. itd. Pa vidi sto je tebi najprihvatljivije.

Opinions above are GNU-copylefted.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required