96 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <title>Homework: Threads and Context Switching</title>
 | |
| <html>
 | |
| <head>
 | |
| </head>
 | |
| <body>
 | |
| 
 | |
| <h1>Homework: Threads and Context Switching</h1>
 | |
| 
 | |
| <p>
 | |
| <b>Read</b>: swtch.S and proc.c (focus on the code that switches
 | |
| between processes, specifically <code>scheduler</code> and <code>sched</code>).
 | |
| 
 | |
| <p>
 | |
| <b>Hand-In Procedure</b>
 | |
| <p>
 | |
| 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.
 | |
| <p>
 | |
| <b>Introduction</b>
 | |
| 
 | |
| <p>
 | |
| In this homework you will investigate how the kernel switches between
 | |
| two processes. 
 | |
| 
 | |
| <p>
 | |
| <b>Assignment</b>:
 | |
| <p>
 | |
| 
 | |
| Suppose a process that is running in the kernel
 | |
| calls <code>sched()</code>, which ends up jumping
 | |
| into <code>scheduler()</code>.
 | |
| 
 | |
| <p>
 | |
| <b>Turn in</b>: 
 | |
| Where is the stack that <code>sched()</code> executes on?
 | |
| 
 | |
| <p>
 | |
| <b>Turn in</b>: 
 | |
| Where is the stack that <code>scheduler()</code> executes on?
 | |
| 
 | |
| <p>
 | |
| <b>Turn in:</b>
 | |
| When <code>sched()</code> calls <code>swtch()</code>,
 | |
| does that call to <code>swtch()</code> ever return? If so, when?
 | |
| 
 | |
| <p>
 | |
| <b>Turn in:</b>
 | |
| Why does <code>swtch()</code> copy %eip from the stack into the
 | |
| context structure, only to copy it from the context
 | |
| structure to the same place on the stack
 | |
| when the process is re-activated?
 | |
| What would go wrong if <code>swtch()</code> just left the
 | |
| %eip on the stack and didn't store it in the context structure?
 | |
| 
 | |
| <p>
 | |
| Surround the call to <code>swtch()</code> in <code>schedule()</code> with calls
 | |
| to <code>cons_putc()</code> like this:
 | |
| <pre>
 | |
|       cons_putc('a');
 | |
|       swtch(&cpus[cpu()].context, &p->context);
 | |
|       cons_putc('b');
 | |
| </pre>
 | |
| <p>
 | |
| Similarly,
 | |
| surround the call to <code>swtch()</code> in <code>sched()</code> with calls
 | |
| to <code>cons_putc()</code> like this:
 | |
| 
 | |
| <pre>
 | |
|   cons_putc('c');
 | |
|   swtch(&cp->context, &cpus[cpu()].context);
 | |
|   cons_putc('d');
 | |
| </pre>
 | |
| <p>
 | |
| Rebuild your kernel and boot it on bochs.
 | |
| With a few exceptions
 | |
| you should see a regular four-character pattern repeated over and over.
 | |
| <p>
 | |
| <b>Turn in</b>: What is the four-character pattern?
 | |
| <p>
 | |
| <b>Turn in</b>: The very first characters are <code>ac</code>. Why does
 | |
| this happen?
 | |
| <p>
 | |
| <b>Turn in</b>: Near the start of the last line you should see
 | |
| <code>bc</code>. How could this happen?
 | |
| 
 | |
| <p>
 | |
| <b>This completes the homework.</b>
 | |
| 
 | |
| </body>
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |