Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

mali multitasking os

[es] :: Kernel i OS programiranje :: mali multitasking os

[ Pregleda: 4506 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

ana
Ana Balevic
LIACS & ACE
Amsterdam

Član broj: 5669
Poruke: 170
*.yubc.net

Jabber: ana@elitesecurity.org
Sajt: tesla.rcub.bg.ac.rs/~tauc..


Profil

icon mali multitasking os21.01.2003. u 03:09 - pre 207 meseci
...nesto nalik na malecki multitasking os.....
Imam za domaci iz MIPS-a na etf da napisem u asm. i8086 sledece procedure za rad sa cirkularnim baferima:" QueueInit - inicijalizacija reda. Kao parametri prosleduje se velicina reda, širina (BYTE, WORD, DWORD), tip (FIFO, LIFO) i ostali neophodni parametri. ;takodje IsQueueFull,IsQueueEmpty."Dequeue - funkcija koja dohvata element iz reda. Potrebno je realizovati funkciju kao blokirajucu, odnosno ukoliko je red prazan, ceka se na element. Enqueue - funkcija koja ubacuje elemenat u red. Potrebno je realizovati funkciju kao blokirajucu, odnosno ukoliko je red pun, ceka se da se oslobodi mesto u redu.Koristeci realizovane funkcije i prekide, napisati program koji demonstrira rad realizovanih funkcija. Testirati sve granicne slucajeve.

e sad ovo sa cirkularnim baferom je ok,ali kako da napravim da procedure budu blokirajuce?-na vezbama nam je receno da je to moguce uraditi na 2 nacina: pomocu neke petlje i prekida ili 2. pomocu flegova
Imam sledeci problem ako koristim flegove.
DEQ=ENQ=0
ako pozovem DeQueue a red je prazan ,ja mogu da postavim neku promenljivu DEQ++; i kada naidje prvi sledeci EnQueue on ce proveriti da li je DEQ!=0 i ako jeste nece ubaciti u red,vec ce predati novi element DeQueue-u i uraditi DEQ--

*problem.da bi ikada stigao novi EnQueue ja moram da izadjem iz DeQueue
ali kako da izadjem ako jos uvek nemam taj elem. koju treba da vrat DeQueue kada izalazi?!

Ako neko ima ideju kako to da resim sa flegovima,ili mozda zna kako da napravim
neke softverske prekide ili sta god,pa da vrtim petlju neka javi sto pre


p.s. te procedure EnQueue i DeQueue posle treba da iskoristim u malom embedded sistemu prilikom prenosa podataka velicine 4B preko 8251...
 
Odgovor na temu

rivan
Ivan Radovanović

Član broj: 1901
Poruke: 71
*.beg.sezampro.yu

ICQ: 212235650


Profil

icon Re: mali multitasking os22.01.2003. u 14:24 - pre 207 meseci
Evo jedna prosta ideja kako je to moguce uraditi uz malo manje-vise pseudo koda na asm-u i C-u. Sto
se tice * pitanja nije mi bas jasno - zar nije ideja da imas kao neki multitasking OS- da vise procesa
moze da poziva tvoje procedure - kad se jedan zaglavi kod citanja mora drugi da ga pusti (bez obzira
da li je taj drugi neki drugi proces ili mozda IRQ handler ili nesto slicno). Inace citav problem lici na
problem proizvodaca i potrosaca (bar smo mi to tako zvali) samo malo zakomplikovan posto ima vise
mesta u redu, a to se najlakse resi pomocu semafora

Ove Pxxx i Vxxx funkcije su funkcije za rad sa semaforima, s tim sto ne bi smele da rade samo ovako sa
sem kao sto ja napisah, vec bi to trebalo da bude parametar procedure (nije tesko prepraviti)


proc PBin
mov bx, 0 ; semafor treba da postane 0 ako se prodje

cekanjePBin:
mov ax, 1 ; ako je sem==1 moze da se prodje

cmpxchg sem, bx ; ovo je if(sem==1){sem=0;ZF=1;} else{ax=sem;ZF=0;}
jnz cekanjePBin
ret
PBin endp

proc VBin
inc sem ; samo poveca sem, ko ga prvi zgrabi ide dalje
ret
VBin endp

proc P
pocP:
mov ax, 1 ; prvi slucaj - sem==1
mov bx, 0

cekanjeP:
cmpxchg sem, bx ; if(sem==ax){sem=bx;ZF=1;} else{ax=sem;ZF=0;}
jz krajP

mov bx, ax ; u ax je sad sem
sub bx, 1 ; bx = ax-1
js pocP ; ako je bx < 0 ta varijanta ne moze i nastavljamo da cekamo

jmp cekanjeP ; nastavljamo da cekamo sa spremljenim vrednostima ako niko nije dirao u medjuvremenu

krajP:
ret
P endp


PseudoKod za Queue funkcije
EnQueue() {
P(ImaMesta);
DodajURed;
V(URedu);
}

DeQueue() {
P(URedu);
UzmiIzReda;
V(ImaMesta);
}

U nekoj inicijalizaciji
URedu = 0; /* n-arni semafor (moze da ide od 0 do n) */
ImaMesta = n; /*isto n-arni semafor */

n-arni semafor moze da se implementira preko dva binarna i jos jedne
pomocne promenljive, a mozda moze i ovako kao sto napisah (nisam siguran
da P procedura nema nekih slabih tacaka)

 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-2.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: mali multitasking os22.01.2003. u 15:24 - pre 207 meseci
Ovako, sve ovo se najbolje odrađuje ako ti je neki scheduler na raspolaganju. Ali, onda je on zadužen za blokiranje, semafore, mutex-e i slično, pa i nema mnogo problema.

Ukoliko ti je dozvoljeno da koristiš PIT (tajmer), onda bih ti preporučio da ga i koristiš.

Onako kako ti opisuješ, čini se da pokušavaš da rešiš problem u jednoj niti izvršavanja (tj. jedan task/proces koji se redno/serijski izvršava -- ,,one thread of execution''), a samo pominješ ,,multitasking''.

Međutim, većina ovoga nema smisla kada je to slučaj, pa zato treba pretpostaviti jedno od sledećih:
- imaš dva ili više procesora na kojima se može izvršavati zasebno neki proces (pa onda nemaš problema sa pozivanjem Enqueue dok se čeka u Dequeue u ciklusu sa flagovima, kako si već opisala)
- imaš neki scheduler na raspolaganju koji omogućava multitasking (na jednom procesoru više procesa), i opet možeš koristiti neki od već opisanih metoda

U svakom slučaju, ne zaboravi da koristiš mutex-e, ili napravi da Enqueue i Dequeue budu ,,atomske'' operacije, ali to neće moći ukoliko ne koristiš blokiranje u scheduler-u, već ciklus u kom se samo proverava flag. Znači, najvažnije je napraviti da izbegneš ,,race conditions'' (utrkivanja), ali o tome ste valjda već dovoljno radili na predavanjima.

Lako se pokazuje da je nemoguće sve ovo postići u okviru jedne niti izvršavanja, a za, npr. ovakav program je nemoguće definisati rezultat:
Code:

Q=QueueInit()
A=Q.Dequeue()
B=5+A
Q.Enqueue(B)


Svakako je moguće napraviti ove funkcije koje bi radile ukoliko se vrednost iz Dequeue ne koristi nigde pre sledećeg Enqueue, ali za to je mala verovatnoća, i gubi se smisao. Ukoliko te to zanima mogu objasniti postupak.

Nadam se da je od pomoći, i da sam razrešio glavnu dilemu: problem poziva jedne procedure dok je druga blokirana se ne rešava u njima samima u potpunosti, već se mora koristiti nešto drugo (PIT najčešće pada na pamet) itd.

Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

ana
Ana Balevic
LIACS & ACE
Amsterdam

Član broj: 5669
Poruke: 170
*.yubc.net

Jabber: ana@elitesecurity.org
Sajt: tesla.rcub.bg.ac.rs/~tauc..


Profil

icon Re: mali multitasking os23.01.2003. u 15:55 - pre 207 meseci
...da..nisam precizirala o cemu se radi..
Imam jedan mikroprocesorski sistem.Imam nadzorni racunar.Komunikacija je preko serijskog porta.U glavnom programu malog sistema se na svakih 10 s uradi ENQUEUE(podatak),kada je 8251 spreman da posalje podatak na racunar on posalje interapt. U prekidnoj rutini za 8251 se uradi DEQUEUE(podatak) i podatak posalje racunaru serijski.

...e sad bi mi trebalo jedno jednostavno resenje,kako to da napisem?
(nazalost nismo mi to sa blokiranjem radili na faksu,bar ne da ja znam)
-postoji i jos jedan problem-nije dovoljno samo napisati rutine,treba napisati i program koji se startuje na normalnom racunaru za demonstarciju tih rutina i granicnih slucajeva-kako to da izvedem? -to kaze u tekstu celog zadatka:
http://titan.etf.bg.ac.yu/~gvozden/mips/domaci/januar2003.doc

-jos jedan problem. Ako mi je red pun,a sistem salje nekoliko ENQUEUE za redom ,a racunar ne odgovara,sta da radim sa tim podacima.Jel ih gubim ili ne?

p.s. da li mogu vas dvojicu da kontaktiram preko maila,buduci da zadnjih dana neverovatno tesko dobijam net,a elitesecurity jos 3x teze...
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-2.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: mali multitasking os24.01.2003. u 11:39 - pre 207 meseci
Što se tiče blokiranja, rivan je dao opsežan odgovor, ali nisam siguran da instrukcija ,,cmpxchg'' postoji na i8086.

Dalje, ne znam jesam li sada dobro razumeo.

Na ,,malom'' sistemu se nalazi sav ovaj softver. Dequeue se vrši preko interapta (,,hardverskog''), a enqueue vrši ,,glavni program''.

Pojednostavljena skica svih programa.

Mali sistem:
GlavniProgram:
Enqueue(Broj)
čekaj(10s)
idi na GlavniProgram:

Prekid:
A=Dequeue()
Pošalji(A)

Sada je važno pitanje kako se obezbeđuje da GlavniProgram čeka 10s, odnosno kako stižu Enqueue zahtevi? Ukoliko je to neki ciklus na osnovu kalibrisanih vrednosti, onda je ostalo jednostavno.

prvo rešenje...
Kada je red prazan, a inicira se ,,Prekid'', u Dequeue postaviš odgovarajući flag, i izađeš, a ništa ne šalješ. Zatim, u Enqueue, ukoliko je postavljen ovaj flag, njega isključiš, ubaciš vrednost u red, i zatim iniciraš prekid ,,Prekid''.

Ukoliko je pri Enqueue red pun, onda vršiš ,,blokiranje'' jednim ciklusom koji proverava novi flag.

Problem sa ovim pristupom je što je nemoguće ovo što ti pominješ: da se uradi nekoliko ,,Enqueue'' kada je red pun. Međutim, ukoliko nemaš nikakvu drugu memoriju na raspolaganju (a ako imaš, trebalo bi povećati red), onda se ovo pitanje rešava dizajn odlukom: pokušavaš da pošalješ prvi podatak iz reda (nadajući se da računar na suprotnoj strani isto može da čeka dok ne stigne zahtev za tim podatkom) i dodaješ novi podatak, ili prosto zanemaruješ novi podatak.

Sigurno je jasno da je teorijski nemoguće rešiti problem manjka memorije bez memorije :)

