Chapter 4: Threads Operating System Concepts with Java – 7th Edition, Nov 15, 2006 Silberschatz, Galvin and Gagne ©2007 Chapter 4: Threads Processes vs. Threads User vs. Kernel Threads Multithreading Models Threading Issues Pthreads Linux Threads Windows XP Threads Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.2 Silberschatz, Galvin and Gagne ©2007 Process Overheads A full process includes numerous things: an address space (defining all the code and data pages) OS resources and accounting information a “thread of control”, defines where the process is currently executing PC, registers, and stack Creating a new process is costly all of the structures (e.g., page tables) that must be allocated Communicating between processes is costly most communication goes through the OS Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.3 Silberschatz, Galvin and Gagne ©2007 Threads and Processes Most operating systems therefore support two entities: the process, which defines the address space and general process attributes the thread, which defines a sequential execution stream within a process A thread is bound to a single process. For each process, however, there may be many threads. Threads are the unit of scheduling Processes are containers in which threads execute Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.4 Silberschatz, Galvin and Gagne ©2007 Single and Multithreaded Processes Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.5 Silberschatz, Galvin and Gagne ©2007 Distinguishing Threads and Processes Makes it easier to support multithreaded applications Different from multiprocessing, multiprogramming, multitasking Concurrency (multithreading) is useful for: improving program structure Improving responsiveness handling concurrent events (e.g., web requests) building parallel programs sharing resources economically multiprocessor utilization Is multithreading useful even on a single processor? Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.6 Silberschatz, Galvin and Gagne ©2007 Threads vs. Processes A thread has no data segment or heap A thread cannot live on its own, it must live within a process There can be more than one thread in a process, the first thread calls main & has the process’s stack Inexpensive creation Inexpensive context switching If a thread dies, its stack is reclaimed Operating System Concepts with Java – 7th Edition, Nov 15, 2006 • A process has code/data/heap & other segments A process has at least one thread Threads within a process share code/data/heap, share I/O, but each has its own stack & registers Expensive creation Expensive context switching If a process dies, its resources are reclaimed & all threads die • • • • • 4.7 Silberschatz, Galvin and Gagne ©2007 User and Kernel Threads User threads - Thread management done by user-level threads library, with or without knowledge of the kernel Kernel threads - Threads directly supported by the kernel: Windows XP/2000 Solaris Linux Tru64 UNIX Mac OS X Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.8 Silberschatz, Galvin and Gagne ©2007 User vs. Kernel Threads (a) A user-level threads package. (b) A threads package managed by the kernel. Example from Tanenbaum, Modern Operating Systems 3 e, (c) 2008 Prentice-Hall, Inc. All rights reserved. 0-13-6006639 Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.9 Silberschatz, Galvin and Gagne ©2007 Kernel Threads Also called Lightweight Processes (LWP) Kernel threads still suffer from performance problems Operations on kernel threads are slow because: a thread operation still requires a system call kernel threads may be overly general to support needs of different users, languages, etc. the kernel doesn’t trust the user there must be lots of checking on kernel calls Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.10 Silberschatz, Galvin and Gagne ©2007 User-Level Threads For speed, implement threads at the user level A user-level thread is managed by the run-time system user-level code that is linked with your program Each thread is represented simply by: PC Registers Stack Small control block All thread operations are at the user-level: Creating a new thread switching between threads synchronizing between threads Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.11 Silberschatz, Galvin and Gagne ©2007 User-Level Threads User-level threads the thread scheduler is part of a library, outside the kernel thread context switching and scheduling is done by the library Can either use cooperative or pre-emptive threads cooperative threads are implemented by: CreateThread(), DestroyThread(), Yield(), Suspend(), etc. pre-emptive threads are implemented with a timer (signal) where the timer handler decides which thread to run next Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.12 Silberschatz, Galvin and Gagne ©2007 User-Level vs. Kernel Threads User-Level Managed by application Kernel not aware of thread Context switching cheap Can create many more Must be used with care Kernel-Level Managed by kernel Consumes kernel resources Context switching expensive Number limited by kernel resources Simpler to use Key issue: kernel threads provide virtual processors to user-level threads, but if all of kernel threads block, then all user-level threads will block even if the program logic allows them to proceed Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.13 Silberschatz, Galvin and Gagne ©2007 Multiplexing User-Level Threads The user-level thread package sees a “virtual” processor(s) it schedules user-level threads on these virtual processors each “virtual” processor is implemented by a kernel thread The big picture: Create as many kernel threads as there are processors Create as many user-level threads as the application needs Multiplex user-level threads on top of the kernel-level threads Why not just create as many kernel-level threads as app needs? Context switching Resources Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.14 Silberschatz, Galvin and Gagne ©2007 Multithreading Models Mapping user threads to kernel threads: Many-to-One One-to-One Many-to-Many Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.15 Silberschatz, Galvin and Gagne ©2007 Many-to-One Many user-level threads mapped to single kernel thread Fast - no system calls required Few system dependencies; portable No parallel execution of threads - can’t exploit multiple CPUs All threads block when one uses synchronous I/O Examples: Solaris Green Threads GNU Portable Threads Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.16 Silberschatz, Galvin and Gagne ©2007 One-to-One Each user-level thread maps to kernel thread More concurrency Better multiprocessor performance Each user thread requires creation of kernel thread Each thread requires kernel resources; limits number of total threads Examples Windows NT/XP/2000 Linux Solaris 9 and later Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.17 Silberschatz, Galvin and Gagne ©2007 Many-to-Many Model Allows many user level threads to be mapped to many kernel threads Allows the operating system to create a sufficient number of kernel threads If U < L, no benefits of multithreading If U > L, some threads may have to wait for an LWP to run Examples: Solaris prior to version 9 Windows NT/2000 with the ThreadFiber package Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.18 Silberschatz, Galvin and Gagne ©2007 Two-level Model Similar to M:M, except that a user thread may be bound to kernel thread Examples IRIX HP-UX Tru64 UNIX Solaris 8 and earlier Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.19 Silberschatz, Galvin and Gagne ©2007 Multithreading Issues Semantics of fork() and exec() system calls Thread cancellation Which thread to deliver it to? Thread pools Asynchronous vs. Deferred Cancellation Signal handling Does fork() duplicate only the calling thread or all threads? Creating new threads, unlimited number of threads Scheduler activations Maintaining the correct number of scheduler threads Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.20 Silberschatz, Galvin and Gagne ©2007 Thread Cancellation Terminating a thread before it has finished Two general approaches: Asynchronous cancellation terminates the target thread immediately Deferred cancellation allows the target thread to periodically check if it should be cancelled Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.21 Silberschatz, Galvin and Gagne ©2007 Signal Handling Signals are used in UNIX systems to notify a process that a particular event has occurred A signal handler is used to process signals 1. Signal is generated by particular event 2. Signal is delivered to a process 3. Signal is handled Options: Deliver the signal to the thread to which the signal applies Deliver the signal to every thread in the process Deliver the signal to certain threads in the process Assign a specific threa to receive all signals for the process Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.22 Silberschatz, Galvin and Gagne ©2007 Thread Pools Create a number of threads in a pool where they await work Advantages: Usually slightly faster to service a request with an existing thread than create a new thread Allows the number of threads in the application(s) to be bound to the size of the pool Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.23 Silberschatz, Galvin and Gagne ©2007 Scheduler Activations Both M:M and Two-level models require communication to maintain the appropriate number of kernel threads allocated to the application Scheduler activations provide upcalls - a communication mechanism from the kernel to the thread library This communication allows an application to maintain the correct number kernel threads Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.24 Silberschatz, Galvin and Gagne ©2007 Pthreads (POSIX Threads) A POSIX standard (IEEE 1003.1c) API for thread creation and synchronization API specifies behavior of the thread library, implementation is up to development of the library Common in UNIX operating systems (Solaris, Linux, Mac OS X) Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.25 Silberschatz, Galvin and Gagne ©2007 Example: POSIX Threads (1) Some of the Pthreads function calls. Example from Tanenbaum, Modern Operating Systems 3 e, (c) 2008 Prentice-Hall, Inc. All rights reserved. 0-13-6006639 Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.26 Silberschatz, Galvin and Gagne ©2007 POSIX Threads (2) An example program using threads. ... Example from Tanenbaum, Modern Operating Systems 3 e, (c) 2008 Prentice-Hall, Inc. All rights reserved. 0-13-6006639 Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.27 Silberschatz, Galvin and Gagne ©2007 POSIX Threads (3) ... Figure 2-15. An example program using threads. Example from Tanenbaum, Modern Operating Systems 3 e, (c) 2008 Prentice-Hall, Inc. All rights reserved. 0-13-6006639 Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.28 Silberschatz, Galvin and Gagne ©2007 Linux Threads Linux refers to them as tasks rather than threads Thread creation is done through clone() system call clone() allows a child task to share the address space of the parent task (process) Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.29 Silberschatz, Galvin and Gagne ©2007 Windows XP Threads Implements the one-to-one mapping Each thread contains A thread id Register set Separate user and kernel stacks Private data storage area The register set, stacks, and private storage area are known as the context of the threads Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.30 Silberschatz, Galvin and Gagne ©2007 End of Chapter 4 Operating System Concepts with Java – 7th Edition, Nov 15, 2006 Silberschatz, Galvin and Gagne ©2007 Backup Foils Operating System Concepts with Java – 7th Edition, Nov 15, 2006 Silberschatz, Galvin and Gagne ©2007 Cooperative Threads A cooperative thread runs until it decides to give up the CPU main() { tid t1 = CreateThread(fn, arg); … Yield(t1); } fn(int arg) { … Yield(any); } Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.33 Silberschatz, Galvin and Gagne ©2007 Cooperative Threads Cooperative threads use non pre-emptive scheduling Advantages: Simple Scientific apps Disadvantages: For badly written code Scheduler gets invoked only when Yield is called A thread could yield the processor when it blocks for I/O Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.34 Silberschatz, Galvin and Gagne ©2007 Non-Cooperative Threads No explicit control passing among threads Rely on a scheduler to decide which thread to run A thread can be pre-empted at any point Often called pre-emptive threads Most modern thread packages use this approach Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.35 Silberschatz, Galvin and Gagne ©2007 Key Data Structures your process address space your program: your data (shared by all your threads): for i (1, 10, I++) thread_fork(I); …. queue of thread control blocks user-level thread code: proc thread_fork()… proc thread_block()… proc thread_exit()... Operating System Concepts with Java – 7th Edition, Nov 15, 2006 per-thread stacks 4.36 Silberschatz, Galvin and Gagne ©2007 Pop-Up Threads Creation of a new thread when a message arrives. (a) Before the message arrives. (b) After the message arrives. Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.37 Silberschatz, Galvin and Gagne ©2007 Windows XP Threads Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.38 Silberschatz, Galvin and Gagne ©2007 Java Threads Java threads are managed by the JVM Java threads may be created by: Implementing the Runnable interface Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.39 Silberschatz, Galvin and Gagne ©2007 Java Threads - Example Program Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.40 Silberschatz, Galvin and Gagne ©2007 Java Threads - Example Program Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.41 Silberschatz, Galvin and Gagne ©2007 Java Thread States Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.42 Silberschatz, Galvin and Gagne ©2007 Java Threads - Producer-Consumer Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.43 Silberschatz, Galvin and Gagne ©2007 Java Threads - Producer-Consumer Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.44 Silberschatz, Galvin and Gagne ©2007 Java Threads - Producer-Consumer Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.45 Silberschatz, Galvin and Gagne ©2007 Thread Cancellation Deferred cancellation in Java Interrupting a thread Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.46 Silberschatz, Galvin and Gagne ©2007 Thread Cancellation Deferred cancellation in Java Checking interruption status Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.47 Silberschatz, Galvin and Gagne ©2007 Thread Specific Data Allows each thread to have its own copy of data Useful when you do not have control over the thread creation process (i.e., when using a thread pool) Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.48 Silberschatz, Galvin and Gagne ©2007 Thread Specific Data Thread-specific data in Java. Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.49 Silberschatz, Galvin and Gagne ©2007 Solaris 2 Threads Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.50 Silberschatz, Galvin and Gagne ©2007 Solaris Process Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.51 Silberschatz, Galvin and Gagne ©2007 Thread Pools Java provides 3 thread pool architectures: 1. Single thread executor - pool of size 1. 2. Fixed thread executor - pool of fixed size. 3. Cached thread pool - pool of unbounded size Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.52 Silberschatz, Galvin and Gagne ©2007 Thread Pools A task to be serviced in a thread pool Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.53 Silberschatz, Galvin and Gagne ©2007 Thread Pools Creating a thread pool in Java Operating System Concepts with Java – 7th Edition, Nov 15, 2006 4.54 Silberschatz, Galvin and Gagne ©2007