1&6(&6(3ULQFLSOHVRI2SHUDWLQJ3ULQFLSOHVRI2SHUDWLQJ6\VWHPV6\VWHPV)DOO)DOOLecture 4: ThreadsLecture 4: ThreadsGeoffrey M. VoelkerGeoffrey M. VoelkerOctober 1, 2001 CSE 120 – Lecture 4 – Threads 23URFHVVHV3URFHVVHV● Recall that a process includes many things◆ An address space (defining all the code and data pages)◆ OS resources (e.g., open files) and accounting information◆ Execution state (PC, SP, regs, etc.)● Creating a new process is costly because of all of the data structures that must be allocated and initialized◆ FreeBSD: 81 fields, 408 bytes◆ …which does not even include page tables, etc.● Communicating between processes is costly because most communication goes through the OS◆ Overhead of system calls and copying data2October 1, 2001 CSE 120 – Lecture 4 – Threads 33DUDOOHO3URJUDPV3DUDOOHO3URJUDPV● Also recall our Web server example that forks off copies of itself to handle multiple simultaneous requests◆ Or any parallel program that executes on a multiprocessor ● To execute these programs we need to◆ Create several processes that execute in parallel◆ Cause each to map to the same address space to share data» They are all part of the same computation◆ Have the OS schedule these processes in parallel (logically or physically)● This situation is very inefficient◆ Space: PCB, page tables, etc.◆ Time: create data structures, fork and copy addr space, etc.October 1, 2001 CSE 120 – Lecture 4 – Threads 45HWKLQNLQJ3URFHVVHV5HWKLQNLQJ3URFHVVHV● What is similar in these cooperating processes?◆ They all share the same code and data (address space)◆ They all share the same privileges◆ They all share the same resources (files, sockets, etc.)● What don’t they share?◆ Each has its own execution state: PC, SP, and registers● Key idea: Why don’t we separate the concept of a process from its execution state?◆ Process: address space, privileges, resources, etc.◆ Execution state: PC, SP, registers● Exec state also called thread of control, or thread3October 1, 2001 CSE 120 – Lecture 4 – Threads 57KUHDGV7KUHDGV● Modern OSes (Mach, Chorus, NT, modern Unix) separate the concepts of processes and threads◆ The thread defines a sequential execution stream within a process (PC, SP, registers)◆ The process defines the address space and general process attributes (everything but threads of execution)● A thread is bound to a single process◆ Processes, however, can have multiple threads● Threads become the unit of scheduling◆ Processes are now the containers in which threads execute◆ Processes become static, threads are the dynamic entitiesOctober 1, 2001 CSE 120 – Lecture 4 – Threads 67KUHDGVLQD3URFHVV7KUHDGVLQD3URFHVVStack (T1)CodeStatic DataHeapStack (T2)Stack (T3)Thread 1Thread 3Thread 2PC (T1)PC (T3)PC (T2)4October 1, 2001 CSE 120 – Lecture 4 – Threads 77KUHDG'HVLJQ6SDFH7KUHDG'HVLJQ6SDFHOne Thread/ProcessMany Address Spaces(Unix)One Thread/ProcessOne Address Space(MSDOS)Many Threads/ProcessMany Address Spaces(Mach, OSF, NT, Chorus)Many Threads/ProcessOne Address Space(Pilot, Java)Address SpaceThreadOctober 1, 2001 CSE 120 – Lecture 4 – Threads 83URFHVV7KUHDG6HSDUDWLRQ3URFHVV7KUHDG6HSDUDWLRQ● Separating threads and processes makes it easier to support multithreaded applications◆ Creating concurrency does not require creating new processes● Concurrency (multithreading) can be very useful◆ Improving program structure◆ Handling concurrent events (e.g., Web requests)◆ Writing parallel programs● So multithreading is even useful on a uniprocessor5October 1, 2001 CSE 120 – Lecture 4 – Threads 97KUHDGV&RQFXUUHQW6HUYHUV7KUHDGV&RQFXUUHQW6HUYHUV● Using fork() to create new processes to handle requests in parallel is overkill for such a simple task● Recall our forking Web server:while (1) {int sock = accept();if ((child_pid = fork()) == 0) {Handle client request} else {Close socket}}October 1, 2001 CSE 120 – Lecture 4 – Threads 107KUHDGV&RQFXUUHQW6HUYHUV7KUHDGV&RQFXUUHQW6HUYHUV● Instead, we can create a new thread for each requestweb_server() {while (1) {int sock = accept();thread_fork(handle_request, sock);}}handle_request(int sock) {Process requestclose(sock);}6October 1, 2001 CSE 120 – Lecture 4 – Threads 11.HUQHO.HUQHO/HYHO7KUHDGV/HYHO7KUHDGV● We have taken the execution aspect of a process and separated it out into threads◆ To make concurrency cheaper● As such, the OS now manages threads and processes◆ All thread operations are implemented in the kernel◆ The OS schedules all of the threads in the system● OS-managed threads are called kernel-level threadsor lightweight processes◆ NT: threads◆ Solaris: lightweight processes (LWP)October 1, 2001 CSE 120 – Lecture 4 – Threads 12.HUQHO7KUHDG/LPLWDWLRQV.HUQHO7KUHDG/LPLWDWLRQV● Kernel-level threads make concurrency much cheaper than processes◆ Much less state to allocate and initialize● However, for fine-grained concurrency, kernel-level threads still suffer from too much overhead◆ Thread operations still require system calls» Ideally, want thread operations to be as fast as a procedure call◆ Kernel-level threads have to be general to support the needs of all programmers, languages, runtimes, etc.● For such fine-grained concurrency, need even “cheaper” threads7October 1, 2001 CSE 120 – Lecture 4 – Threads 138VHU8VHU/HYHO7KUHDGV/HYHO7KUHDGV● To make threads cheap and fast, they need to be implemented at user level◆ Kernel-level threads are managed by the OS◆ User-level threads are managed entirely by the run-time system (user-level library)● User-level threads are small and fast◆ A thread is simply represented by a PC, registers, stack, and small thread control block (TCB)◆ Creating a new thread, switching between threads, and synchronizing threads are done via procedure call (no kernel involvement)◆ User-level thread operations 100x faster than kernel threadsOctober 1, 2001 CSE 120 – Lecture 4 – Threads 148/7KUHDG/LPLWDWLRQV8/7KUHDG/LPLWDWLRQV● But, user-level threads are not a perfect solution◆ As with everything else, they are a tradeoff● User-level threads are invisible to the OS◆ They are not well integrated with the OS● As a result, the OS can
View Full Document