i drugo...
Ukoliko se razmak između punjenja Enqueue odvija pomoću tajmera (PIT 8253) ili nekog drugog prekida (u svakom slučaju radi se o prekidu), onda je zgodno koristiti taj prekid za semafore, i ,,scheduler'' (jednostavni naravno).

Tada bi se GlavniProgram pozivao, i ukoliko je jedan ili više GlavniProgram-a već aktivno, onda ga samo ubaciš u red za izvršavanje (ovo nije isti red, već ,,lista procesa'') i zapamtiš odgovarajući parametar (npr. neka kroz AX registar prosleđuješ parametar Enqueue, onda njega pamtiš uz svaki element liste), i kad ima mesta u redu, onda pozoveš iz prekida (tajmer ili šta već) GlavniProgram sa prvim parametrom. Ovo je običan FIFO ili FCFS (First Come-First Served) algoritam.

Prednost ovakvog rešenja je što bi sve radilo kako si zamislila (do memorijske granice), ali mana je što bi morala da razviješ i memory allocation algoritam (first-fit kao najjednostavniji pada na pamet), i sam FIFO/FCFS scheduler.

Isto to, ako ne i bolje rešenje se može obezbediti dinamičkim povećavanjem reda, i njegovim smanjivanjem na ,,uobičajenu'' veličinu: kada je red pun, onda ga proširi za jedno mesto pri Enqueue, a pri Dequeue, ukoliko je duži od inicijalne vrednosti, onda izbaci jednu vrednost, i smanji red za jedno mesto (pa će i dalje biti pun). Ovo je znatno jednostavnije, a obezbeđuje svu funkcionalnost (opet do memorijske granice).

