Top Banner
Chapter 4: Threads Chapter 4: Threads
48

Chapter 4: Threads

Jan 16, 2016

Download

Documents

patia

Chapter 4: Threads. Chapter 4: Threads. Overview Multithreading Models Threading Issues Pthreads Windows XP Threads Linux Threads Java Threads. Threads. A thread (or lightweight process ) is a basic unit of CPU utilization; it consists of: program counter register set stack space - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Chapter 4:  Threads

Chapter 4: ThreadsChapter 4: Threads

Page 2: Chapter 4:  Threads

4.2 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Chapter 4: ThreadsChapter 4: Threads

Overview

Multithreading Models

Threading Issues

Pthreads

Windows XP Threads

Linux Threads

Java Threads

Page 3: Chapter 4:  Threads

4.3 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

ThreadsThreads

A thread (or lightweight process) is a basic unit of CPU utilization; it consists of:

program counter

register set

stack space

A thread shares with its peer threads its:

code section

data section

operating-system resources

collectively know as a task.

A traditional or heavyweight process is equal to a task with one thread

Page 4: Chapter 4:  Threads

4.4 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Threads (Cont.)Threads (Cont.)

In a multiple threaded task, while one server thread is blocked and waiting, a second thread in the same task can run. Cooperation of multiple threads in same job confers higher

throughput and improved performance. Applications that require sharing a common buffer (i.e., producer-

consumer) benefit from thread utilization. Threads provide a mechanism that allows sequential processes to

make blocking system calls while also achieving parallelism. Kernel-supported threads (Mach and OS/2). User-level threads; supported above the kernel, via a set of library

calls at the user level (Project Andrew from CMU). Hybrid approach implements both user-level and kernel-supported

threads (Solaris 2).

Page 5: Chapter 4:  Threads

4.5 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Multiple Threads within a TaskMultiple Threads within a Task

Page 6: Chapter 4:  Threads

4.6 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Single and Multithreaded ProcessesSingle and Multithreaded Processes

Page 7: Chapter 4:  Threads

4.7 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

BenefitsBenefits

Responsiveness

Resource Sharing

Economy

Utilization of MP Architectures

Page 8: Chapter 4:  Threads

4.8 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

User ThreadsUser Threads

Thread management done by user-level threads library

Three primary thread libraries:

POSIX Pthreads

Java threads

Win32 threads

Page 9: Chapter 4:  Threads

4.9 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Kernel ThreadsKernel Threads

Supported by the Kernel

Examples

Windows XP/2000

Solaris

Linux

Tru64 UNIX

Mac OS X

Page 10: Chapter 4:  Threads

4.10 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Multithreading ModelsMultithreading Models

Many-to-One

One-to-One

Many-to-Many

Page 11: Chapter 4:  Threads

4.11 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Many-to-OneMany-to-One

Many user-level threads mapped to single kernel thread

Examples

Solaris Green Threads

GNU Portable Threads

Page 12: Chapter 4:  Threads

4.12 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Many-to-One ModelMany-to-One Model

Page 13: Chapter 4:  Threads

4.13 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

One-to-OneOne-to-One

Each user-level thread maps to kernel thread

Examples

Windows NT/XP/2000

Linux

Solaris 9 and later

Page 14: Chapter 4:  Threads

4.14 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

One-to-one ModelOne-to-one Model

Page 15: Chapter 4:  Threads

4.15 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Many-to-Many ModelMany-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

Page 16: Chapter 4:  Threads

4.16 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Many-to-Many ModelMany-to-Many Model

Page 17: Chapter 4:  Threads

4.17 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Two-level ModelTwo-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

Page 18: Chapter 4:  Threads

4.18 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Two-level ModelTwo-level Model

Page 19: Chapter 4:  Threads

4.19 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Thread LibrariesThread LibrariesPthreadsPthreads

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)

Page 20: Chapter 4:  Threads

4.20 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

PthreadsPthreadsint sum; /* this data is shared by the thread(s) */void *runner(void *param); /* the thread */

main(int argc, char *argv[]){ pthread_t tid; /* the thread identifier */ pthread_attr_t attr; /* set of attributes for the thread */ /* get the default attributes */ pthread_attr_init(&attr); /* create the thread */ pthread_create(&tid,&attr,runner,argv[1]); /* now wait for the thread to exit */ pthread_join(tid,NULL); printf("sum = %d\n",sum);}

void *runner(void *param) { int upper = atoi(param); int i; sum = 0; if (upper > 0) { for (i = 1; i <= upper; i++) sum += i; } pthread_exit(0);}

Page 21: Chapter 4:  Threads

4.21 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Java ThreadsJava Threads

Java threads are managed by the JVM

Java threads may be created by:

Extending Thread class

Implementing the Runnable interface

Page 22: Chapter 4:  Threads

4.22 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Extending the Thread ClassExtending the Thread Class

class Worker1 extends Thread

{

public void run() {

System.out.println("I Am a Worker Thread");

}

}

public class First

{

public static void main(String args[]) {

Worker1 runner = new Worker1();

runner.start();

System.out.println("I Am The Main Thread");

}

}

Page 23: Chapter 4:  Threads

4.23 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

The Runnable InterfaceThe Runnable Interface

public interface Runnable

{

public abstract void run();

}

