[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