Ukoliko ti nije dozvoljeno da pristupaš većoj količini memorije (npr. nije tvoj softver jedini na sistemu, a nemaš na raspolaganju neki servis za dodelu memorije), onda ti ne preostaje ništa drugo do da zanemariš/odbaciš novopristigle vrednosti za koje nema mesta u redu (jedna vrednost može blokiranjem, ali ne i više od jedne), ili odgovornost prebaciš na primaoca time što ćeš poslati vrednost preko serijske veze i kada nije tražena.

Obični uređaji uglavnom koriste odbacivanje vrednosti (npr. tastatura, setimo se ,,bipa'' koji označava ,,bafer mi je pun''), ali to zavisi od toga šta ti je potrebno. Za realtime sistem, mislim da je povoljnije odbaciti prve vrednosti (pošto će one ionako biti sa velikim kašnjenjem), ali sve već zavisi od konkretne aplikacije.

PS. Elitesecurity radi slabo kada je najveća gužva, a to je upravo vreme u koje si slala poruku. Svakako, možeš se javiti i na email, ali ja mogu dati odgovora na vrlo malo konkretnih pitanja, pošto i8086 ne poznajem dovoljno. Ipak, bolje je zadržati diskusiju na forumu, pošto onda postoji mogućnost da se neko ko više zna od mene uključi u nju.
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-2.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: mali multitasking os24.01.2003. u 12:04 - pre 207 meseci
Ukoliko nemaš problema sa engleskim jezikom, pogledaj, npr. poglavlje 4 na http://www.doc.ic.ac.uk/~jamm/teaching/osconcepts.html o blokiranju i sinhronizaciji, ili ako hoćeš direktan link: http://www.doc.ic.ac.uk/~jamm/teaching/osconcepts/OS4.pdf (550kB)
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

