Title: Chapter 4: Multithreaded Programming
1Chapter 4 Multithreaded Programming
2Chapter 4 Multithreaded Programming
- Overview
- Multithreading Models
- Threading Issues
- Pthreads
- Windows XP Threads
- Linux Threads
- Java Threads
3Threads vs. Processes
Creation of a new process using fork is
expensive (time memory). A thread (sometimes
called a lightweight process) does not require
lots of memory or startup time.
4fork()
fork()
5pthread_create()
Process A Thread 1
pthread_create()
Process A Thread 2
Stack
6Multiple Threads
- Each process can include many threads.
- All threads of a process share
- memory (program code and global data)
- open file/socket descriptors
- signal handlers and signal dispositions
- working environment (current directory, user ID,
etc.)
7Thread-Specific Resources
- Each thread has its own
- Thread ID (integer)
- Stack, Registers, Program Counter
- errno (if not - errno would be useless!)
- Threads within the same process can communicate
using shared memory. - Must be done carefully!
8Single and Multithreaded Processes
9Benefits
- Responsiveness
- Resource Sharing
- Economy
- Utilization of MP Architectures
10User Threads
- Thread management done by user-level threads
library - Three primary thread libraries
- POSIX Pthreads
- Win32 threads
- Java threads
11Kernel Threads
- Supported by the Kernel
- Examples
- Windows XP/2000
- Solaris
- Linux
- Tru64 UNIX
- Mac OS X
12Multithreading Models
- Many-to-One
- One-to-One
- Many-to-Many
13Many-to-One
- Many user-level threads mapped to single kernel
thread - Examples
- Solaris Green Threads
- GNU Portable Threads
14Many-to-One Model
15One-to-One
- Each user-level thread maps to kernel thread
- Examples
- Windows NT/XP/2000
- Linux
- Solaris 9 and later
16One-to-one Model
17Many-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 - Solaris prior to version 9
- Windows NT/2000 with the ThreadFiber package
18Many-to-Many Model
19Two-level Model
- Similar to MM, except that it allows a user
thread to be bound to kernel thread - Examples
- IRIX
- HP-UX
- Tru64 UNIX
- Solaris 8 and earlier
20Two-level Model
21Posix Threads
We will focus on Posix Threads - most widely
supported threads programming API. Solaris - you
need to link with -lpthread On many systems
this also forces the compiler to link in
re-entrant libraries (instead of plain vanilla C
libraries).
22Thread Creation
- pthread_create(
- pthread_t tid,
- const pthread_attr_t attr,
- void (func)(void ),
- void arg)
- func is the function to be called.
- When func() returns the thread is terminated.
23pthread_create()
- The return value is 0 for OK.
- positive error number on error.
- Does not set errno !!!
- Thread ID is returned in tid
24Multithreaded C program using the Pthreads API (1)
- include ltpthread.hgt
- include ltstdio.hgt
- int sum / this data is shared by the thread(s)
/ - void runner( void param ) / the thread /
- int main( int argc, char argv )
-
- pthread_t tid / the thread identifier /
- pthread_attr_t attr / set of thread
attributes / - if( argc ! 2 )
- fprintf( stderr, "usage a.out ltinteger
valuegt\n" ) - return -1
-
- if( atoi(argv1) lt 0 )
- fprintf( stderr, "d must be gt 0\n", atoi(
argv1 ) ) - return -1
-
25Multithreaded C program using the Pthreads API (2)
- / The thread will begin control in this function
/ - void runner( void param )
-
- int i, upper atoi( param )
- sum 0
- for( i 1 i lt upper i )
- sum i
- pthread_exit( 0 )
26Java program for the summation of a non-negative
integer (1)
- class Sum
-
- private int sum
- public int getSum()
- return sum
-
- public void setSum( int sum )
- this.sum sum
-
-
- class Summation implements Runnable
-
- private int upper
- private Sum sumValue
- public Summation( int upper, Sum sumValue )
- this.upper upper
27Java program for the summation of a non-negative
integer (2)
- public class Driver
-
- public static void main( String args )
- if( args.length gt 0 )
- if( Integer.parseInt( args0 ) lt 0 )
- System.err.println( args0 " must be gt
0." ) - else
- // create the object to be shared
- Sum sumObject new Sum()
- int upper Integer.parseInt( args0 )
- Thread thrd new Thread( new Summation(
upper, sumObject ) ) - thrd.start()
- try
- thrd.join()
- System.out.println( "The sum of " upper
" is " sumObject.getSum() ) -
- catch ( InterruptedException ie )
-
-
28Threading Issues
- Semantics of fork() and exec() system calls
- Thread cancellation
- Signal handling
- Thread pools
- Thread specific data
- Scheduler activations
29Semantics of fork() and exec()
- Does fork() duplicate only the calling thread or
all threads?
30Thread 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
31Signal 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
- Signal is generated by particular event
- Signal is delivered to a process
- 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
32Thread 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
33Thread 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)
34Scheduler Activations
- Both MM 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
35Pthreads
- 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)
36Threads Support in Solaris 2
- Solaris 2 is a version of UNIX with support for
threads at the kernel and user levels, symmetric
multiprocessing, and real-time scheduling - LWP intermediate level between user-level
threads and kernel-level threads. - Resource needs of thread types
- Kernel thread small data structure and a stack
thread switching does not require changing memory
access information relatively fast. - LWP PCB with register data, accounting and
memory information switching between LWPs is
relatively slow - User-level thread only need stack and program
counter no kernel involvement means fast
switching. Kernel only sees the LWPs that support
user-level threads.
37Solaris 2 Threads
38Solaris Process
39Windows 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 - The primary data structures of a thread include
- ETHREAD (executive thread block)
- KTHREAD (kernel thread block)
- TEB (thread environment block)
40Linux 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)
41Java Threads
- Java threads are managed by the JVM
- Java threads may be created by
- Extending Thread class
- Implementing the Runnable interface
42Java Thread States
43End of Chapter 4