Autor Thema: Stack-Probleme beim Multitasking  (Gelesen 6202 mal)

ehenkes

  • Gast
Gespeichert
« am: 23. May 2009, 19:13 »
 :-)

UserMode und Syscalls funktionieren gut. Ich verwende in den Funktionen noch die while-Schleifen und breche über einen Software-Interrupt frühzeitig aus, wenn gewünscht. Die while-Schleifen sind leider noch notwendig, um einen Abbruch zu vermeiden. Vielleicht hat jemand deinen Tipp, wie ich diese komplett los werde. Funktional sind die while-Schleifen aber kein Problem, wenn man ausbrechen kann.

void exit_task() //exit to next task
{
  asm volatile("int $0x21"); // <== welchen INT würdet ihr verwenden?
}

void f2()
{
    while(TRUE)
    {
      settextcolor(getpid(),0);
      putch(getpid()+'@');
      exit_task();
    }
}

void f3() //user mode at ring 3 requires syscall_...
{
    while(TRUE)
    {
      syscall_settextcolor(syscall_getpid(),0);
      syscall_putch(syscall_getpid()+'@');
      syscall_exit_task();
    }
}

int main()
{
    //...

    // create two additional tasks
    task_t* task2 = create_task (f2,0); // kernel mode (ring 0)
    task_t* task3 = create_task (f3,3); // user mode   (ring 3)

    pODA->ts_flag = 1; // enable task_switching

    while(TRUE)
    {
        settextcolor(getpid(),0);
        putch(getpid()+'@');
        exit_task();
    }
    return 0;
}

Zitat
ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB
CABCABCABABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB
CABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCACABCABCABCAB
CABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCA
BCABCACABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCA
BCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABABCABCABCABCABCABCA
BCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABABCABCABCABCABCABCA
BCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABABCABCABCABCABCABCA
BCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABC
ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCBCABCABCABCABCABCABCABC
ABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCABCAB
« Letzte Änderung: 24. May 2009, 02:44 von ehenkes »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 24. May 2009, 12:18 »
Dein syscall_exit_task() scheint eine Art yield() zu sein, d.h. beim nächsten Mal rennt der Task halt wieder weiter und direkt in sein Verderben, weil nach wie vor keine Rücksprungadresse auf dem Stack liegt.

Mach die while-Schleife weg und hinten einen Syscall dazu, der den Task wirklich beendet - ein syscall_destroy_task() oder so. Die Implementierung löscht den Task aus deiner Taskliste (oder was auch immer dein Scheduler benutzt), gibt allozierten Speicher frei und wechselt zum nächsten Task.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 24. May 2009, 12:32 »
void exit_task() //exit to next task
{
  asm volatile("int $0x21"); // <== welchen INT würdet ihr verwenden?
}
0x42 natürlich.
Dieser Text wird unter jedem Beitrag angezeigt.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 24. May 2009, 12:48 »
0x21 ist schon okay, dann weiß der geneigte Leser des Tutorials immerhin schonmal, dass das alles nur die halbe Wahrheit ist. :-D

SCNR
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #4 am: 24. May 2009, 20:41 »
um mal was zum Thema beizutragen: ROFL :-D
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

ehenkes

  • Gast
Gespeichert
« Antwort #5 am: 27. May 2009, 23:00 »
Zitat
Dein syscall_exit_task() scheint eine Art yield() zu sein
Richtig, nach dem Lesen von Tanenbaum Kap. 2 bin ich hier schlauer.
Vom Design her sollten Prozesse nie ..._yield machen, sondern verbissen um jedes % CPU kaempfen. ..._yield passt nur zu Threads. Daher muss ich ein (process_)exit (POSIX) so umbauen, dass der Prozess ausgetragen wird. Zur Zeit habe ich nur eine einfach verkettete Liste, sodass man den Link einfach auf task->next umlenken kann.  :-)

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 27. May 2009, 23:27 »
Also ich persönlich halte es ja für Blödsinn, die CPU krampfhaft auf 100% Auslastung zu halten, wenn nichts zu tun ist. Die Notebookbesitzer werden sich sonst bedanken, wenn der Akku sofort leer ist. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

ehenkes

  • Gast
Gespeichert
« Antwort #7 am: 27. May 2009, 23:37 »
int 21 ist natuerlich nur spass (anlehnung an den beruehmten dos int; 42/2 ist uch gut  :wink: ), ich verwende ansonsten fuer syscalls 7F.   :-D