rivan
Ivan Radovanović

Član broj: 1901
Poruke: 71
*.beg.sezampro.yu

ICQ: 212235650


Profil

icon Re: mali multitasking os24.01.2003. u 22:23 - pre 207 meseci
cmpxchg je 486+ instrukcija namenjena implementiranju semafora (TAS), dakle postoji
 
Odgovor na temu

ana
Ana Balevic
LIACS & ACE
Amsterdam

Član broj: 5669
Poruke: 170
*.yubc.net

Jabber: ana@elitesecurity.org
Sajt: tesla.rcub.bg.ac.rs/~tauc..


Profil

icon Re: mali multitasking os24.01.2003. u 22:54 - pre 207 meseci
..opet kasnim ...vasa zadnja 3odgovora cu tek sad da citam.ali da u medjuvremenu
bacim ovo sto sam planirala:

Bas mi je pomogla ova izjava da je to problem producers/consumers-
pretrazila sam teoriju OS-ova,pa sam nasla na nekakvo resenje tog problema
(Ivane,ono tvoje ces morati malo da mi pojasnis,citala sam ga par puta al nikako da ukapiram
ps. nemam cmpxchg instrukciju (mikroprocesorski sistem sa 8086:) ali akor astumacim,valjda je nije problem implementirati... :)
da li je nacelno ovo okej:
Code:

WAIT(S)
 S<-S-1
 if (S<0) blokiraj proces na semaforu S
             else proces moze da ide dalje
SIGNAL(S)
 S<-S+1
  if (S<=0) odblokiraj 1 proces koji ceka na semaforu S
                 else nastavi tekuci proces jer niko nije blokiran na S

ENQUEUE(podatak) {
 WAIT(praznih)
  WAIT(mutex)
  UbaciURed(podatak)
  SIGNAL(mutex)
  SIGNAL(popunjenih) 
}
DEQUEUE(podatak) {
 WAIT(popunjenih)
  WAIT(mutex)
  UzmiIzReda(podatak)
  SIGNAL(mutex)
  SIGNAL(praznih) 
}

neka (FIFO) red ima 3 mesta za podatke,n=3,i neka imam 3 semafora mutex,popunjenih i praznih
gde su inicijalno: mutex=1
popunjenih=0 ;br popunjenih mesta u redu
praznih=3 ; br.praznih mesta u redu
Code:

   dogadjaj                  praznih              popunjenih         izgled reda
 0. init.stanje              3                      0                       | | | |
 1. ENQ(B)                   2                      1                       |B| | |
 2. ENQ(C)                   1                      2                       |B|C| |
 3. ENQ(D)                   0                      3                       |B|C|D|
 4. ENQ(E)                  -1  blokira E                                   |B|C|D|
 5. ENQ(F)                  -2   blokira F                                  |B|C|D|
 6. DEQ() ->B               -1  signal???           2                       |C|D|I|
      /da li ovaj signal nekoga odblokira? po meni ne jer je praznih<0)
 7. DEQ()->C              0                      1                          |D| | |

***moje pitanje:
8. posto je sada praznih=0 ,sticu se uslovi i za E i za F da
se odblokiraju?!?! Da li je ovde taktika,ko pre mutexu,njemu mesto u redu?
cime se gubi redosled pristizanja podataka?
Takodje,deluje mi da ovde ima jos jedan problem.Ako stigne npr. 30 Enqueue-a
a red je pun.Oni ce se odblokirati tek kada stigne 30-ti Dequeue?
da li mzoe da se napravi da ide 1 po 1?
pitanje2*u mom sistemu ENQUEUE se generise uz pomoc timera na svakih 10s,
a DEQUEUE se poziva iz interapt rutine za serijski prenos...
*** ako sve to tako treba da radi,da napisem procedure za mali sistem(sa procesorom 8086:)..pitanje3:Kako da napravim glavni program koji ih testira na
na obicnom racunaru,a ne na malom sistemu? Tj . kako da simuliram tajmer i prekide softverski?
Ana :)


koristi [ code ] i za ASCII tabele pošto tako sačuvaju razmake

[Ovu poruku je menjao tOwk dana 25.01.2003. u 04:44 GMT]
 
Odgovor na temu

rivan
Ivan Radovanović

Član broj: 1901
Poruke: 71
*.beg.sezampro.yu

ICQ: 212235650


Profil

icon Re: mali multitasking os24.01.2003. u 23:19 - pre 207 meseci
Ja sam shvatio da se radi o x86 a ne bas o 8086 glupavom, da je bar 386 moglo bi bts ili btr umesto cmpxchg, a ovako mislim da je jedini nacin da se primeni neki algoritam za sinhronizaciju tipa Piterson ili Deker; mozda bi nesto moglo i da se izvede sa iskljucivanjem interapta, mada meni trenutno ne pada na pamet kako bi se to na najbolji nacin izvelo, mozda moze ovako

proc P
cli
cmp sem, 0
je vrtiP
dec sem
sti ; <<< ukljucivanje interapta - zaboravljeno ;)
ret ; jedini izlaz je uspesan inace se vrti
vrtiP:
sti ; moglo bi iza ovog nesto bez veze kao nop npr. da kao duze budu ukljuceni int. ;)
jmp P
P endp

i onda bi i V islo slicno sa ogradjivanje sa cli i sti operacija sa semaforom
A najbolje da ti kupis faxu neki 486 i da onda koristis cmpxchg :)

A sto se tice ovog dole (sad ozbiljno) postoji neki algoritam za resavanje ovog problema (da onaj koji je prvi stigao u red prvi i dobije priliku da pise) i zove se Lamportov ("pekarski") algoritam, ideja je da dodelis redne brojeve procesima koji su zainteresovani za resurs, i da onda proces sa vecim brojem moze da dobije resurs samo ako proces sa manjim brojem ne zahteva isti

Odgovor na 6 je (ako sam dobro skapirao) da signal odblokira jednog blokiranog (ako koristis Lamporta onda prvog koji je stigao), ali greska ti je kod 5 i 4 jer wait ne smanjuje semafor na brojeve manje od nule, vec se samo zaglavi kad naidje na nulu, a prodje dalje tek kad neko drugi uradi signal

[Ovu poruku je menjao rivan dana 25.01.2003. u 17:52 GMT]
 
Odgovor na temu

tOwk
Danilo Šegan
Zemun/Beograd

Član broj: 94
Poruke: 2743
*.beograd-3.tehnicom.net

ICQ: 9344053
Sajt: alas.matf.bg.ac.yu/~mm011..


+2 Profil

icon Re: mali multitasking os25.01.2003. u 03:21 - pre 207 meseci
Mislim da je upravo najinteresantnije pitanje kako ti obavljaš ,,blokiraj proces na semaforu S'' u WAIT proceduri.

