<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=utf-8"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:248122533;
        mso-list-type:hybrid;
        mso-list-template-ids:-1684343874 -1 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style></head><body lang=EN-US link=blue vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Salut, </p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Nu am fost foarte clar cu intrebarea, asa ca o sa reformulez.<br><br></p><ol style='margin-top:0in' start=1 type=1><li class=MsoListParagraph style='margin-left:0in;mso-list:l0 level1 lfo1'>Threadul principal din functia de test apeleaza so_fork().</li><li class=MsoListParagraph style='margin-left:0in;mso-list:l0 level1 lfo1'>In so_fork() se va crea un nou thread ce trebuie sa execute handlerul asociat.</li><li class=MsoListParagraph style='margin-left:0in;mso-list:l0 level1 lfo1'>Acel thread nou creat intra in starea ready si asteapta pana cand este pus pe processor</li><li class=MsoListParagraph style='margin-left:0in;mso-list:l0 level1 lfo1'>Intre timp, threadul principal din functia de test, si-a terminat treaba, (aici sunt detalii</li></ol><p class=MsoNormal style='margin-left:.25in'>de implementare si nu cred ca e ok sa le zic) si acesta va da return din functia so_fork() si nu</p><p class=MsoNormal style='margin-left:.25in'>va astepta celelalte threaduri sa se creeze/termine executia.</p><ol style='margin-top:0in' start=5 type=1><li class=MsoListParagraph style='margin-left:0in;mso-list:l0 level1 lfo1'>Va reveni in functia de test si va face un sched_yield() (care la mine nu face absolut nimic).</li></ol><p class=MsoNormal style='margin-left:.25in'>Mentionez ca inainte de a face sched_yeld() un alt thread este pornit deja din cadrul temei</p><p class=MsoNormal style='margin-left:.25in'> si ar trebui sa ii ia locul pe procesorul fizic, acest lucru impiedicand continuarea functiei de test.</p><ol style='margin-top:0in' start=6 type=1><li class=MsoListParagraph style='margin-left:0in;mso-list:l0 level1 lfo1'>Apoi imediat dupa functia sched_yield() se apeleaza so_end(). So_end() se apeleaza pentru</li></ol><p class=MsoNormal style='margin-left:.25in'>procesul current, nu doar pentru un thread. So_end() asteapta ca toate threadurile sa se termine</p><p class=MsoNormal style='margin-left:.25in'>dar, aici vine partea importanta, nu s-au terminat toate threadurile de creat/rulat. Deci in cazul</p><p class=MsoNormal style='margin-left:.25in'>meu voi astepta doar o parte/fractie din toate threadurile ce ar fi trebuit create si asteptate. Efectiv</p><p class=MsoNormal style='margin-left:.25in'>so_end() se apeleaza in mijlocul rularii programului, ceea ce imi face ca o buna parte din threaduri</p><p class=MsoNormal style='margin-left:.25in'>sa nu isi faca treaba, ele nefiind asteptate pentru ca nu existau in momentul in care so_end() a fost</p><p class=MsoNormal style='margin-left:.25in'>apelat.</p><p class=MsoNormal style='margin-left:.25in'><o:p> </o:p></p><p class=MsoNormal style='margin-left:.25in'>Am reusit sa sincronizez pe bune functia so_end() manual, sa fiu sigur ca se apeleaza cand trebuie, si </p><p class=MsoNormal style='margin-left:.25in'>ce vreau sa intreb este daca e ok acest lucru.</p><p class=MsoNormal style='margin-left:.25in'><o:p> </o:p></p><p class=MsoNormal style='margin-left:.25in'><o:p> </o:p></p><p class=MsoNormal style='margin-left:.25in'>Sper ca s-a inteles mai bine acum si ca nu am dat multe detalii de implementare.</p><p class=MsoNormal style='margin-left:.25in'><o:p> </o:p></p><p class=MsoNormal style='margin-left:.25in'>O seara faina,</p><p class=MsoNormal style='margin-left:.25in'>Alex</p><p class=MsoNormal><o:p> </o:p></p><div style='mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in'><p class=MsoNormal style='border:none;padding:0in'><b>From: </b><a href="mailto:razvan.crainea@gmail.com">Razvan Crainea</a><br><b>Sent: </b>Tuesday, May 15, 2018 10:36 PM<br><b>To: </b><a href="mailto:alexdn13@gmail.com">Alex Negura</a>; <a href="mailto:so@cursuri.cs.pub.ro">Sisteme de Operare</a><br><b>Subject: </b>Re: [so] [Tema4][Linux] Test 10</p></div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>Salut, Alex!</p><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal style='margin-bottom:12.0pt'>Găsești răspunsurile mele inline.</p><div><div><p class=MsoNormal>On Tue, May 15, 2018 at 8:58 PM Alex Negura via so <<a href="mailto:so@cursuri.cs.pub.ro">so@cursuri.cs.pub.ro</a>> wrote:</p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> </p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Salut,</p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> </p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Am ajuns cu implementarea temei la testul 10, unde se creeaza mai multe threaduri</p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>si am observat ca threadul creat din scriptul de testare iese imediat din</p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>so_fork() si apoi apeleaza fara sa astepte terminarea executieie programului </p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>functia so_end().</p></div></div></blockquote><div><p class=MsoNormal>Nu mi-e clar ce vrei să spui mai sus. Cum ar putea apela so_end() *după* terminarea execuției programului? </p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'> </p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Ar trebui ca eu sa sincronizez functia so_end() sa astepte terminarea</p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>executiei tuturor threadurilor?</p></div></div></blockquote><div><p class=MsoNormal>Da, exact asta scrie și în enunț[1] că trebuie să facă funcția so_end().</p></div><div><p class=MsoNormal> </p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Alta solutie nu gasesc si apparent doar mie mi se intampla</p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>acest lucru, desi ar trebui sa se intample tuturor.</p></div></div></blockquote><div><p class=MsoNormal>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.</p></div><div><p class=MsoNormal> </p></div><blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in'><div><div><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>Acel thread creat in script nu asteapta </p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>deloc terminarea executiei in totalitate a programului si sunt nedumerit de ce se comporta</p><p class=MsoNormal style='mso-margin-top-alt:auto;mso-margin-bottom-alt:auto'>in acest fel checkerul…..</p></div></div></blockquote><div><p class=MsoNormal> </p></div><div><p class=MsoNormal>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.</p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>[1] <a href="https://ocw.cs.pub.ro/courses/so/teme/tema-4#detalii_implementare_instructiuni">https://ocw.cs.pub.ro/courses/so/teme/tema-4#detalii_implementare_instructiuni</a></p></div><div><p class=MsoNormal>[2] <a href="https://ocw.cs.pub.ro/courses/so/cursuri/curs-08">https://ocw.cs.pub.ro/courses/so/cursuri/curs-08</a></p></div><div><p class=MsoNormal><o:p> </o:p></p></div></div></div></div><p class=MsoNormal>Numai bine,<br>Răzvan</p><p class=MsoNormal><o:p> </o:p></p></div></body></html>