project 1: threads - stanford university · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n...
TRANSCRIPT
![Page 1: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/1.jpg)
Project 1: ThreadsWinter 2009
Jason BauStanislas Polu
Based on slides from previous CA, Pr Mazières, Pr Rosemblum
![Page 2: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/2.jpg)
Overview
• Threads Basics
• Project goals• Alarm Clock
• Priority Scheduling
• Advanced Scheduler (MLFQS)
• Getting Started
![Page 3: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/3.jpg)
Basics
• OS Structure
![Page 4: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/4.jpg)
• Thread ~ pointer to instruction & state“execution stream in an execution context”
• Key OS Aspects:• Maintain per-thread state
• Pick a thread to run
• Switch between threads
Basics
Process states
• Process can be in one of several states
- new & terminated at beginning & end of life
- running – currently executing (or will execute on kernel return)
- ready – can run, but kernel has chosen different proc. to run
- waiting – needs async event (e.g., disk operation) to proceed
• Which process should kernel run?
- if 0 runnable, run idle loop, if 1 runnable, run it
- if >1 runnable, must make scheduling decision– p.24/45
![Page 5: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/5.jpg)
• Per thread state
Basics
typedef struct tcb { unsigned long md_esp; /* Stack pointer of thread */ char *t_stack; /* Bottom of thread stack */}
• Machine dependent thread switch / initvoid thread_md_switch (tcb *current, tcb *next)
void thread_md_init (tcb *t, void (*fn) (void *), void *arg)
![Page 6: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/6.jpg)
Basics
Background: calling conventions
• sp register always base of stack
- frame pointer (fp) is old sp
• Local vars in stack & registers
- By convention, registers divided into
caller- and callee-saved
• Function arguments go in callee-
saved regs and on stackand tempsLocal vars
registerscallee-saved
old frame ptr
argumentsCall
sp
return addr
fp
37/45
![Page 7: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/7.jpg)
Basicsi386 thread_md_switch
pushl %ebp; movl %esp,%ebp # Save frame pointerpushl %ebx; pushl %esi; pushl %edi # Save callee-saved regs
movl 8(%ebp),%edx # %edx = thread_currentmovl 12(%ebp),%eax # %eax = thread_nextmovl %esp,(%edx) # %edx->md_esp = %espmovl (%eax),%esp # %esp = %eax->md_esp
popl %edi; popl %esi; popl %ebx # Restore callee saved regspopl %ebp # Restore frame pointerret # Resume execution
• This is literally switch code from simple thread lib
- Nothing magic happens here
• You will see very similar code in Pintos switch.S
41/45
![Page 8: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/8.jpg)
Basics• Thread system overview
scheduler
timer
wait list for keyboard...
wait list for hard drive...
cpu...
...
ready list wait lists
while (1){
interrupt threadsave stateget next stateload state, jump to it
}
![Page 9: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/9.jpg)
Basics
• Context Switch
T1
T2
K
timer intr IO
READY READY
WAIT
timer intr
...
![Page 10: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/10.jpg)
Project I
![Page 11: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/11.jpg)
I. Alarm Clock
• Reimplement timer_sleep()• Avoid busy wait (why expensive?)
• Instead take thread off the ready list (to where?)
## devices/timer.c
void timer_sleep (int64_t ticks){
int64_t start = timer_ticks (); ASSERT (intr_get_level () == INTR_ON);
while (timer_elapsed (start) < ticks) thread_yield ();}
![Page 12: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/12.jpg)
IIa. Priority Scheduling
• Priority Scheduling :• Thread L yields as H added to ready list
• Thread H wakes up first when H and L both waiting for a lock, semaphore, or conditional variable.
• Needed before Part III
![Page 13: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/13.jpg)
IIb. Priority Donation
• Priority Inversion Problem:• L holds lock K, running
• H comes in ready list, kicking out L (L still holds K)
• M comes in ready list
• H waits for K, M starts running
• Now M runs, then L, then H
![Page 14: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/14.jpg)
IIb. Priority Donation
• Priority Donation:• Donate H priority to L
• You must handle multiple donation to a same thread
• You must handle nested donations H->M->L
• Required for locks (sema, cond_vars optional)
![Page 15: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/15.jpg)
III. Advanced Scheduler
• BSD Scheduler• Appendix B4.4
• Priority depends on niceness, recent_cpu, load_avg
• Fixed-Point Real Arithmetic needed
![Page 16: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/16.jpg)
Synchronization
• Threads can be interrupted anytime, use locks, semaphore and condition variables
• What happens when interrupts disabled?
• Can an interrupt handler hold a lock?
![Page 17: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/17.jpg)
Grading
• 50% Design Document• Use Template and Example
• 50% Test Suite• run ʻmake checkʼ in build/
• Test scripts are in ʻpintos/src/testsʼ
![Page 18: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/18.jpg)
Getting Started
• Make sure pintos is running– set path = ( /usr/class/cs140/`uname -m`/bin $path )– tar xzf /usr/class/cs140/pintos/pintos.tar.gz– cd pintos/src/threads/– make– cd build/– pintos -v -k -- run alarm-multiple
![Page 19: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/19.jpg)
Getting Started• How to debug ?
vine1:~/pintos/src/threads/build> pintos -v --gdb -- run alarm-multiple
Writing command line to /tmp/nWbB7R3jwN.dsk...squish-pty bochs -q========================================================== Bochs x86 Emulator 2.2.6 Build from CVS snapshot on January 29, 2006==========================================================00000000000i[ ] reading configuration from bochsrc.txt00000000000i[ ] Enabled gdbstub00000000000i[ ] installing nogui module as the Bochs GUI00000000000i[ ] using log file bochsout.txt
Waiting for gdb connection on localhost:1234
Then... from the *SAME* machine use:pintos-gdb kernel.o
target remote localhost:1234
and issue the command:
![Page 20: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/20.jpg)
Getting Started
• Example GDB Session
(gdb) target remote localhost:1234Remote debugging using localhost:1234
(gdb) b thread_initBreakpoint 1 at 0xc0101a65: file ../../threads/thread.c, line 114.
(gdb) cContinuing.
Breakpoint 1, thread_init () at ../../threads/thread.c:114114 {(gdb)
![Page 21: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/21.jpg)
Getting Started
• How to run the test suite?vine1:~/pintos/src/threads> make check
• How to run an individual test?vine1:~/pintos/src/threads> make build/tests/threads/alarm-multiple.result
vine1:~/pintos/src/threads/build> pintos -v -- run alarm-multiple
![Page 22: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/22.jpg)
Useful Tools• SCM
• CVS / SVN / git
• Development tools• cscope, backtrace, pintos-gdb
• Data structures• especially lists ! (pintos/src/lib/kernel/)
• Newsgroup
![Page 23: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/23.jpg)
Advices
• Read the manual
• Read the code
• Read the manual
• Read the code
• Read the manual
• Read the code
• ...
![Page 24: Project 1: Threads - Stanford University · - if 0 ru nnable, ru n idle loop, if 1 ru nnable, ru n it - if > 1 ru nnable, mu st mak e schedu ling decision – p . 24/45](https://reader036.vdocument.in/reader036/viewer/2022062415/60220e38c70bab1513275616/html5/thumbnails/24.jpg)
Advices
• Spend a LOT of time reading manual and code
• Work early on Design Document
• Integrate EARLY