Ovo implicira da imaš implementirane semafore, i scheduler, ali onda ti je potreban FIFO (ili FCFS) scheduler kao što sam već pomenuo gore koji neće da izmeša procese. Ako već koristiš scheduler, onda je na njemu da brine o redosledu izvršavanja i semaforima.

Prost ,,busy wait'' (ciklus) ne može tu da radi iz više razloga za više od jednog blokiranja.

Citat:
Takodje,deluje mi da ovde ima jos jedan problem.Ako stigne npr. 30 Enqueue-a
a red je pun.Oni ce se odblokirati tek kada stigne 30-ti Dequeue?
da li mzoe da se napravi da ide 1 po 1?


Ima malo više problema. Kako sam opisao u prethodnoj poruci, nemoguće je napraviti sistem koji će moći da beleži proizvoljno mnogo Enqueue-a bez Dequeue-a: to bi značilo da može imati proizvoljno mnogo memorije.

Uostalom, zbog toga se i koristi red, da nema tog problema podatak bi se direktno slao na serijski port, i nemaš brige.

Ono što izgleda kao rešenje je da se dodaju novi procesi u listu procesa (zapravo u FIFO red procesa), koji može rasti dok god ima memorije. Svakako da će ova lista zauzeti više memorije, i zato mislim da je bolje da se proširi sam red za primanje podataka dinamički, dok god ima memorije. Ali, ako to nije dozvoljeno zbog prirode zadatka, a nema schedulera, onda se blokiranje može izvršiti za najviše jedan član.

Citat:

pitanje2*u mom sistemu ENQUEUE se generise uz pomoc timera na svakih 10s,
a DEQUEUE se poziva iz interapt rutine za serijski prenos...
*** ako sve to tako treba da radi,da napisem procedure za mali sistem(sa procesorom 8086:)..pitanje3:Kako da napravim glavni program koji ih testira na
na obicnom racunaru,a ne na malom sistemu? Tj . kako da simuliram tajmer i prekide softverski?


,,Generisanje uz pomoć tajmera na svakih 10s'' zapravo generiše jedan prekid. Pretpostavljam da je se koristi 8253 ili 8254. Prema tome, na ,,običnom'' računaru ti je tajmer takođe na raspolaganju, čak najverovatnije i isti taj, ali ja ne bih koristio tajmer za test program.

Mislim da je bolje da koristiš tastaturu, i npr. tastere 'D' i 'E' za Dequeue i Enqueue, respektivno. Ovo bi ti dozvolilo veću kontrolu, i bolje testiranje. A softverski prekid generišeš sa ,,INT X'' instrukcijom, gde ti je X broj prekida (0--256 na, verujem, svim Intelovim procesorima, ali možda i samo 0--16 na 8086). Ako ti je prekid tajmera ,,0'' (nula), onda ga generišeš sa ,,INT 0'', itd.

Uostalom, nabavi i http://bochs.sf.net pa možeš da sve programiranje obavljaš na jednom računaru, i da istovremeno i testiraš.


