Deja, nespėjau…
Operacinę Sistemą parašyt, tai ne du pirštus… kaip sakoma. Bet yra kaip yra. Vakar susinervinau, kad pirminis karkasas, kurį buvau parašęs (atseit uber-cool object-oriented) sumalė Š ir nebesuvokiau kas kur vyksta (visgi po savaitės įsijungiau pažiūrėt, ką ten prikūriau).
Pasižiūrėjau kursiokų darbus (teneužpyksta dėstytojai, bet kitaip jau nebegaliu, nes ne visą teoriją perkandau), užrašus ir pasiskolinau keletą idėjų, per porą valandų, kol smigau, spėjau parašyti šį bei tą, tuo pačiu ir kai ką apmastyti. Kodo gabaliukai, kad ir labai neišbaigti, tačiau, kaip ir žadėjau, yra čia. Kadangi ten praktiškai nieko nėra, bet norisi kažką parašyti tai pažersiu vieną pastebėjimą, kodėl man kursiokų pavyzdžiai nepatiko (visų!).
Na, gal ne visi gaudotės kontuperiuose, bet gal kažkokiu tai fantastiniu būdu bus ir jums įdomu paskaityti.
(Nors abejoju
)
Žodžiu yra taip, kad mūsų rašoma “kompiuterio simuliacija” turi apdoroti kai kurias komandas (pvz.: sudėtis, atimtis, padėti/išimti duomenis iš atminties).
Visuose laboratoriniuose darbuose, kuriuos mačiau pastebėjau tokį dalyką:
if(cmd == "add") { // jei tai sudėtis
add(address); // vykdome sudėties funkciją
} else if (cmd == "sub") { // jei tai atimtis
sub(address);
}
arba tokį:
switch(cmd) {
case 'add':
add(address);
break;
case 'sub':
sub(address);
break;
default:
print "wtf? :)\n";
}
Kolkas tai neatrodo problema, tačiau kas jeigu tų komandų 10, 20, 100? Pavargčiau kartot tą kodą, todėl jau tame pirminiame karkase, kurį “mečiau per bortą” šita problema buvo sprendžiama kiek kitaip:
Programos pradžioje aš sukurdavau objektą, kuris savyje laiko visas įmanomas komandas:
abstract class ActionAbstract {
string command;
abstract public void run(int address);
}
class ActionAdd : ActionAbstract {
public ActionAdd() { command = 'add'; }
public void run(int address) {
/* kažką kažkaip sudedam */
}
}
class ActionSub : ActionAbstract {
public ActionSub() { command = 'sub'; }
public void run(int address) {
/* kažką kažkaip sudedam */
}
}
/* ....... */
ActionManager actionMgr = new ActionManager();
/* Galimos komandos 'add' ir 'sub' */
actionMgr.add(new ActionAdd());
actionMgr.add(new ActionSub());
tuomet iš atminties gauname vieną komandą, kurią turime apdoroti ir darome šitaip:
string command = 'add'; /* tarkime komanda yra 'add' */
actionMgr.execute(command, address);
/* o execute(..) daro taip */
public void execute(string command, int address) {
/* actions tai masyvas objektų, kuriuos sudėjome naudodami actionMgr->add(...) */
foreach(ActionAbstract action in actions) {
if(action.command == command) {
return action.run(address);
}
}
}
šiuo būdu galime nors meleoną komandų turėti ir pridėti vis naujas, ir mums nereikės papildyti krūvos if/else arba switch/case eilučių.
Tai va toks mano pastebėjimas, žinau, kad ne kažkokią fantastiką čia pasakiau, tačiau tuose darbuose, kuriuos žiūrėjau - tokio dalyko nemačiau.
P.S. Svarbu! Galbūt kas nors nori man paaiškinti visiškai paprastai, kaip veikia puslapiavimo lentelės? Aš mechanizmą, kol dėstytojas braižė lentoje - supratau, dabar - nu nors nusišauk - neįraukiu. Tiesiog imt ir nurašyt nesinori (o variantų turiu daug
), norisi suprasti pačiam. Any help? ![]()



09 Bal 08
00:24
[...] UPDATE: atnaujinimas nusipelnė atskiro įrašo. [...]
09 Bal 08
09:19
Pasistengsiu šiek tiek pašviest apie puslapiavimą. Kam jis reikalingas nerašysiu, manau supranti, o jei ne parašysiu vėliau
Veikia taip:
tarkim turi komandą ADD op1, op2; kur operandai - adresai. Tie adresai - “virtualūs”, procas su jais realiai nieko negali dar padaryti, nes reikia realaus atminties blogo adreso. Kiekvienas VM’as (programa) turi savo puslapių lentelę, kurioje saugoma info kur koks puslapis atvaizduotas realioje atmintyje, puslapių lentelės ubersupaprastintas pvz.:
1 -> 5
2 -> 18
3 -> 8
T.y. adresas 1 realiai rodo į 5. Taigi parsindamas komandą turi pagal puslapių lentelę pažiūrėti į kokius realios atminties blokus operandai rodo, sudauginti iš koeficinentų (100, 1000 - kiek pas tave tos atminties yra) ir wualia - gausi realius adresus.
Trumpiau pvz (galioja psl lentelės pvz viršuje).
ADD 1, 2
// apskaičiuojam realius adresus iš psl lentelės, t.y. 1 -> 5, 2 -> 18 ir padauginam iš tarkim 10, jeigu pas tave bloką sudaro 10 žodžių, tai finale gauname procui vykdyti komandą
ADD 50, 180 // čia 50, 180 - realūs adresai
Ar kiek aiškiau?
09 Bal 08
09:33
Hm… šiek tiek, tačiau vistiek klausimai keli iškyla:
kiekviena virtuali mašina turi po puslapių lentelę, tai dar reikia lentelės kur būtų nurodyta kurioje atminties vietoje kurios VM lentelė yra ar ten kažkaip priklausomai nuo vykdomos VM puslapių lentelė kažkur perkeliama patogesniam naudojimui?
Dabar darbe esu, nelabai galiu rašyt, tai vėliau dar klausimų pažersiu…
09 Bal 08
10:10
Taip, kiekvienas VM’as turi savo psl lentelę. Bent jau mūsų projekte tai turim atskirą registrą, kuris saugo puslapių lentelės adresą. O jis gali būti pirmas tuščias blokas arba kaip sugalvosi
09 Bal 08
13:56
na musiskiam tai psl lentele randasi nuliniam puslapyje pagal nutylejima ir visada kai renkamas absoliutus adresas ten ziurima, o kuri lentele kuriai masinai priklauso saugoma nuliniam bloke bei kiekviena vm zino savo identifikacijos numeri .