Salut, 

Nu am fost foarte clar cu intrebarea, asa ca o sa reformulez.

1. Threadul principal din functia de test apeleaza so_fork().
2. In so_fork() se va crea un nou thread ce trebuie sa execute handlerul 
asociat.
3. Acel thread nou creat intra in starea ready si asteapta pana cand este pus 
pe processor
4. Intre timp, threadul principal din functia de test, si-a terminat treaba, 
(aici sunt detalii
de implementare si nu cred ca e ok sa le zic) si acesta va da return din 
functia so_fork() si nu
va astepta celelalte threaduri sa se creeze/termine executia.
5. Va reveni in functia de test si va face un sched_yield() (care la mine nu 
face absolut nimic).
Mentionez ca inainte de a face sched_yeld() un alt thread este pornit deja din 
cadrul temei
 si ar trebui sa ii ia locul pe procesorul fizic, acest lucru impiedicand 
continuarea functiei de test.
6. Apoi imediat dupa functia sched_yield() se apeleaza so_end(). So_end() se 
apeleaza pentru
procesul current, nu doar pentru un thread. So_end() asteapta ca toate 
threadurile sa se termine
dar, aici vine partea importanta, nu s-au terminat toate threadurile de 
creat/rulat. Deci in cazul
meu voi astepta doar o parte/fractie din toate threadurile ce ar fi trebuit 
create si asteptate. Efectiv
so_end() se apeleaza in mijlocul rularii programului, ceea ce imi face ca o 
buna parte din threaduri
sa nu isi faca treaba, ele nefiind asteptate pentru ca nu existau in momentul 
in care so_end() a fost
apelat.

Am reusit sa sincronizez pe bune functia so_end() manual, sa fiu sigur ca se 
apeleaza cand trebuie, si 
ce vreau sa intreb este daca e ok acest lucru.


Sper ca s-a inteles mai bine acum si ca nu am dat multe detalii de implementare.

O seara faina,
Alex

From: Razvan Crainea
Sent: Tuesday, May 15, 2018 10:36 PM
To: Alex Negura; Sisteme de Operare
Subject: Re: [so] [Tema4][Linux] Test 10

Salut, Alex!

Găsești răspunsurile mele inline.
On Tue, May 15, 2018 at 8:58 PM Alex Negura via so <[email protected]> wrote:
 
Salut,
 
Am ajuns cu implementarea temei la testul 10, unde se creeaza mai multe 
threaduri
si am observat ca threadul creat din scriptul de testare iese imediat din
so_fork() si apoi apeleaza fara sa astepte terminarea executieie programului 
functia so_end().
Nu mi-e clar ce vrei să spui mai sus. Cum ar putea apela so_end() *după* 
terminarea execuției programului? 
 
Ar trebui ca eu sa sincronizez functia so_end() sa astepte terminarea
executiei tuturor threadurilor?
Da, exact asta scrie și în enunț[1] că trebuie să facă funcția so_end().
 
Alta solutie nu gasesc si apparent doar mie mi se intampla
acest lucru, desi ar trebui sa se intample tuturor.
De ce zici că ți se întâmplă doar ție? Ăsta este un comportament normal, sunt 
convins că se întâmplă la toate implementările.
 
Acel thread creat in script nu asteapta 
deloc terminarea executiei in totalitate a programului si sunt nedumerit de ce 
se comporta
in acest fel checkerul…..
 
Un thread face parte dintr-un proces (program în execuție) - dacă un proces se 
termină, atunci toate thread-urile acelui proces se termină, indiferent ce fac 
ele. Cred că tu confunzi modul în care rulează thread-urile cu cel al 
proceselor. Îți recomand să mai arunci o privire pe cursul de fire de 
execuție[2] și capitolele aferente din Operating Systems Concepts Essentials și 
Modern Operating Systems.

[1] 
https://ocw.cs.pub.ro/courses/so/teme/tema-4#detalii_implementare_instructiuni
[2] https://ocw.cs.pub.ro/courses/so/cursuri/curs-08

Numai bine,
Răzvan

_______________________________________________
http://ocw.cs.pub.ro/courses/so/info/lista-discutii

Raspunde prin e-mail lui