Ako ovi kratki slajdovi koje sam pomenuo u prethodnoj poruci nisu dovoljni za razjašnjavanje ,,producers and consumers'' problema, možeš pogledati i ,,Operating Systems Vade Mecum'' od Raphaela Finkela: kompletna knjiga o razvoju operativnih sistema (ftp://ftp.cs.uky.edu/cs/manuscripts/vade.mecum.2.pdf)

Za dosta resursa o razvoju OS-a, pogledaj http://www.0xfi.com/oslib/topx.html

rivan: Mislim da se opisani ,,Lamportov'' algoritam za raspodelu resursa odnosi na ne-vremenske resurse, odnosno ne na CPU vreme. Ukoliko je to ,,hijerarhijska raspodela resursa'' kako je označava Rafael Finkl, onda taj algoritam nije rešenje, pošto se ovde ne radi o pristupu nekom resursu spoljne prirode, već samom izvršavanju koda, i ovo se rešava jednim jednostavnim FIFO schedulerom (jeste, i on je neka vrsta algoritma tog tipa, ali nije ta složenost potrebna).

Nadam se da je i nešto od ovoga od pomoći.

Pozdrav

Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
 
Odgovor na temu

rivan
Ivan Radovanović

Član broj: 1901
Poruke: 71
*.beg.sezampro.yu

ICQ: 212235650


Profil

icon Re: mali multitasking os25.01.2003. u 10:16 - pre 207 meseci
Pa nisam ni mislio da koristi Lamporta za raspodelu vremena vec za raspodelu semafora - imas vise procesa koji cekaju na jednom semaforu, ostali algoritmi ne garantuju da ce ga dobije onaj koji je prvi zatrazio; a i ne vidim da je nesto narocito slozeno implementirati taj algoritam...

p.s.
sta mislite o onoj implementaciji semafora koju sam napisao sa iskljucivanjem interapta, i da li neko uopste ima ideju kako bi se to moglo bolje uraditi na 8086 (valjda je tek 386 prvi uopste zamisljen za multitasking)
 
Odgovor na temu

ana
Ana Balevic
LIACS & ACE
Amsterdam

Član broj: 5669
Poruke: 170
*.yubc.net

Jabber: ana@elitesecurity.org
Sajt: tesla.rcub.bg.ac.rs/~tauc..


Profil

icon Re: mali multitasking os26.01.2003. u 16:08 - pre 207 meseci
hvala vam obojici - pomogli ste mi puno!
ja sam uzela da s<0 jer je teko radjeno kod nas na predavanjim iz OSova,ali sam sinoc iscitala one slajdove i videla da ona njihova varijnta sa blokiranjem na 0 funkcionise korektno-tj. cim se jedno mesto oslobodi,pisti sledeceg u red.pitala sam asistenta i izgleda da se ne treba baviti pitanjima ko je stigao prvi,tj. ulancavanjem u listu.
sad sam ja napisala neke procedure,ali se mucim da ih istestiram,posto nisam bas dugo radila nista u asm... :( za pocetak imam glupi progroblem sa deljenjem,ne znam da li ja tu nesto ne kapiram kako treba.uglavnom dobijam ponekad pogresan rezultat.tj. u dx mi stalno na kraju upise 0.bez obzira na pocetnu vrednost di.
a u ax kako kad,nekad kako treba,nekad nesto 10-to...
treba mi di=(di+1) mod n.
n je definisano sa npr : n DB 04h
iz nekog razloga se deljenje ne obavlja uvek kako treba,tj. u ax i dx dobijem vrednosti koje nemaju veze ni sa cim.kako to da resim?
inc di
mov ax,di
cwd
div n
mov di,dx

p.s. takodje bih vam poslala ovaj moj fajl s aprocedurama cisto da bacite pogled,jel to moze preko foruma?

 
Odgovor na temu

rivan
Ivan Radovanović

Član broj: 1901
Poruke: 71
*.beg.sezampro.yu

ICQ: 212235650


Profil

icon Re: mali multitasking os26.01.2003. u 19:00 - pre 207 meseci
moze ovako

inc di
mov ax, di
mov bh, n
div bh
shr ax, 8 ; da bude al=ah, ah=0
mov di, ax

ako je n bajt

ja nisam bas svez sa asemblerom ali bi mozda mogao da bude problem to sto radis cwd (produzenje worda u dword sa znakom) i onda radis neoznaceno deljenje (ako je u di setovan najvisi bit onda verovatno nece da se dobije ono sto ti treba).

Inace moze nekako da se zakaci i fajl sa porukom
 
Odgovor na temu

ana
Ana Balevic
LIACS & ACE
Amsterdam

Član broj: 5669
Poruke: 170
*.yubc.net

Jabber: ana@elitesecurity.org
Sajt: tesla.rcub.bg.ac.rs/~tauc..


Profil

icon Re: mali multitasking os28.01.2003. u 02:24 - pre 207 meseci
jel moze jos malo pomoci- imam sve procedure korektno napisane (nadam se)
i prazan glavni program.nije mi bas jasno kako si zamislio da skrenem D i Q sa tastature da oni generisu prekid.ako moze navedi kako bi izgledalo ubacivanje i izbacivanje elenta u glavnom programu i da li interapt softverski i ovde pravim tako shto u DATA SEGMENT kazem
npr
DEMOINT EQU 64h*4h
posle u programu kazem INT64h
a u interpat rutini
DEMOINT PROC FAR
call ENQUEUE
ret
pop ax
DEMOINT IRET
a u CODE SEGMENTU
MOv ax,podatak1
int 64h
mov ax podatak2
int 64h
kako da obezbedim onaj za dequeue/

???? Hvala*100 za sto brzi odgovor,maltene mi isteklo vreme...
Ana
 
Odgovor na temu

[es] :: Kernel i OS programiranje :: mali multitasking os

[ Pregleda: 4506 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.