Page 24: Chapter 4:  Threads

4.24 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Implementing the Runnable InterfaceImplementing the Runnable Interface

class Worker2 implements Runnable

{

public void run() {

System.out.println("I Am a Worker Thread ");

}

}

public class Second

{

public static void main(String args[]) {

Runnable runner = new Worker2();

Thread thrd = new Thread(runner);

thrd.start();

System.out.println("I Am The Main Thread");

}

}

Page 25: Chapter 4:  Threads

4.25 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Java Thread States Java Thread States

Page 26: Chapter 4:  Threads

4.26 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Threading IssuesThreading Issues

Semantics of fork() and exec() system calls

Thread cancellation

Signal handling

Thread pools

Thread specific data

Scheduler activations

Page 27: Chapter 4:  Threads

4.27 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Semantics of fork() and exec()Semantics of fork() and exec()

Does fork() duplicate only the calling thread or all threads?

Page 28: Chapter 4:  Threads

4.28 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Thread CancellationThread 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

Page 29: Chapter 4:  Threads

4.29 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Signal HandlingSignal 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

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

Page 30: Chapter 4:  Threads

4.30 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Thread PoolsThread 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

Page 31: Chapter 4:  Threads

4.31 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Thread Specific DataThread 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)

Page 32: Chapter 4:  Threads

4.32 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Scheduler ActivationsScheduler Activations

Both M:M 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

Page 33: Chapter 4:  Threads

4.33 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Lightweight Process (LWP)Lightweight Process (LWP)

Page 34: Chapter 4:  Threads

4.34 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Threads Support in Solaris 2Threads 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.

Page 35: Chapter 4:  Threads

4.35 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Solaris 2 ThreadsSolaris 2 Threads

Page 36: Chapter 4:  Threads

4.36 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Windows XP ThreadsWindows 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)

Page 37: Chapter 4:  Threads

4.37 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Data Structures of a Windows XP threadData Structures of a Windows XP thread

Page 38: Chapter 4:  Threads

4.38 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Linux ThreadsLinux 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)

How much sharing is determined by a set of passed flags

No flags, no sharing; acts like fork() system call

Page 39: Chapter 4:  Threads

4.39 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

clone() flags in Linux Threadsclone() flags in Linux Threads

Page 40: Chapter 4:  Threads

4.40 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

More on Java Threads:More on Java Threads:Joining ThreadsJoining Threads

class JoinableWorker implements Runnable{ public void run() { System.out.println("Worker working"); }}

public class JoinExample{ public static void main(String[] args) { Thread task = new Thread(new JoinableWorker()); task.start(); try { task.join(); } catch (InterruptedException ie) { } System.out.println("Worker done"); }}

Page 41: Chapter 4:  Threads

4.41 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Thread CancellationThread Cancellation

Thread thrd = new Thread (new InterruptibleThread());Thrd.start();

. . .

// now interrupt itThrd.interrupt();

Page 42: Chapter 4:  Threads

4.42 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Thread CancellationThread Cancellation

public class InterruptibleThread implements Runnable { public void run() { while (true) { /** * do some work for awhile */

if (Thread.currentThread().isInterrupted()) { System.out.println("I'm interrupted!"); break; } }

// clean up and terminate }}

Page 43: Chapter 4:  Threads

4.43 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Thread Specific DataThread Specific Data

class Service{ private static ThreadLocal errorCode = new ThreadLocal();

public static void transaction() { try { /** * some operation where an error may occur */ catch (Exception e) { errorCode.set(e); } }

/** * get the error code for this transaction */ public static Object getErrorCode() { return errorCode.get(); }}

Page 44: Chapter 4:  Threads

4.44 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Thread Specific DataThread Specific Data

class Worker implements Runnable{ private static Service provider;

public void run() { provider.transaction(); System.out.println(provider.getErrorCode()); }}

Page 45: Chapter 4:  Threads

4.45 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Producer-Consumer ProblemProducer-Consumer Problem

public class Factory { public Factory() { // first create the message buffer Channel mailBox = new MessageQueue(); // now create the producer and consumer threads Thread producerThread = new Thread(new Producer(mailBox)); Thread consumerThread = new Thread(new Consumer(mailBox)); producerThread.start(); consumerThread.start(); }

public static void main(String args[]) { Factory server = new Factory(); }}

Page 46: Chapter 4:  Threads

4.46 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Producer ThreadProducer Thread

class Producer implements Runnable{ private Channel mbox;

public Producer(Channel mbox) { this.mbox = mbox; } public void run() { Date message; while (true) { SleepUtilities.nap(); message = new Date(); System.out.println("Producer produced " + message); // produce an item & enter it into the buffer mbox.send(message); } }}

Page 47: Chapter 4:  Threads

4.47 Silberschatz, Galvin and Gagne ©2005Operating System Concepts

Consumer ThreadConsumer Thread

class Consumer implements Runnable{ private Channel mbox;

public Consumer(Channel mbox) { this.mbox = mbox; }

public void run() { Date message; while (true) { SleepUtilities.nap(); // consume an item from the buffer System.out.println("Consumer wants to consume."); message = (Date)mbox.receive(); if (message != null) System.out.println("Consumer consumed " + message); } } }

Page 48: Chapter 4:  Threads

End of Chapter 4End of Chapter 4