25
1 CSE451 Section 3

1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

  • View
    223

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

1

CSE451 Section 3

Page 2: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

2

Reminders Start project 2!

It’s long Read the assignment carefully Read it again

Project 2 will be done in groups of 3

Today: Form project 2 groups Project 2 intro CVS

Page 3: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

3

Project 2 You have to:

Implement a user thread library Implement synchronization primitives Solve a synchronization problem Add Preemption Implement a multithreaded web server Get some results and write a (small) report

Part a due: in two weeks (Thurs, April 28 12:00pm)

Part b due: 11 days after part a (Monday, May 9 12:00pm)

Part a

Part b

Page 4: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

4

Simplethreads We give you:

Skeleton functions for thread interface Machine-specific code

Support for creating new stacks Support for saving regs/switching stacks

A generic queue When do you need one?

Very simple test programs You should write more

Singlethreaded web server

Page 5: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

5

Simplethreads Code Structure

include/sthread.h

Other apps

Web server (web/sioux.c)

test/*.c

lib/sthread_user.h

lib/sthread_user.c

lib/sthread_ctx.c

lib/sthread_ctx.h

You write this

sthread_switch_i386.h

sthread_switch_powerpc.h

lib/sthread_switch.S

lib/sthread_queue.c

lib/sthread_queue.h lib/

sthread_preempt.c

lib/sthread_preempt.h

Page 6: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

6

Thread Operations void sthread_init()

Initialize the whole system sthread_t sthread_create(func start_func, void

*arg) Create a new thread and make it runnable

void sthread_yield() Give up the CPU

void sthread_exit(void *ret) Exit current thread

What about the TCB?struct _thread {

sthread_ctx_t *saved_ctx; ………

} Others?

Page 7: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

7

Sample multithreaded program

int main(int argc, char **argv) {int i;

sthread_init(); if (sthread_create(thread_start, (void*)i) == NULL) { printf("sthread_create failed\n"); exit(1);}

sthread_yield(); //yield main thread to our new thread printf("back in main\n"); return 0;}

void *thread_start(void *arg) { printf("In thread_start, arg = %d\n", (int)arg); return 0;}

Output? (assume no preemption)

Page 8: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

8

Managing Contexts (given) Thread context = thread stack + stack

pointer sthread_new_ctx(func_to_run)

gives a new thread context that can be switched to

sthread_free_ctx(some_old_ctx) Deletes the supplied context

sthread_switch(oldctx, newctx) Puts current context into oldctx Takes newctx and makes it current

Page 9: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

9

How sthread_switch worksXsthread_switch:

pusha

movl %esp,(%eax)

movl %edx,%esp

popa

ret

Thread 1 TCB … SP

Thread 2 TCB … SP

ESP

CPU

Thread 1 running Thread 2 ready

Want to switch to thread 2…

Thread 2registers

Thread 1 regs

Page 10: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

10

Push old contextXsthread_switch:

pusha

movl %esp,(%eax)

movl %edx,%esp

popa

ret

Thread 1 TCB … SP

Thread 2 TCB … SP

ESP

CPU

Thread 1 running Thread 2 ready

Thread 2registers

Thread 1registers

Thread 1 regs

Page 11: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

11

Save old stack pointerXsthread_switch:

pusha

movl %esp,(%eax)

movl %edx,%esp

popa

ret

Thread 1 TCB … SP

Thread 2 TCB … SP

ESP

CPU

Thread 1 running Thread 2 ready

Thread 2registers

Thread 1registers

Thread 1 regs

Page 12: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

12

Change stack pointersXsthread_switch:

pusha

movl %esp,(%eax)

movl %edx,%esp

popa

ret

Thread 1 TCB … SP

Thread 2 TCB … SP

ESP

CPU

Thread 1 ready Thread 2 running

Thread 2registers

Thread 1registers

Thread 1 regs

Page 13: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

13

Pop off new contextXsthread_switch:

pusha

movl %esp,(%eax)

movl %edx,%esp

popa

ret

Thread 1 TCB … SP

Thread 2 TCB … SP

ESP

CPU

Thread 1 ready Thread 2 running

Thread 1registers

Thread 2 regs

Page 14: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

14

Done; returnXsthread_switch:

pusha

movl %esp,(%eax)

movl %edx,%esp

popa

ret

Thread 1 TCB … SP

Thread 2 TCB … SP

ESP

CPU

Thread 1 ready Thread 2 running

Thread 1registers What got switched?

SP PC (how?) Other registers

Thread 2 regs

Page 15: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

Adjusting the PCThread 1 TCB … SP

Thread 2 TCB … SP

ESP

CPU

Thread 2 running:switch(t2,...);

0x800: printf(“test 2”);

Thread 1registers

ret pops off the new return address!

ra=0x800

PC

Thread 1 (stopped):switch(t1,t2);

0x400: printf(“test 1”);

ra=0x400

Page 16: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

16

Things to think about Who will call sthread_switch? Where does sthread_switch return? How do we delete a thread?

Can a thread free its stack itself? Starting up a thread

When you create a new stack with sthread_new_ctx(), you initialize it to run some function foo

sthread_new_ctx doesn’t pass parameters to foo But in sthread_create, you give a function and an

arg! Bottom line: how do you pass arguments to a

function with no arguments?

Page 17: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

17

Preemption Initially, you will build a non-preemptive

thread library. In part 4, you add preemption

Much more realistic model We give you:

1. Timer interrupts2. Primitives to enable/disable interrupts3. atomic_test_and_set/atomic_clear for

synchronization You must:

Do something on each timer interrupt. (What?) Synchronize all of your code using 2 and 3 above.

More on this later…

Page 18: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

18

Last note You can compare your

implementation against pthreads (which is preemptive kernel-threads). ./configure --with-pthreads

Page 19: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

19

What is CVS Version control system for source files Multiple users can work on the same

file simultaneously

Page 20: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

20

Why use CVS The other way:

Keep every version of code, all with different names: Project2good Project2_10_13_04 Project2working Project2_Feb_2_alex Project2_old

Send emails back and forth with new changes Merge different versions by hand

The CVS way: One version, saved in the CVS repository Multiple people can work on the same file

concurrently CVS merges the edited versions automatically as

you put them back in the repository

Page 21: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

21

Setting up CVS Set up CVS root environment var

Tells CVS where to find your repository setenv CVSROOT /cse451/yourgroup/cvs (bash) export CVSROOT=/cse451/yourgroup/cvs

Initialize a repository (only one person per group) Create a dir in your group’s dir to hold

repository (master copy of code) cd /cse451/yourgroup mkdir cvs

Initialize repository cvs init

You now have an empty repository

Page 22: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

22

Setting up CVS (2) Add/Import the simplethreads

distribution to your repository tar xvfz simplethreads-1.20.tar.gz cd simplethreads-1.20 cvs import –m “initial code” simplethreads SIMPLETHREADS SIMPLETHREADS_1_20

cd .. rm –fr simplethreads-1.20

Page 23: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

23

CVS Commands Check out a project (sandbox, or local copy) to

your home directory to work on: CVS creates a dir simplethreads/ and puts copy of all

source files in repository into that dir Also adds CVS dir where it stores data about what you

check out cd ~ cvs checkout simplethreads cd simplethreads

Merge in new changes from repository (update): cvs update [files…]

Save your edited files into the repository so others can use them:

cvs commit –m “fixed annoying bugs” [files…]

Page 24: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

24

CVS Commands 2 Add a new file (source files .c or .h) to the repository

cvs add [files…] Check status of a file

cvs status file.c Check differences between your file and one in the

repository: cvs diff file.c cvs diff –r 1.1 file.c (specifies version)

View log of changes for a file cvs log file.c

Use emacs for cvs commit log editing (default is vi):

setenv VISUAL emacsMore info:

http://www.cvshome.org cvs --help-commands

Page 25: 1 CSE451 Section 3. 2 Reminders Start project 2! It’s long Read the assignment carefully Read it again Project 2 will be done in groups of 3 Today: Form

25

CVS Remote Access Access CVS from another machine besides

spinlock/coredump?: setenv CVSROOT

coredump.cs.washington.edu:/cse451/yourgroup/cvs

setenv CVS_RSH ssh

(for CVS to know how to access repository – use ssh)(add to ~/.login (csh) or ~/.profile (bash) to avoid typing…)

Warning: be wary of CVS on windows, OS X is ok