On Sat, Apr 27, 2019 at 6:25 PM Paul Olaru via so <so@cursuri.cs.pub.ro> wrote: > > Îmi poate oferi cineva o idee prin care pot găsi motivul pentru care primesc > mesajul de eroare „task was not preempted” la unele execuții? Sau ce să > verific în codul meu? Test round robin. Eroarea "task was not preempted" o primești atunci când un task ruleaza mai mult decât cuanta maximă, și scheduler-ul tău nu îl preemptează ca să poată rula un alt thread cu aceeași prioritate. > > > > Când ar trebui să se facă preempția în so_signal, cea cauzată de expirarea > cuantei? Înainte sau după semnalizare? Similar pentru so_fork: înainte sau > după lansarea threadului? [la mine oricum inițializarea structurilor noului > thread se întâmplă sincron cu apelul so_fork]. so_signal() este în sine o instrucțiune, care consumă timp pe procesor. Instrucțiunile sunt considerate atomice, astfel încât cuanta de timp este considerată expirată după ce întreaga instrucțiune s-a executat. Așadar, preempția în so_signal() ar trebui să se facă după semnalizare. La fel și la so_fork, preempția se face după terminarea inițializării, dar înainte de a rula handler-ul. > > > > (bănuiesc că nu ar trebui să-mi încerc norocul pe VMchecker gen „tura asta > merge”, dat fiind că problema apare la sub 10% din rulări). Nu, n-ar trebui să îți încerci norocul. > > > > (în urma discuției din alt thread, mașina virtuală de SO are 1.5GB pe > sistemul meu în loc de cei 512MB pe care îi are by default). Recomandăm să nu modifici mașina virtuală, altfel vei avea diferențe între rularea pe mașina ta virtuală și mașina de pe vmchecker.
Numai bine, Răzvan _______________________________________________ http://ocw.cs.pub.ro/courses/so/info/lista-discutii