ehenkes

  • Gast
Gespeichert
« Antwort #8 am: 07. June 2009, 13:21 »
Zitat
Also ich persönlich halte es ja für Blödsinn, die CPU krampfhaft auf 100% Auslastung zu halten, wenn nichts zu tun ist. Die Notebookbesitzer werden sich sonst bedanken, wenn der Akku sofort leer ist.
Auf den ersten Blick klingt das logisch, was Du da schreibst, auf den zweiten Blick fragt man sich, wozu eine CPU eigentlich da ist? Sicher nicht dazu, den Akku zu schonen.  :wink: Ich habe auf Reisen immer einen Ersatzakku parat. Das macht man auch bei Digital-Foto- und Film-Kameras so. Man fotografiert oder filmt nicht weniger, um den Akku zu schonen, sondern sorgt fuer ausreichend Energie.  :-D

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 07. June 2009, 13:52 »
und der strom kommt aus der steckdose ^^
Dieser Text wird unter jedem Beitrag angezeigt.

ehenkes

  • Gast
Gespeichert
« Antwort #10 am: 07. June 2009, 13:57 »
und der strom kommt aus der steckdose ^^
Genau, daher habe ich auch immer ein Multi-Adapter-multi-Spannungs-multi-sonstwas-Netzgeraet dabei.  :-)
Ich stand einmal mit leerem Mobile da und habe an einem Hoteltresen um ein Ladegeraet gebeten, weil ich nur das bloede nationale 220V-Teil (dieser nationale Mist gehoert alles in den Muelleimer) geschnappt hatte.  :roll:

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 07. June 2009, 14:18 »
Zitat
Also ich persönlich halte es ja für Blödsinn, die CPU krampfhaft auf 100% Auslastung zu halten, wenn nichts zu tun ist. Die Notebookbesitzer werden sich sonst bedanken, wenn der Akku sofort leer ist.
Auf den ersten Blick klingt das logisch, was Du da schreibst, auf den zweiten Blick fragt man sich, wozu eine CPU eigentlich da ist? Sicher nicht dazu, den Akku zu schonen.  :wink: Ich habe auf Reisen immer einen Ersatzakku parat. Das macht man auch bei Digital-Foto- und Film-Kameras so. Man fotografiert oder filmt nicht weniger, um den Akku zu schonen, sondern sorgt fuer ausreichend Energie.  :-D
Du willst aber auch den Ersatzakku eher dafür verwenden, um Bilder zu machen, nicht um die Idle-Loop auf 100% CPU-Auslastung zu füttern. ;)

Es ist nunmal so, dass der Rechner den größten Teil der Zeit auf Eingaben wartet und solange nichts zu tun hat. Und das Nichtstun könnte man dann ja energiesparend machen, wenn man es sowieso schon tut...
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 07. June 2009, 14:23 »
Zitat
Also ich persönlich halte es ja für Blödsinn, die CPU krampfhaft auf 100% Auslastung zu halten, wenn nichts zu tun ist. Die Notebookbesitzer werden sich sonst bedanken, wenn der Akku sofort leer ist.
Auf den ersten Blick klingt das logisch, was Du da schreibst, auf den zweiten Blick fragt man sich, wozu eine CPU eigentlich da ist? Sicher nicht dazu, den Akku zu schonen.
Das stimmt. Und ein Auto ist zum Fahren da. Fährst du deshalb damit im Kreis, nur weil du grad nirgend wo hin musst?
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

ehenkes

  • Gast
Gespeichert
« Antwort #13 am: 07. June 2009, 14:26 »
Zitat
Es ist nunmal so, dass der Rechner den größten Teil der Zeit auf Eingaben wartet und solange nichts zu tun hat. Und das Nichtstun könnte man dann ja energiesparend machen, wenn man es sowieso schon tut...

Zitat
ein Auto ist zum Fahren da. Fährst du deshalb damit im Kreis, nur weil du grad nirgend wo hin musst?
Yep! Stimmt. CPUs und Motoren koennten deutlich mehr leisten.  :-)

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 07. June 2009, 16:02 »
Das stimmt. Und ein Auto ist zum Fahren da. Fährst du deshalb damit im Kreis, nur weil du grad nirgend wo hin musst?
Danke, sehr schöne Analogie. :)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

ehenkes

  • Gast
Gespeichert
« Antwort #15 am: 09. June 2009, 00:06 »
Warteschleifen von Flugzeugen passen auch noch gut.  :roll:

 

Einloggen