1 / 27

Multiprocessing 2

Multiprocessing 2. CS/COE 0449 Jarrett Billingsley. Class announcements. wooooooooooooo. Using threads in POSIX. What's in a thread?. we said it has its own stack, PC, registers … there's another kind of data: thread-local storage (TLS)

henryesmith
Download Presentation

Multiprocessing 2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Multiprocessing 2 CS/COE 0449 Jarrett Billingsley

  2. Class announcements • wooooooooooooo CS449

  3. Using threads in POSIX CS449

  4. What's in a thread? • we said it has its own stack, PC, registers… • there's another kind of data: thread-local storage (TLS) • these are "global" variables… but each thread gets its own copyof these variables. • think of it like instance fields in classes! • for instance, errno is a thread-local variable. TLS Thread Stack PC T1 T2 fopen("vozwpmq", "r") fopen("/bin/", "w") Registers errno == EACCES errno == ENOENT CS449

  5. A common callback function idiom • a callback is a function pointer to be "called back" by someone else • remember filter()? that predicate was a callback function • in C, it's very common to have that function take a void* voidmy_callback(void* context) { MyContext* c = (MyContext*)context; printf("wooo %d\n", c->x); } this argument. and it will access this variable. this value, as… this will call… this function, with… MyContextctx = {4, 5, 6}; some_function(&my_callback, &ctx); CS449

  6. p'thread • every process is given one thread by default, the main thread. • this is the thread that your main() function runs in. • if you want to make more threads… Process 4 $ gcc–o progprog.c -lpthread Thread 1 Thread 2 #include <pthread.h> links the pthread library in pthread_create(...); and that's it! CS449

  7. Making a pthread • each thread has its own "main" function (which need not be "main") pthread_create(&tid, NULL, &thread_main, &ctx); if successful, set to the new thread's ID (tid). (this is for extra creation options; you can often leave it NULL.) context passed to the thread's main function. address of the thread's main function. and now, on a brand new thread, this function is called: void* thread_main(void* ctx) { ... return NULL; } CS449

  8. Wait a second • if we run 21_thread_test.c, something weird happens. • sometimes the threads don't all print… sometimes they print twice…sometimes the output is truncated… later losers T1 (main) the main thread (the original one) is special. T2 if it exits (dies), and there are other threads running… T3 for the other threads, reality is undone; there is wailing and gnashing of teeth; cats and dogs live together in harmony; mass hysteria etc. T4 AAAAAAAA basically, don't do that. CS449

  9. like waitpid(), but for threads • pthread_join will block until a thread exits. • so if we uncomment those lines in the example… T1 (main) exit! pthread_join() pthread_create() T2 T3 T4 but the threads still print in an arbitrary order… yup. they do. CS449

  10. Scheduling, revisited CS449

  11. Scheduling points • whenever a process/thread gives up the CPU, we have to decide who gets the CPU next. • there are a few ways for a process/thread to give up the CPU • it could get preempted • it used up its whole quantum and was interrupted • it could yield • it voluntarily gives up control – it's playing nice!! • it could use a blocking syscall • such as reading data from a file • it could exit • either on purpose or by crashing. CS449

  12. The directed graph of life • processes/threads can be in one of many states Running normal exit scheduled fork()! or pthread_create()! preempted (or yielded) Created Ready (sleeping) Dead syscall completes abnormal termination – crashed or killed Blocked blocking syscall CS449

  13. Ready, set, blocked • the scheduler keeps two (or more) sets of processes/threads Ready Blocked P1 P4 P5 P9 P12 P7 yay!! at each scheduling point, the scheduler can see if any of the blocked processes/threads can be moved to the ready set. and then it will schedule a process/thread from the ready set. you don't decide which – run 21_thread_quantum to see! CS449

  14. Self-similarity • you'll notice I keep saying processes/threads… • the same problems and solutions apply to both. • so I might say "task" to mean "either a process or a thread." • the question that arises is: who is doing the scheduling? • processes are always scheduled by the OS. • threads… well… CS449

  15. Threading methodologies CS449

  16. Who weaves the threads? • basically, there are two options. User-mode process User-mode process Kernel Thread Scheduler Thread Scheduler and Kernel Threading. User Threading… Kernel furthermore, kernel threading can be hardware-accelerated. CS449

  17. User Threading • since you're just changing some registers… • who needs the OS?? not us User-mode process Thread Thread Thread a user-mode library lets us create, manage, and switch between threads. Thread Scheduler the kernel doesn't even have to know! looks like a regular old process to me… Kernel but user-mode threads are scheduled collaboratively… (even if the processes are scheduled preemptively!) CS449

  18. The downside • let's say the video player in our browser has some bugs UNresponsive GUI video using 100% of CPU Video Thread GUI Thread ▸ browser.exe is not responding. lemme just use the CPU forever I can't do anything… what do you want ME to do? you're just a process to me. and now your GUI is frozen. Kernel CS449

  19. Kernel Threading • we solved this for processes with preemption! • so let's make threads a kernel thing Process Thread Thread now if one of our threads goes rogue… hey!!! time's up Kernel Thread Scheduler but what might be a problem compared to user threads? speed. now we need context switches to switch threads! CS449

  20. Hardware-accelerated kernel threading • threading is so common and so importantthat we've added support for it into our CPUs, to make it faster and easier to do! Process Thread Thread the kernel talks to the hardware… hey CPU, this process has 2 threads. Kernel Thread Scheduler now switching threads is as easy as switching which registers to use! CPU Register File 2 Register File 1 or, heck, why not run both at the same time. CS449

  21. Which do we use? • user threading requires no kernel or hardware support • so they're best for simple or embedded systems • (and most of the time, the collaborative scheduling thing is fiiiiine) • but because the kernel has no knowledge of these threads, it cannot run 2 threads at the same time. • kernel threading is robust • so they're best for reliable systems • butit's slower than user threading… • hardware-accelerated threads are really fast • so they're best for high-performance systems • butthey require high-end CPUs… CS449

  22. Syscalls in User Threading CS449

  23. Syscalls with user threads • if one thread does a blocking syscall… Process 4 Thread 1 Thread 2 open()!! Thread Scheduler process 4, go to sleep. process 9, you're up! Kernel ummm now thread 2 can't run at all. the whole process is blocked. so we've lost all the benefits of threading. CS449

  24. The problem • the kernel doesn't know about your threads, and your threading library doesn't know about your syscalls Process 4 Thread 1 Thread 2 open()!! Thread Scheduler wha– why would you go over my head like that? Kernel process 4, go to sleep. process 9, you're up! so, we have to somehow let the threading library know that we're making a syscall. CS449

  25. The…solution? • the threading library can replace our syscalls with "shims" Process 4 Thread 1 Thread 2 open()!! Thread Scheduler okay here's your "open()" ;))) hey OS, open() for me! process 4, go to sleep. process 9, you're up! Kernel we can't just call the underlying blocking syscall in the threading library. wait---- shit if only there were some way to simulate a blocking syscall… CS449

  26. Nonblocking system calls • there are other kinds of system calls: nonblockingcalls. • when you call these, they immediately return. • then… how do you find out that something finished? • there are two ways to find out… • you either poll to find out, or are notifiedasynchronously. • for user threading to be worthwhile… • you must have access to nonblocking system calls. • the user threading library uses these to simulate the blocking ones. • the threads don't even know it's happening! CS449

  27. The actual solution (animated) • the user threading library finally has all it needs to manage the "blocked" and "ready" sets. Process 4 Thread 1 Thread 2 BLOCK BLOCK open() open() read() Thread Scheduler hey OS, try to open this file and lemme know when you do. ok! thread 2! your turn hey, that open() finished. Kernel ooh, thread 1, your "open" finished. CS449

More Related