CS Doc 01
CS Doc 01
Concurrency
Operating System Concepts – 10th Edition Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Chapter 4: Threads
Overview
Multi-core Programming
Multi-threading Models
Thread Libraries
Implicit Threading
Threading Issues
Operating System Examples
Operating System Concepts – 10th Edition 4.2 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Objectives
Identify the basic components of a thread, and contrast threads
and processes
Describe the benefits and challenges of designing multi-
threaded applications
Illustrate different approaches to implicit threading, including
thread pools and fork-join
Describe how the Linux operating system represents threads
Explore multi-threaded applications using the Pthreads, Java,
and Windows threading APIs
Operating System Concepts – 10th Edition 4.3 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Motivation
Operating System Concepts – 10th Edition 4.4 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Single versus Multi-threaded Processes
Each thread has its own register set, stack, and PC.
Operating System Concepts – 10th Edition 4.5 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Multi-threaded Server Architecture
Operating System Concepts – 10th Edition 4.6 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Benefits of Threads
Operating System Concepts – 10th Edition 4.7 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Concurrency vs. Parallelism
Two or more sequences of instructions are said to be concurrent if no
matter what order they are executed in relation to each other, the final
result of their combined computation is the same.
This means that they can be executed simultaneously on different
processors, or interleaved on a single processor in any order, and
whatever outputs they produce will be the same.
A system with two ore more concurrent processes is called a concurrent
program or a concurrent system.
Two processes or threads execute in parallel if they execute at the same
time on different processors.
Parallel programs are those containing instruction sequences that can be
executed in parallel. A parallel program is always a concurrent program,
but a system can have concurrency even though it is not a parallel
program.
Operating System Concepts – 10th Edition 4.8 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Concurrency vs. Parallelism
Concurrent execution on single-core system:
Operating System Concepts – 10th Edition 4.9 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Multi-core Programming
Operating System Concepts – 10th Edition 4.10 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Multi-core Programming (cont.)
Operating System Concepts – 10th Edition 4.11 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Data and Task Parallelism
Operating System Concepts – 10th Edition 4.12 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Amdahl’s Law
In 1967, Gene Amdahl argued that there was an inherent limitation to the amount of speedup
that could be obtained by performing a computation using more processors. His argument is
known as “Amdahl’s Law”. If
S, 0 <= S <= 1, is the fraction of operations that must be executed serially (in sequence),
and
N is the number of processing cores, then the speed-up is bounded above:
Example: if program is 75% parallel / 25% serial, (S=0.25) moving from 1 to 2 cores (N=2)
results in speedup of 1/((1/4) + (3/4)/2)) = 1.6
As N approaches infinity, speedup approaches 1 / S
Operating System Concepts – 10th Edition 4.13 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Amdahl’s Law Graphically
Operating System Concepts – 10th Edition 4.14 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
User Threads and Kernel Threads
Operating System Concepts – 10th Edition 4.15 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
User and Kernel Threads
When threads are provided as user threads, they still must be
mapped onto kernel threads.
There is not necessarily an equal number of user and kernel
threads.
Operating System Concepts – 10th Edition 4.16 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Multi-threading Models
Operating System Concepts – 10th Edition 4.17 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Many-to-One
Operating System Concepts – 10th Edition 4.18 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
One-to-One
Each user-level thread maps to one kernel thread
Creating a user-level thread creates a kernel thread
More concurrency than many-to-one
Number of threads per process sometimes restricted due to
overhead:
Creating a user thread requires creating a kernel thread,
and too many kernel threads can degrade performance of
system.
Examples
Windows
Linux
Operating System Concepts – 10th Edition 4.19 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Many-to-Many Model
Allows many user level threads to be multiplexed onto an
equal or smaller number of kernel threads
Allows the operating system to create a sufficient number of
kernel threads
Program can have as many user threads as necessary, and
the corresponding kernel threads can run in parallel on a
multiprocessor. If thread blocks, kernel can schedule a different
thread.
Operating System Concepts – 10th Edition 4.20 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Two-level Model
Similar to the many-to-many, except that it allows a user
thread to be bound to a kernel thread.
Operating System Concepts – 10th Edition 4.21 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Thread Libraries
Operating System Concepts – 10th Edition 4.22 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Pthreads
Operating System Concepts – 10th Edition 4.23 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Pthreads Example 1
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
Operating System Concepts – 10th Edition 4.25 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Pthreads Example 2 (cont)
Operating System Concepts – 10th Edition 4.26 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Pthreads Code for Joining 10 Threads
Operating System Concepts – 10th Edition 4.27 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Windows Multi-threaded C Program
Operating System Concepts – 10th Edition 4.28 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Windows Multi-threaded C Program (Cont.)
Operating System Concepts – 10th Edition 4.29 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Implicit Threading
Operating System Concepts – 10th Edition 4.30 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
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
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:
Operating System Concepts – 10th Edition 4.31 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Fork-Join Parallelism
Multiple threads (tasks) are forked, and then joined.
Operating System Concepts – 10th Edition 4.32 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Fork-Join Parallelism
General algorithm for fork-join strategy:
Operating System Concepts – 10th Edition 4.33 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Fork-Join Parallelism
Operating System Concepts – 10th Edition 4.34 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
OpenMP
Set of compiler directives and an
API for C, C++, FORTRAN
Provides support for parallel
programming in shared-memory
environments
Identifies parallel regions –
blocks of code that can run in
parallel
#pragma omp parallel
Create as many threads as there are
cores
Operating System Concepts – 10th Edition 4.35 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
OpenMP Example
Run the for loop in parallel
Operating System Concepts – 10th Edition 4.36 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Grand Central Dispatch
ˆ{ printf("I am a block"); }
Operating System Concepts – 10th Edition 4.37 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Grand Central Dispatch (cont)
Two types of dispatch queues:
serial – blocks removed in FIFO order, queue is per process,
called main queue
Programmers can create additional serial queues within
program
concurrent – removed in FIFO order but several may be
removed at a time
Four system wide queues divided by quality of service:
o QOS_CLASS_USER_INTERACTIVE
o QOS_CLASS_USER_INITIATED
o QOS_CLASS_USER_UTILITY
o QOS_CLASS_USER_BACKGROUND
Operating System Concepts – 10th Edition 4.38 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Grand Central Dispatch (3)
For the Swift language a task is defined as a closure – similar to a block,
minus the caret
Closures are submitted to the queue using the dispatch_async()
function:
Operating System Concepts – 10th Edition 4.39 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Threading Issues
Semantics of fork() and exec() system calls
Signal handling
Synchronous and asynchronous
Thread cancellation of target thread
Asynchronous or deferred
Thread-local storage
Scheduler Activations
Operating System Concepts – 10th Edition 4.40 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Semantics of fork() and exec()
Operating System Concepts – 10th Edition 4.41 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
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 by one of two signal handlers:
1. default
2. user-defined
Every signal has default handler that kernel runs when
handling signal
User-defined signal handler can override default
For single-threaded, signal delivered to process
Operating System Concepts – 10th Edition 4.42 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Signal Handling (Cont.)
Where should a signal be delivered for multi-threaded?
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
Operating System Concepts – 10th Edition 4.43 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Thread Cancellation
Terminating a thread before it has finished
Thread to be canceled is target thread
Two general approaches:
Asynchronous cancellation terminates the target thread
immediately
Deferred cancellation allows the target thread to periodically
check if it should be cancelled
Pthread code to create and cancel a thread:
Operating System Concepts – 10th Edition 4.44 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Thread Cancellation (Cont.)
Invoking thread cancellation requests cancellation, but actual
cancellation depends on thread state
Operating System Concepts – 10th Edition 4.45 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Thread-Local Storage
Operating System Concepts – 10th Edition 4.46 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Scheduler Activations
Both M:M and Two-level models require
communication to maintain the appropriate
number of kernel threads allocated to the
application
Typically use an intermediate data structure
between user and kernel threads – lightweight
process (LWP)
Appears to be a virtual processor on which
process can schedule user thread to run
Each LWP attached to kernel thread
How many LWPs to create?
Scheduler activations provide upcalls - a
communication mechanism from the kernel to
the upcall handler in the thread library
This communication allows an application to
maintain the correct number kernel threads
Operating System Concepts – 10th Edition 4.47 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Operating System Examples
Windows Threads
Linux Threads
Operating System Concepts – 10th Edition 4.48 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Windows Threads
Operating System Concepts – 10th Edition 4.49 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Windows Threads (Cont.)
Operating System Concepts – 10th Edition 4.50 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
Windows Threads Data Structures
Operating System Concepts – 10th Edition 4.51 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
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)
Flags control behavior
Operating System Concepts – 10th Edition 4.52 Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020
End of Chapter 4
Operating System Concepts – 10th Edition Silberschatz, Galvin and Gagne ©2018, revised by S. Weiss 2020