You are on page 1of 6

Cola

Ready

Thread
actual

Llamada del mtodo

NULL
NULL

main
main

CALL KThread.SelfTest2()
CALL Runnable.Runnable() /* Create myrunnable1 */

NULL

main

CALL KThread.SelfTest2()

NULL

main

CALL Runnable.Runnable() /* Create myrunnable1 */

NULL

main

RETURN FROM Runnable.Runnable()

NULL

main

CALL Runnable.Runnable() /* Create myrunnable2 */

NULL

main

RETURN FROM Runnable.Runnable()

NULL

main

CALL KThread.KThread(myrunnable1)

NULL

main

CALL KThread.KThread()

NULL

main

CALL TCB.TCB()

NULL

main

RETURN FROM TCB.TCB()

NULL

main

RETURN FROM KThread.KThread()

NULL

main

RETURN FROM KThread.KThread(myrunnable1)

NULL

main

CALL KThread.setName("child 1")

NULL

main

RETURN FROM KThread.setName("child 1")

NULL

main

CALL KThread.KThread(myrunnable2)

NULL

main

CALL KThread.KThread()

NULL

main

CALL TCB.TCB()

NULL

main

RETURN FROM TCB.TCB()

NULL

main

RETURN FROM KThread.KThread()

NULL

main

RETURN FROM KThread.KThread(myrunnable2)

NULL

main

CALL KThread.setName("child 2")

NULL

main

RETURN FROM KThread.setName("child 2")

Ahora para el fork1, como podemos ver en el cdigo es el primer mtodo


fork que se aplica, esto hace entrar al child1 a la ready list.

Cola
Ready

Thread
actual

Llamada del mtodo

NULL
NULL

main
main

CALL KThread.fork() para t1


CALL Machine.interrupt().disable()

NULL

main

RETURN FROM Machine.interrupt().disable()

NULL

main

NULL

main

CALL TCB.start(new Runnable() for


KThread.runThread())
RETURN FROM TCB.start()

NULL

main

Call KThread.ready() en t1

NULL

main

t1

main

CALL readyQueue.waitForAccess(this) //coloca a t1


en la ready list
RETURN FROM readyQueue.waitForAccess(this)

t1

main

RETURN FROM KThread.ready()

t1

main

CALL Machine.interrupt().restore()

t1

main

RETURN FROM Machine.interrupt().restore()

t1

main

RETURN FROM KThread.fork()

Ahora el fork2, colocando a child2 en la ready list, detrs de child1.

Cola
Ready

Thread
actual

Llamada del mtodo

t1
t1

main
main

CALL KThread.fork() para t2


CALL Machine.interrupt().disable()

t1

main

RETURN FROM Machine.interrupt().disable()

t1

main

t1

main

CALL TCB.start(new Runnable() for


KThread.runThread())
RETURN FROM TCB.start()

t1

main

Call KThread.ready() en t2

t1

main

t1, t2

main

CALL readyQueue.waitForAccess(this) //coloca a t2


en la ready list
RETURN FROM readyQueue.waitForAccess(this)

t1, t2

main

RETURN FROM KThread.ready()

t1, t2

main

CALL Machine.interrupt().restore()

t1, t2

main

RETURN FROM Machine.interrupt().restore()

t1, t2

main

RETURN FROM KThread.fork()

Ahora al main le aplican el mtodo yield (). Esto lo que hace sacar al thread
actualmente corriendo y colocar al siguiente thread en la ready list.

Cola
Ready

Thread
actual

Llamada del mtodo

t1, t2
t1, t2

main
main

CALL KThread.yield()
CALL Machine.interrupt().disable()

t1, t2

main

RETURN FROM Machine.interrupt().disable()

t1, t2

main

CALL currentThread.ready()

t1, t2

main

t1, t2, main

main

CALL readyQueue.waitForAccess(this) /* coloca a


main devuelta a la ready list */
RETURN FROM readyQueue.waitForAccess(this)

t1, t2, main

main

RETURN FROM currentThread.ready()

t1, t2, main

main

CALL KThread.runNextThread()

t1, t2, main

main

t2, main

main

CALL readyQueue.nextThread() //saca a t1 de la


ready list
RETURN FROM readyQueue.nextThread()

t2, main

main

CALL nextThread.run()

t2, main

main

CALL Machine.yield()

t2, main

main

RETURN FROM Machine.yield()

t2, main

main

CALL currentThread.saveState()

t2, main

main

RETURN FROM currentThread.saveState()

t2, main

main

CALL tcb.contextSwitch();

Ahora el thread t1 va a ser el thread que va tomar el control.

Cola
Ready
t2,
t2,
t2,
t2,
t2,
t2,
t2,
t2,

main
main
main
main
main
main
main
main

Thread
actual
t1
t1
t1
t1
t1
t1
t1
t1

Llamada del mtodo


CALL KThread.runThread()
CALL KThread.begin()
CALL KThread.restoreState()
RETURN FROM KThread.restoreState()
CALL Machine.interrupt().enable()
RETURN FROM Machine.interrupt().enable()
RETURN FROM KThread.begin()
CALL myrunnable1.run()

Ahora para dejar el control a t2, el sistema primero aplica otra vez el
mtodo yield () pero esta vez a t1.

Cola
Ready
t2,
t2,
t2,
t2,
t2,

Thread
actual

main
main
main
main
main

t1
t1
t1
t1
t1

t2, main, t1
t2, main, t1
t2, main, t1
main, t1

t1
t1
t1
t1

main,
main,
main,
main,
main,
main,
main,

t1
t1
t1
t1
t1
t1
t1

t1
t1
t1
t1
t1
t1
t1

Llamada del mtodo


CALL KThread.yield() /adentro del runnable de t1/
CALL Machine.interrupt().disable()
RETURN FROM Machine.interrupt().disable()
CALL currentThread.ready()
CALL readyQueue.waitForAccess(this) //colocar t1
devuelta a la ready list
RETURN FROM readyQueue.waitForAccess(this)
RETURN FROM currentThread.ready()
CALL KThread.runNextThread()
CALL readyQueue.nextThread() //sacar a t2 de la
ready list
RETURN FROM readyQueue.nextThread()
CALL nextThread.run()
CALL Machine.yield()
RETURN FROM Machine.yield()
CALL currentThread.saveState()
RETURN FROM currentThread.saveState()
CALL tcb.contextSwitch();

Y ahora t2 toma el control

Cola
Ready
main,
main,
main,
main,
main,
main,
main,
main,

t1
t1
t1
t1
t1
t1
t1
t1

Thread
actual
t2
t2
t2
t2
t2
t2
t2
t2

Llamada del mtodo


CALL KThread.runThread()
CALL KThread.begin()
CALL KThread.restoreState()
RETURN FROM KThread.restoreState()
CALL Machine.interrupt().enable()
RETURN FROM Machine.interrupt().enable()
RETURN FROM KThread.begin()
CALL myrunnable2.run()

You might also like