Cross: Programiranje OS-a

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?

Reply to
vaso
Loading thread data ...

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.
Reply to
Matija Nalis

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.