Chapter 3: Threads
- Overview
- Multicore Programming
- Multithreading Models
- Thread Libraries
- Implicit Threading
- Threading Issues
- Operating System Examples
Objectives
- To introduce the notion of a thread — a fundamental unit of CPU utilization that forms the basis of multithreaded computer systems
- To discuss the APIs for the Pthreads, Windows, and Java thread libraries
- To explore several strategies that provide implicit threading
- To examine issues related to multithreaded programming
- To cover operating system support for threads in Windows and Linux
Motivation
- Most modern applications are multithreaded
- Threads run within application
- Multiple tasks with the application can be implemented by separate threads
- Update display
- Fetch data
- Spell checking
- Answer a network request
- Process creation is heavy-weight while thread creation is light-weight
- Can simplify code, increase efficiency
- Kernels are generally multithreaded
Multithreaded Server Architecture
*this is important
Benefits
- Responsiveness – may allow continued execution if part of process is blocked, especially important for user interfaces
- Resource Sharing – threads share resources of process, easier than shared memory or message passing
- Economy – cheaper than process creation, thread switching lower overhead than context switching
- Scalability – process can take advantage of multiprocessor architectures
*this is important
Multicore Programming
- Multicore or multiprocessor systems putting pressure on programmers, challenges include:
- Dividing activities
- Balance
- Data splitting
- Data dependency
- Testing and debugging
- Parallelism implies a system can perform more than one task simultaneously
- Concurrency supports more than one task making progress
- Single processor / core, scheduler providing concurrency
- Types of parallelism
- Data parallelism – distributes subsets of the same data across multiple cores, same operation on each
- Task parallelism – distributing threads across cores, each thread performing unique operation
- As # of threads grows, so does architectural support for threading
- CPUs have cores as well as hardware threads
- Consider Oracle SPARC T4 with 8 cores, and 8 hardware threads per core
Concurrency vs. Parallelism
Concurrent execution on single-core system:

Parallelism on a multi-core system:

https://www.geeksforgeeks.org/difference-between-concurrency-and-parallelism/
Single and Multithreaded Processes

User Threads and Kernel Threads
- User threads - management done by user-level threads library
- Three primary thread libraries:
- POSIX Pthreads
- Windows threads
- Java threads
- Kernel threads - Supported by the Kernel
- Examples – virtually all general purpose operating systems, including:
- Windows
- Solaris
- Linux
- Tru64 UNIX
- Mac OS X
https://byjus.com/gate/what-is-thread-in-operating-system-notes/
Multithreading Models
- Many-to-One
- One-to-One
- Many-to-Many
https://www.javatpoint.com/multithreading-models-in-operating-system
https://www.geeksforgeeks.org/multi-threading-models-in-process-management/
Many-to-One
- Many user-level threads mapped to single kernel thread
- One thread blocking causes all to block
- Multiple threads may not run in parallel on multicore system because only one may be in kernel at a time
- Few systems currently use this model
- Examples:
- Solaris Green Threads
- GNU Portable Threads

One-to-One
- Each user-level thread maps to 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
- Examples
- Windows
- Linux
- Solaris 9 and later

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
- Solaris prior to version 9
- Windows with the ThreadFiber package

Two-level Model
- Similar to M:M, except that it allows a user thread to be bound to kernel thread
- Examples
- IRIX
- HP-UX
- Tru64 UNIX
- Solaris 8 and earlier

Thread Libraries
- Thread library provides programmer with API for creating and managing threads
- Two primary ways of implementing
- Library entirely in user space
- Kernel-level library supported by the OS
Pthreads
- May be provided either as user-level or kernel-level
- A POSIX standard (IEEE 1003.1c) API for thread creation and synchronization
- Specification , not implementation
- 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)
Java Threads
- Java threads are managed by the JVM
- Typically implemented using the threads model provided by underlying OS
- Java threads may be created by:
- Extending Thread class
- Implementing the Runnable interface
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:

https://learn.microsoft.com/en-us/windows/win32/procthread/thread-pools
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
- Signal is generated by particular event
- Signal is delivered to a process
- Signal is handled by one of two signal handlers:
- default
- 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 Examples
- Windows Threads
- Linux Threads
Windows Threads
- Windows implements the Windows API – primary API for Win 98, Win NT, Win 2000, Win XP, and Win 7
- Implements the one-to-one mapping, kernel-level
- Each thread contains
- A thread id
- Register set representing state of processor
- Separate user and kernel stacks for when thread runs in user mode or kernel mode
- Private data storage area used by run-time libraries and dynamic link libraries (DLLs)
- The register set, stacks, and private storage area are known as the context of the thread
- The primary data structures of a thread include:
- ETHREAD (executive thread block) – includes pointer to process to which thread belongs and to KTHREAD, in kernel space
- KTHREAD (kernel thread block) – scheduling and synchronization info, kernel-mode stack, pointer to TEB, in kernel space
- TEB (thread environment block) – thread id, user-mode stack, thread-local storage, in user space
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
flag meaning CLONE_FS File-systen information is shared CLONE_VM The same memory space is shared CLONE_SIGHAND Signal handlers are shared CLONE_FILES The set of open files is shared
- Flags control behavior
- struct task_struct points to process data structures (shared or unique)
Reference: https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/4_Threads.html