Homework: Threads and Context Switching

Read: swtch.S and proc.c (focus on the code that switches between processes, specifically scheduler and sched). Also process creation: sys_fork() and copyproc().

Hand-In Procedure

You are to turn in this homework during lecture. Please write up your answers to the exercises below and hand them in to a 6.828 staff member at the beginning of lecture.

Introduction

In this homework you will investigate how the kernel switches between two processes.

Assignment

Suppose a process that is running in the kernel calls sched(), which ends up jumping into scheduler().

Submit: Where is the stack that sched() executes on? Where is the stack that scheduler() executes on? When sched() calls swtch(), does that call to swtch() ever return? If so, when?

Now think back to lecture 2 and the invariants that gcc expects any function, including swtch, to maintain. Compare these invariants with what swtch actually implements, and the state that our kernel maintains in a struct context.

Submit: Could swtch do less work and still be correct? Could we reduce the size of a struct context? Provide concrete examples if yes, or argue for why not.

Surround the call to swtch() in scheduler() with calls to cprintf() like this:
  cprintf("a");
  swtch(&cpu->scheduler, proc->context);
  cprintf("b");
Similarly, surround the call to swtch() in sched() with calls to cprintf() like this:
  cprintf("c");
  swtch(&proc->context, cpu->scheduler);
  cprintf("d");
Rebuild your kernel and boot it on QEMU. With a few exceptions you should see a regular four-character pattern repeated over and over.

Submit: What is the four-character pattern? The very first characters are ac. Why does this happen?