OS 3

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

https://www.tutorialspoint.com/what-are-thread-libraries

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)

https://www.javatpoint.com/posix-threads-in-os

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

https://www.tutorialspoint.com/signals-and-signal-handling

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
  • struct task_struct points to process data structures (shared or unique)

Reference: https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/4_Threads.html