Názory k článku
Architektury mikroprocesorů
garbage collector
celé vláknoJenom mne vrta hlavou, jak je reseny garbage collector u procesoru pro javu. Je to soucast procesoru, nebo je to az soucasti programu nebo se na nejakou praci s pameti u takovychto procesoru kasle a pocita se s tim, ze se o to postara prekladac?
Re: garbage collector
celé vláknoZjednodušeně funguje asi tak, že máme dvě stejně velké oblasti a do jedné z nich ukazuje ukazatel. Při alokaci objektu o velikosti N se k ukazateli přičte N a vrátí se stará hodnota ukazatele --- čili ty objekty se tam skládají jeden za druhým.
Až se dojde na konec oblasti, tak se začne alokovat ve druhé oblasti a současně s tím se prochází dosažitelné objekty a ty se přesouvají z první do druhé oblasti. Až se všechny projdou, tak se první oblast celá uvolní --- ta pak čeká na použití, až se zase zaplácá druhá oblast).
Takže bych tipoval, že to bude tak, že alokace objektu bude v hardware a až ta oblast přeteče, tak to vyvolá nějaký exception. Ale detaily neznám.
Re: garbage collector
celé vláknoRe: garbage collector
celé vláknoRe: garbage collector
celé vláknoRe: garbage collector
celé vláknoRe: garbage collector
celé vláknoPrvní implementace javy (bez tohohle garbage collectoru, co současně i přesouvá a defragmentuje) žraly mnohem víc, prý tam jakýkoli objekt sežral asi 2kB.
Re: garbage collector
celé vláknoRe: garbage collector
celé vláknoJak funguje HW v java procesorech, netusim - ale zdaleka nemusi delat vsecko, alokace je trivialni, GC je slozity, jestli to nejak podporuje, nevim.
Re: garbage collector
celé vláknoRe: garbage collector
celé vláknoRe: garbage collector
celé vláknoRe: garbage collector
celé vláknoRe: garbage collector
celé vláknoRe: garbage collector
celé vláknoO Javě od Sunu se dá dočíst, že používá hybridní generační přístup: všechny objekty vznikají v Eden Space, když se ten zaplní, tak se živé objekty z něj a z jednoho Survivor Space přesunou do druhého Survivor Space (to je skoro to, co popisuješ, ale Survivor Spaces jsou oproti ostatním částem heapu velmi malé), a to se opakuje dokud nedojde místo i tam. Přičemž se počítá s tím, že velká většina objektů zanikne velmi brzy po svém vzniku, takže se nedostanou ani z Edenu. Přeživší objekty se pak přesouvají do Tenured Space, kde se pro čištění používá mark and sweep. V základu je to všechno Stop The World, existují i paralelní implementace. Jak se řeší zvětšování heapu netuším. U IBM to dělají zase nějak jinak (nevím jak).
Tak blbí vážně nejsou :-)
Re: garbage collector
celé vláknoRe: garbage collector
celé vláknoRe: garbage collector
celé vláknoRe: garbage collector
celé vláknoPrekladac se o to postarat v mnoha pripadech nemuze, je to veci runtime.
Hustota kódu u MISC procesorů
celé vlákno"Celková velikost programového kódu je u zásobníkových procesorů obecně menší, než u RISC procesorů. RISC procesory totiž mají velké množství registrů, pro jejichž specifikaci (adresaci) je nutné použít většího množství bitů v kódu instrukce. Dokonce se uvádí vtip, že velikost vyrovnávací paměti (cache) u RISC procesoru musí být větší než kapacita CELÉ operační paměti u zásobníkového procesoru, přičemž na obou procesorech běží programy stejnou rychlostí."Ono je to ještě o něco lepší. :-) Jelikož dnešní zásobníkové procesory zvládnou skok do podprogramu ("slova") za jeden takt a návrat za nula taktů (typicky návratovým bitem), není prakticky zapotřebí inlajnovat kód. Věci, které mají být rychlé, se pak prostě dají do rychlé paměti, a může to být i jeden několikabajtový fragment kódu volaný z mnoha míst, o kterém se zjistilo, že se volá příliš často. V RISCu nebo na x86 by se inlajnoval, ale musel by přitom být opakovaný na mnoha místech. Cache tedy v RISCu nebo x86 klidně může po vykonání kusu kódu flushout jednu sekvenci instrukcí jen proto, aby ji nahradila téměř stejná sekvence instrukcí jinde. :-) Tady to není nutné, ten kousek bude vyfaktorovaný do rychlé paměti. S tímhle zjednodušením odpadá i potřeba CAMky pro řídicí logiku cache, což je taky taková křemíková kráva. Není divu, že se Chuckovy procesory vejdou doslova do pár tisíc tranzistorů. ;-)
jen musim dodat..
celé vláknoJEN TAK DAL! :-)
Re: jen musim dodat..
celé vláknoMe v tom prehledu chybi procesor z Terminatora II http://www.youtube.com/watch?v=QrRyE28BI4Q (vystrizena scena). Rad bych vedet, zda je to RISC nebo MISC 8-)
Re: jen musim dodat..
celé vláknoRe: jen musim dodat..
celé vláknoRe: jen musim dodat..
celé vláknoJe to docela prijemna vlastnost (hlavne pro vyvojare pisiciho v assembleru). Jde v podstate o to, ze kdyz se u ortogonalni ISA naucite par zakladnich instrukci (ADD, SUB, MUL, AND, RR atd.) a adresni rezimy, ktere dana ISA podporuje (napr. konstanta, registr, prima adresa, neprima adresa, adresa+index, adresa+index*konstanta), tak u teto instrukcni sady uz vlastne znate spoustu ruznych kombinaci instrukci, protoze vsechny adresni rezimy lze pouzit pro velkou cast instrukci. Tj. napriklad by melo jit napsat:
ADD neprima adresa, adresa+index*konstanta
U neortogonalnich ISA si musite pamatovat, co muze mit ktera instrukce za operandy, napriklad ze MUL vzdy nasobi registr A s necim jinym (je to jenom priklad, ale trosku vychazi z puvodni ISA x86), nebo ze u instrukce MOV nelze provest presun pamet-pamet (opet Intel).
Detailne je to vysvetlene napriklad na Wiki: http://en.wikipedia.org/wiki/Orthogonal_instruction_set
Re: jen musim dodat..
celé vláknoRe: jen musim dodat..
celé vláknopak je instrukcni sada ortogonalni. Kdyz jsou kresleny od ruky a svisle a vodorovne
cary nesviraji uhel presne 90 stupnu, pak se rika, ze procesor ma instrukcni sadu neortogonalni.
Re: jen musim dodat..
celé vláknoje to jako by muz byl bazovy vektor (0,1) a zena bazovy vektor (1,0), navzajem jsou
ortogonalni. hermafrodit by byl vektor (sqrt(2),sqrt(2)) a to neni bazovy vektor.
Re: jen musim dodat..
celé vláknoMáš za tři. (2,2) zcela klidně může být bázový vektor, pokud k němu přidáš ještě jeden vektor takový, že budou navzájem lineárně nezávislé. Bázové vektory jsou lineárně nezávislá podmnožina vektorového prostoru, která vektorový prostor generuje (tj. každý prvek vektorového prostoru se dá vyjádřit jako lineární kombinace bází). Není tam ani slovo o tom, že všechny báze musejí být ortogonální.
Ani tvrzení "hermafrodit s lulinkem i pipinkou zaroven uz neni ortogonalni k zene ani muzovi, protoze je to jejich linearni kombinace" není správné, protože lineární kombinací vektorů (0,1) a (1, 0) získám třeba i vektor (2, 0) a ten je ortogonální vůči (0, 1). To, že X je lineární kombinací Y a Z prostě ještě neznamená, že Z nemůže být ortogonální k Y nebo k Z - nemůžu tohle tvrzení použít v implikaci.
Proti matematické argumentaci nelze nic namítat, ale nesmí být nepřesná, jinak je lepší mlčet. :-)
Re: jen musim dodat..
celé vláknoRe: jen musim dodat..
celé vláknoRe: jen musim dodat..
celé vláknoPřitom algebra v jeho podání měla velké kouzlo, které jsem ale bohužel objevil až na poslední přednášce prvního semestru. Do té doby byla celá algebra nesouvisejícím pelmelem mnoha různých fragmentů, které ač zajímavé, nedávaly příliš smysl. Poslední přednáška to celé spojila a SKORO jsem začal algebru milovat. Jenže doučit jsem se to nezvládl (to nevyčítám ani tak Pytlíčkovi, jako jisté tradiční rostlině přidávané do "smíchovské polívky") a tak jsem si prožil tři letecké dny (z toho dvakrát na numerickém přehlédnutí v maticích, což tak trošku zamrzí). Mno, aspoň jsem si tehdy do dalšího školního roku prodloužil prázdniny...
Pytlíček byl rozhodně zajímavou killer aplikací...
Re: jen musim dodat..
celé vláknoJava = BASIC
celé vláknotak jsem to s Bisonem a Flexem intuitivne napsal presne takhle. Kdyz jsem se pak pozdejc dovedel, ze podobne funguje Java, doslo mi, ze Java neni vlastne nic jineho nez BASIC, kolem ktereho se dela spousta hype.
Re: Java = BASIC
celé vláknoJasne bytekod v JVM sice Sun prezentoval jako cosi revolucniho, co ovladne nase mikrovlnky atd. ale ze je idea bytekodu stara tak, jako interpretovane jazyky uz nikdo nerekl (P-code, nektere Basicy, muj oblibeny Forth atd.).
S Javou bys to mel trosku slozitejsi, je to LALR(1) gramatika, takze vysledny kod, co z neho vyleze bude IMHO dost obludny.
Re: Java = BASIC
celé vláknoRe: Java = BASIC
celé vláknoRe: Java = BASIC
celé vláknoRe: Java = BASIC
celé vláknoRe: Java = BASIC
celé vláknoDalsi architektury
celé vláknoRe: Dalsi architektury
celé vláknoRe: Dalsi architektury
celé vláknoRe: Dalsi architektury
celé vláknoRe: Dalsi architektury
celé vláknoRe: Dalsi architektury
celé vláknoNení znám algoritmus, který by se podíval na zdroják nebo na assembler a s rozumnou přesností určil, která proměnná se bude nahrávat z L1 cache, která z L2 cache a která z hlavní paměti.
Proto mají ty x86 procesory out-of-order vykonávání, protože tohle kompilátor neudělá.
Kdybys chtěl určovat latence kompilátorem, tak bys musel mít just-in-time kompilátor --- kde se to za běhu naměřit dá.
Mimochodem, z tohoto důvodu existuje pár případů, kdy je java rychlejší než C (v podstatě se v té javě nesmí nic alokovat jenom dělat operace už s naalokovanými poli --- pak to JIT může zkompilovat líp než C kompilátor)
Re: Dalsi architektury
celé vláknoRe: Dalsi architektury
celé vláknoRe: Dalsi architektury
celé vláknoRe: Dalsi architektury
celé vláknoRe: Dalsi architektury
celé vláknoRe: Dalsi architektury
celé vláknoRe: Dalsi architektury
celé vláknoRe: Dalsi architektury
celé vláknoAle možná by bylo zajímavé udělat tohle:
Pustit si timer a občas z zapnout Trace flag a z trap signálu si číst performance countery (a po několika stovkách instrukcí ho zase vypnout, aby ten program taky mohl běžet). Tím získat profil nejen, kde to nejvíc čeká, ale i na čem to nejvíc čeká (cache apod). Kdybych byl ještě na škole, nebylo by špatný to vypsat jako projekt/diplomku :)
Nebo už je nějaký nástroj, který tohle dělá?
arm
celé vláknoRe: arm
celé vláknoTrochu mimo téma, ale souvisí to se seriálem
celé vláknoJak jsou uloženy základní datové typy v paměti počítače a jak s nimi procesor pracuje?
(předpokládám, že prostě na určité adrese se do paměti uloží nějaká data, která se pak přečtou. Jak se ale pozná co tam je za data (byte, int, real)? Nebo jak s tím pc (procesor) pracuje?)
Re: Trochu mimo téma, ale souvisí to se seriálem
celé vláknoV paměti se obvykle (věřím, že vždy, ale bojím se to vyslovit:-) není uložena žádná informace o tom, jakého typu je daná hodnota. Záleží na programu procesoru, jakým způsobem s daným místem v paměti.
Následuje pár odkazů do wikipedie.
Celá čísla:
http://en.wikipedia.org/wiki/Integer_(computer_science)
Reálná čísla (floating point, fixed point)
http://en.wikipedia.org/wiki/Floating_point
http://en.wikipedia.org/wiki/Fixed-point_arithmetic
Důležité je rovněž vědět, zda "vyšší bajt" je v paněti dříve, než "nižší bajt", nebo naopak, viz
http://en.wikipedia.org/wiki/Endianness
Re: Trochu mimo téma, ale souvisí to se seriálem
celé vláknoRe: Trochu mimo téma, ale souvisí to se seriálem
celé vláknoV pameti neni (pri praci na tak nizke urovni, jako je strojovy kod, assembler ci jazyky typu C ci Pascal) zadna informace o tom, co se na konkretni bunce nachazi, takze je mozne napriklad na nejakou adresu ulozit integer (32 bitu) a precist ho jako realne cislo (float, taky 32 bity), nebo jako sekvenci ctyr ASCII znaku.
Tedy informace o typu je ulozena v programu, sam programator si musi ohlidat, co v pameti je a jak se s ni ma pracovat. Samozrejme prakticky vsechny jazyky (od assembleru vyse) mu s timto pomahaji, protoze pouzivaji takove abstraktni veci jako datove typy a objekty, ovsem i tak je mozne (a vlastne i nutne) nekdy tento typovy system obchazet.
Re: Trochu mimo téma, ale souvisí to se seriálem
celé vláknoUž se těším na díl s vysvětlenou touto problematikou. (a jak se vytvářejí ze základní sady instrukcí tyto abstraktní vymoženosti/nejen datové typy/. :-) )

