Download presentation
Presentation is loading. Please wait.
1
Threads
2
Introduction Virtually all modern operating systems provide features enabling a process to contain multiple threads of control We will introduce many concepts associated with multithreaded computer systems We will discuss APIs for the Pthreads, Windows, and Java thread libraries
3
Objectives To introduce the notion of a thread—a fundamental unit of CPU utilization To discuss the APIs for the Pthreads, Windows, and Java thread libraries To examine issues related to multithreaded programming To cover operating system support for threads in Windows and Linux
4
Motivation A thread is a basic unit of CPU utilization
It comprises a thread ID, a program counter, a register set, and a stack It shares with other threads belonging to the same process The code section The data section other operating-system resources, such as open files and signals A traditional (or heavyweight) process has a single thread of control If a process has multiple threads of control, it can perform more than one task at a time
5
Motivation
6
Motivation An application typically is implemented as a separate process with several threads of control Example A web browser might have one thread to display images or text while another thread retrieves data from the network In certain situations, a single application may be required to perform several similar tasks A web server accepts client requests for web pages, images, sound, and so forth
7
Motivation The process-creation method was in common use before threads became popular Process creation is time consuming and resource intensive It is generally more efficient to use one process that contains multiple threads
8
Benefits Responsiveness. Resource sharing. Economy. Scalability.
Multithreading an interactive application may allow a program to continue running even if part of it is blocked Resource sharing. Processes can only share resources through shared memory and message passing. Such techniques must be explicitly arranged by the programmer. Threads share the memory and the resources of the process to which they belong by default Economy. Allocating memory and resources for process creation is costly It is more economical to create and context-switch threads Scalability. The benefits of multithreading can be even greater in a multiprocessor architecture, where threads may be running in parallel on different processing cores
9
Multicore Programming
Single-CPU systems evolved into multi-CPU systems A more recent trend is to place multiple computing cores on a single chip Whether the cores appear across CPU chips or within CPU chips, we call these systems multicore or multiprocessor systems Multithreaded programming provides a mechanism for more efficient use of these multiple computing cores
10
Multicore Programming
On a system with a single computing core, concurrency means that the execution of the threads will be interleaved over time The processing core is capable of executing only one thread at a time
11
Multicore Programming
On a system with multiple cores concurrency means that the threads can run in parallel The system can assign a separate thread to each core
12
Multicore Programming
Parallelism The system is parallel if it can perform more than one task simultaneously Concurrency A concurrent system supports more than one task by allowing all the tasks to make progress Differences An application may process the task serially from start to end, or split the task up into subtasks which can be completed in parallel An application may process one task at a time (sequentially) or work on multiple tasks at the same time (concurrently)
13
Amdahl’s Law An application may have both serial (nonparallel) and parallel components It is a formula that identifies potential performance gains with additional computing cores If S is the serial part and N is the processing cores, the formula appears as follows: If application is 75% parallel / 25% serial, moving from 1 to 2 cores results in speedup of 1.6 times As N approaches infinity, speedup approaches 1 / S
14
Amdahl’s Law
15
Types of Parallelism Data parallelism
It focuses on distributing subsets of the same data across multiple computing cores performing the same operation Example: Summing the contents of an array of size N Single-core system one thread would simply sum the elements [0] [N − 1]. Dual-core system thread A, running on core 0, could sum the elements [0] [N/2 − 1] while thread B, running on core 1, could sum the elements [N/2] [N − 1]
16
Types of Parallelism Task parallelism
It involves distributing tasks (threads) across multiple computing cores Each thread is performing a unique operation Different threads may be operating on the same data, or they may be operating on different data Example: Summing the contents of an array of size N Task parallelism might involve two threads, each performing a unique statistical operation on the array of elements
17
Multithreading Models
Support for threads may be provided either at the user level, for user threads, or by the kernel, for kernel threads User threads are supported above the kernel and are managed without kernel support Kernel threads are supported and managed directly by the operating system A relationship must exist between user threads and kernel threads There are three common ways of establishing such a relationship The many-to-one model The one-to-one model The many-to-many model
18
Many-to-One Model It maps many user-level threads to one kernel thread
Thread management is done by the thread library in user space The entire process will block if a thread makes a blocking system call Only one thread can access the kernel at a time Multiple threads are unable to run in parallel on multicore systems Examples: Solaris Green Threads GNU Portable Threads
19
One-to-One Model It maps each user thread to a kernel thread
It provides more concurrency by allowing another thread to run when a thread makes a blocking system call It also allows multiple threads to run in parallel on multiprocessors The drawback to this model is that creating a user thread requires creating the corresponding kernel thread The overhead of creating kernel threads can burden the performance of an application Examples Windows Linux Solaris 9 and later
20
Many-to-Many Model It multiplexes many user-level threads to a smaller or equal number of kernel threads The number of kernel threads may be specific to either a particular application or a particular machine When a thread performs a blocking system call, the kernel can schedule another thread for execution Examples Solaris prior to version 9
21
Variations It still multiplexes many user level threads to a smaller or equal number of kernel threads It also allows a user-level thread to be bound to a kernel thread This variation is sometimes referred to as the two-level model Examples IRIX HP-UX Tru64 UNIX Solaris 8 and earlier
22
Thread Libraries A thread library provides the programmer with an API for creating and managing threads There are two primary ways of implementing a thread library The first approach is to provide a library entirely in user space All code and data structures for the library exist in user space Invoking a function in the library results in a local function call in user space and not a system call The second approach is to implement a kernel-level library supported directly by the operating system Code and data structures for the library exist in kernel space
23
Thread Libraries Three main thread libraries are in use today
POSIX Pthreads It may be provided as either a user-level or a kernel-level library Windows, It is a kernel-level library available on Windows systems Java The Java thread API allows threads to be created and managed directly in Java programs JVM is running on top of a host operating system, thus, the Java thread API is generally implemented using a thread library available on the host system
24
Pthreads Pthreads refers to the POSIX standard (IEEE c) defining an API for thread creation and synchronization This is a specification for thread behavior, not an implementation Operating-system designers may implement the specification in any way they wish
25
Pthreads
26
Pthreads
27
In-Class Activity What’s the result of the following code?
28
In-Class Activity What’s the result of the following code? Result
Waiting for thread to finish... thread_function is running. Argument was Hello World Thread joined, it returned Thank you for the CPU time Message is now Bye!
29
Multiple Threads
30
Windows Threads
31
Java Threads All Java programs comprise at least a single thread of control Even a simple Java program consisting of only a main() method runs as a single thread in the JVM Java threads are available on any system that provides a JVM including Windows, Linux, and Mac OS X There are two techniques for creating threads in a Java program One approach is to create a new class that is derived from the Thread class and to override its run() method An alternative technique is to define a class that implements the Runnable interface
32
Java Threads Example
33
Java Threads Example
34
In-Class Activity What’s the result of the following code?
35
In-Class Activity What’s the result of the following code? Result
36
Thread Pools Unlimited threads could exhaust system resources, such as CPU time or memory 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 Separating task to be performed from mechanics of creating task allows different strategies for running task i.e., Tasks could be scheduled to run periodically Windows API supports thread pools:
37
Thread Pools The number of threads in the pool can be set heuristically based on factors such as the number of CPUs in the system, the amount of physical memory, the expected number of concurrent client requests More sophisticated architectures can dynamically adjust the number of threads in the pool according to usage patterns Such architectures provide the further benefit of having a smaller pool— thereby consuming less memory—when the load on the system is low
38
Fork() and Exec() If one thread in a program calls fork(), does the new process duplicate all threads, or is the new process single-threaded? Some UNIX systems have chosen to have two versions of fork() one that duplicates all threads and another that duplicates only the thread that invoked the fork() system call The exec() system call typically works in the same way as described If a thread invokes the exec() system call, the program specified in the parameter to exec() will replace the entire process—including all threads
39
Signals A signal is used in UNIX systems to notify a process that a particular event has occurred A signal may be received either synchronously or asynchronously Examples of synchronous signal include illegal memory access and division by 0 Synchronous signals are delivered to the same process that performed the operation When a signal is generated by an event external to a running process, that process receives the signal asynchronously
40
Signals All signals follow the same pattern:
A signal is generated by the occurrence of a particular event The signal is delivered to a process Once delivered, the signal must be handled A signal may be handled by one of two possible handlers: A default signal handler A user-defined signal handler
41
Signals Every signal has a default signal handler that the kernel runs when handling that signal This default action can be overridden by a user-defined signal handler Signals are handled in different ways Some signals (such as changing the size of a window) are simply ignored Others (such as an illegal memory access) are handled by terminating the program
42
Signals Delivering signals is more complicated in multithreaded programs A process may have several threads Where should a signal be delivered? In general, the following options exist: 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 thread to receive all signals for the process
43
kill(pid t pid, int signal)
Signals The standard function for delivering a signal is kill(pid t pid, int signal) It specifies the process (pid) to which a particular signal (signal) is to be delivered Most multithreaded versions of UNIX allow a thread to specify which signals it will accept and which it will block An asynchronous signal may be delivered only to those threads that are not blocking it As signals need to be handled only once, a signal is typically delivered only to the first thread found that is not blocking it
44
pthread kill(pthread t tid, int signal)
Signals Pthreads provides the following function, which allows a signal to be delivered to a specified thread (tid): pthread kill(pthread t tid, int signal) Although Windows does not explicitly provide support for signals, it allows us to emulate them using asynchronous procedure calls (APCs) The APC facility enables a user thread to specify a function that is to be called when the user thread receives notification of a particular event
45
Thread Cancellation Thread cancellation involves terminating a thread before it has completed A thread that is to be canceled is often referred to as the target thread Cancellation of a target thread may occur in two different scenarios: Asynchronous cancellation One thread immediately terminates the target thread Deferred cancellation The target thread periodically checks whether it should terminate, allowing it an opportunity to terminate itself in an orderly fashion The difficulty with cancellation occurs in situations where resources have been allocated to a canceled thread
46
Thread Cancellation In Pthreads, thread cancellation is initiated using the pthread cancel() The identifier of the target thread is passed as a parameter to the function pthread t tid; /* create the thread */ pthread create(&tid, 0, worker, NULL); . . . /* cancel the thread */ pthread cancel(tid);
47
Thread Cancellation Invoking pthread cancel()indicates only a request to cancel the target thread The actual cancellation depends on how the target thread is set up to handle the request Pthreads supports three cancellation modes Each mode is defined as a state and a type Pthreads allows threads to disable or enable cancellation Obviously, a thread cannot be canceled if cancellation is disabled. However, cancellation requests remain pending, so the thread can later enable cancellation and respond to the request
48
Thank you for your Attention!
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.