Ovu stranicu je najbolje pregledavati u modernom internet pregledniku s omogućenim JavaScriptom.

[NOS] 1. laboratorijska vježba - 2021/2022

viliml

Daeyarn od osnovne škole


Sulejman

viliml kako si smiješan


Lyras

Kako ste vi mislili rješiti ovaj cjevovod za Lamporta? Ja sam mislio imati neki centralni čvor koji će primiti poruku od filozofa i i onda odašiljati svim ostalim filozofima. Kanio sam napraviti da svaki filozof prvo zatraži desni štapić, osim jednog ljevorukog, koji će zatražiti lijevi štapić, da spriječim deadlock. Postoji li neko elegantnije rješenje?

EDIT: vidim da su oni napisali da nam filozofi uzimaju najprije lijevi, pa desni te onda jedu, što uništava ovaj cijeli moj deadlock solving. Neke ideje?


micho

Lyras Samo napraviš dvije faze, jedna je rezervacija, druga je uzimanje. Rezervirati isti štapić može više filozofa, kad si uspiju rezervirati oba šalju istim protokolom poruku da uzimaju štapiće. Ne trebaš ovo gledati kao rezervaciju u doslovnom smislu, što bi poremetilo zadatak, nego više kao neku misao filozofa. Oni će svejedno uzeti lijevi pa desni štapić, ali će to napraviti tek kad budu mogli uzeti oba, što spada pod ovo što nije “spomenuto” u zadatku.

Da je zadatak formuliran da to rade naslijepo, onda bi trebalo vraćati štapiće nakon nekog timeouta ili tako nešto.

EDIT: S tim da s obzirom na to da je provjera dostupnosti štapića lokalna, možeš imati kružnu topografiju, dakle, 5 in i out cjevovoda, i onda jedan čvor treba komunicirati samo sa svojim lijevim i desnim susjedom. Ako trebaš globalni sat, imat ćeš kružnu komunikaciju, ako ne, imat ćeš 5 satova (za svaki štapić).


viliml

Lyras M̵̧̩͑̀͝î̶͍̉ć̴̝̾́̀o̶̺̟̣͂̽
Ja sam se s time mučio nekoliko dana, ali onda sam shvatio.
U samom zadatku nigdje ne piše niti ‘c’ od cjevovoda.
Nadalje, u zadatku piše “Sve što u zadatku nije zadano, riješiti na proizvoljan način.”
U zadatku nije bilo zadano kako prenositi poruke (kontekst? implikacije? ne znam ja to), pa sam ja iskoristio redove poruka isto kao za prvi zadatak.
Asistent nije niti gledao kod, dobio 10/10 bodova bez problema.


Ardura

Trebamo li riješiti 1.zad s procesima ili dretvama? U opisu zadatka su procesi, u pseudokodu dretve..


Nocna_smjena

Maddy svaki proces ima barem jednu dretvu, svaka dretva mora imat svoj proces. Vise dretvi moze pripadat jednom procesu. Drugim rijecima, tvoj kod uvijek izvrsava dretva i ta dretva mora pripadat nekom procesu. Nemres imat proces bez barem jedne dretve (koja njemu pripada). Svaki proces ima svoju memoriju dok dretve unutar istog procesa dijele njegovu memoriju. Sa procesima se ovdje oce simulirati vise racunala tj komunikaciju izmedu njih


Retard00

Jel kod pozivanja msgrcv uvijek samo jedan proces može uzet poruku?
Ista tako i za msgsnd, ako više procesa odjednom želi poslat neku poruku dal se išta može zbrljat (osim redosljeda poruka koji će tad predpostavljam biti random)?


Nocna_smjena

Retard00 za msgrcv da. Samo ce jedan posjetitelj uzet jednu poruku (pod uvjetom da on trazi takav tip poruke i da velicina poruke/strukture koja je zapisana u jezgri tj kernelu tj message queue-u manja ili jednaka od one velicine koju si definirao kao treci argument u msgrcv (forumula za izracunavanje velicine: sizeof(buf) - sizeof(buf.mtype) + 1). Takoder u message queue-u mozes imat vise poruka sa istim tipom i onda ce vise posjetitelja moc povuc te poruke iz message queue-a (koliko poruka sa trazenim tipom ima toliko posjetitelja ih moze povuc). msgrcv je po defaultu blokirajuci tako da ce ti se posjetitelj blokirati dok ne dobije poruku. Sto se tice msgsnd nemas frke. Sam rokaj (za slanje u queue koristis istu formulu za izracunavanje velicinu koju sam maloprije napisao). Redoslijed ti jedino ima utjecaja ako predas u msgrcv da trazis tip 0 (u tom slucaju se uzima najstarija poruka iz queuea). Ak trazis poruku s nekim tipom vecim od 0 onda se trazi najstarija poruka sa tim trazenim tipom.


viliml

Nocna_smjena (forumula za izracunavanje velicine: sizeof(buf) - sizeof(buf.mtype) + 1)

Zašto +1?
Iz manpagea:

       The msgp argument is a pointer to a caller-defined structure of the following general form:

           struct msgbuf {
               long mtype;       /* message type, must be > 0 */
               char mtext[1];    /* message data */
           };

       The  mtext  field  is  an  array  (or other structure) whose size is specified by msgsz, a nonnegative integer
       value.  Messages of zero length (i.e., no mtext field) are permitted.

msgsz je točno veličina polja mtext, što je točno sizeof(buf) - sizeof(buf.mtype)


micho

viliml Isto bi s redovima poruka imao potencijalni deadlock kad su oni načelno implementirani kao cjevovodi. Problem deadlocka ne proizlazi iz implementacije nego iz formulacije problema.


Lyras

viliml je li vidio da si koristio red poruka, a ne cjevovod?


BillIK

Može li netko napisati dobar pseudokod za ovaj zadatak s putujucom znackom? Nije mi jasno def kako s njom baratati


viliml

Lyras Nije opće gledao izvorni kod.


KiflaKiflic

Prilikom svakog pokretanja zadatka s vrtuljkom mi je drugaciji ispis, ponekad je skroz neispravan. Jel to zato sto je red pun ili? Ne kuzim kako bi ocistio red, probao sam u terminalu s ipcrm i za sigint sam stavio msgctl no ne rijesava problem. 🙄


[obrisani korisnik]

neki tips & tricks za ovaj labos? trebam li proc neko gradivo u knjizi ili su dosta dane pripreme?


KiflaKiflic

Zadatak s vrtuljkom mi se ponekad ne ugasi kada su procesi gotovi, jel itko imao slican problem?


Baksuz

Jel labos treba pisati u virtualki ili možemo i na OS-u domaćina?


Retard00

Baksuz Ja u WSL-u sve radim (samo je bitno da je WSL verzija 2 jer verzija 1 ne podržava system V za redove poruka)


steker

jel ja smijem u vrtuljku kad posjetitelj siđe s vrtuljka poslat poruku vrtuljku da je sišao, radim raspodijeljeni centralizirani protokol


micho

steker yes


« Prethodna stranica Sljedeća stranica »