Operating Systems Chapter 5
Download
Report
Transcript Operating Systems Chapter 5
Operating Systems
Chapter 5
Threads
Benefits
Responsiveness
Resource Sharing
Economy
Utilization of MP Architectures
Benefits of Threads / Performance
implications
Less time to create a thread than a process
Less time to terminate thread than a process
Less time to switch between two threads
within the same process
Threads share memory and files; they can
communicate without invoking the kernel
Higher speed (might reach a factor of 10)
Single and Multithreaded Processes
User Threads
Thread Management Done by User-Level
Threads Library
Examples
- POSIX Pthreads
- Mach C-threads
- Solaris threads
- Windows NT - Fibers
ULTs – Advantages and
disadvantages
Advantages:
• Thread switching does not require kernel mode
•
•
privileges; faster
Scheduling is application specific; flexible
ULTs can run on any O.S.
Disadvantages:
• System calls done by one thread cause the whole
•
process to be blocked
Cannot take advantage of multi-processors. Kernel
assigns each process to one processor
Kernel Threads
Supported by the Kernel
Examples
- Windows 95/98/NT
- Solaris
- Digital UNIX
KLTs – Advantages and
disadvantages
Advantages:
• Threads do not block each others. Kernel
•
•
schedules threads independently
Kernel can schedule different threads on different
processors
Kernel routines can be multi-threaded
Disadvantage:
• Transfer of control within one process requires a
kernel mode switch
Many-to-One
Many User-Level Threads Mapped to Single Kernel Thread.
Used on Systems That Do Not Support Kernel Threads.
One-to-One
Each User-Level Thread Maps to Kernel Thread.
Examples
- Windows 95/98/NT
- OS/2
Many-to-many Model
Solaris Process
Threads implementations in Linux
Linux uses the same internal representation for
processes and threads; a thread is simply a new
process that happens to share the same address
space as its parent.
A distinction is only made when a new thread is
created by the clone system call.
•
•
fork creates a new process with its own entirely new
process context
clone creates a new process with its own identity, but that is
allowed to share the data structures of its parent
Using clone gives an application exactly what is
shared between two threads.
Threads with WindowsNT Win32API
CreateProcess
CreateThread
CreateFiber
ExitProcess
ExitThread
ExitFiber
WaitForSingleObject
POSIX Threads API
Don’t forget to compile and link with -lpthread
pthread_create – create a new thraed , just
like fork create a new process
#include <pthread.h>
int pthread_create(
pthread_t *thread,
pthread_attr *attr,
void *(*start_routine)(void *) ,
void *arg)
More PThread Functions
#include <pthread.h>
void pthread_exit(void *retval);
Terminates a thread like exit does to Process
#include <pthread.h>
int pthread_join(pthread_t th,void **thread_return);
Just like wait is used to collect child process
Threads in MicroThread
/* pointer type to a thread function */
typedef int (far *PThreadFunc) (void *pArg);
/* Adds a new thread to the READY queue */
int MTAddNewThread(PThreadFunc pThreadFunc,unsigned priority,
unsigned sizeArg, void *pArg);
/* Kill a thread */
void MTKillThread(unsigned threadID);
/* Kills the current thread */
void MTEndThread(void);
/* Kills all known threads dead*/
void MTEndMultiThreading(void);
enum MTReturnCode { NORMAL, DEADLOCKED, CTRLBREAK,
NOT_INITIALISED,TOO_DEEP_CRITICAL_NEST };
enum /* Starts multi-threading */
MTReturnCode MTStartMultiThreading(void);
MT – Thread Context
/* Thread execution context */
typedef struct {
unsigned sp; /* stack pointer */
unsigned ss; /* stack segment */
unsigned priority; /* priority: 1,2,3,4 or 5 */
enum ThreadStatus status;
unsigned semaphore; /* blocking semaphore */
void *pOwnStack;
PThreadFunc pFunc; /* pointer to the thread
function */
void *pArg; /* pointer argument passed to the
thread function */
void *pMsg;
unsigned msgSize;
unsigned long wakeUpTime; /* time to wake the
sleeping thread up */
unsigned prevID; /* ID of previous thread in the
linked-list queue */
unsigned nextID; /* ID of next thread in the
linked-list queue */
} ThreadContext;
/* The Thread List - implemented as an
array of thread execution contexts
so that the thread IDs correspond to the
array indices */
ThreadContext threads[MAX_THREADS];