[so] [Tema4][Linux] Test 10

Alex Negura alexdn13 at gmail.com
Tue May 15 23:18:17 EEST 2018


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 <so at cursuri.cs.pub.ro> 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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so/attachments/20180515/aaf15fb0/attachment.html>


More information about the so mailing list