Synchronization: Locks, Semaphores

Total Page:16

File Type:pdf, Size:1020Kb

Synchronization: Locks, Semaphores Review: Too Much Milk Solution #3 • Here is a possible two-note solution: CS162 Thread A Thread B Operating Systems and leave note A; leave note B; while (note B) {\\X if (noNote A) {\\Y Systems Programming do nothing; if (noMilk) { }buy milk; Lecture 8 if (noMilk) {} buy milk; } } remove note B; Locks, Semaphores, Monitors remove note A; • Does this work? Yes. Both can guarantee that: – It is safe to buy, or February 14th, 2019 – Other will buy, ok to quit •At X: Prof. John Kubiatowicz – If no note B, safe for A to buy, http://cs162.eecs.Berkeley.edu – Otherwise wait to find out what will happen •At Y: – If no note A, safe for B to buy – Otherwise, A is either buying or waiting for B to quit 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.2 Review: Solution #3 discussion Too Much Milk: Solution #4 • Our solution protects a single “Critical-Section” piece of • Suppose we have some sort of implementation of a lock code for each thread: – lock.Acquire() – wait until lock is free, then grab if (noMilk) { buy milk; – lock.Release() – Unlock, waking up anyone waiting } – These must be atomic operations – if two threads are waiting • Solution #3 works, but it’s really unsatisfactory for the lock and both see it’s free, only one succeeds to grab – Really complex – even for this simple an example the lock » Hard to convince yourself that this really works • Then, our milk problem is easy: – A’s code is different from B’s – what if lots of threads? milklock.Acquire(); » Code would have to be slightly different for each thread if (nomilk) – While A is waiting, it is consuming CPU time buy milk; » This is called “busy-waiting” milklock.Release(); • There’s a better way • Once again, section of code between Acquire() and – Have hardware provide higher-level primitives than atomic Release() called a “Critical Section” load & store • Of course, you can make this even simpler: suppose you – Build even higher-level programming abstractions on this hardware support are out of ice cream instead of milk – Skip the test since you always need more ice cream ;-) 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.3 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.4 Where are we going with synchronization? Goals for Today • We are going to implement various higher-level • Explore several implementations of locks synchronization primitives using atomic operations • Continue with Synchronization Abstractions – Everything is pretty painful if only atomic primitives are load and store – Semaphores, Monitors, and Condition variables – Need to provide primitives useful at user-level • Very Quick Introduction to scheduling Programs Shared Programs Higher- level Locks Semaphores Monitors Send/Receive API Load/Store Disable Ints Test&Set Hardware Note: Some slides and/or pictures in the following are Compare&Swap adapted from slides ©2005 Silberschatz, Galvin, and GagneGagne. 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.5 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.6 How to Implement Locks? Naïve use of Interrupt Enable/Disable • Lock: prevents someone from doing something • How can we build multi-instruction atomic operations? – Lock before entering critical section and – Recall: dispatcher gets control in two ways. before accessing shared data » Internal: Thread does something to relinquish the CPU – Unlock when leaving, after accessing shared data » External: Interrupts cause dispatcher to take CPU – On a uniprocessor, can avoid context-switching by: – Wait if locked » Avoiding internal events (although virtual memory tricky) » Important idea: all synchronization involves waiting » Preventing external events by disabling interrupts » Should sleep if waiting for a long time • Consequently, naïve Implementation of locks: • Atomic Load/Store: get solution like Milk #3 LockAcquire { disable Ints; } – Pretty complex and error prone LockRelease { enable Ints; } • Problems with this approach: • Hardware Lock instruction – Can’t let user do this! Consider following: – Is this a good idea? LockAcquire(); – What about putting a task to sleep? While(TRUE) {;} » What is the interface between the hardware and scheduler? – Real-Time system—no guarantees on timing! » Critical Sections might be arbitrarily long – Complexity? – What happens with I/O or other important events? » Done in the Intel 432 » “Reactor about to meltdown. Help?” » Each feature makes HW more complex and slow 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.7 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.8 Better Implementation of Locks by Disabling Interrupts New Lock Implementation: Discussion • Why do we need to disable interrupts at all? • Key idea: maintain a lock variable and impose mutual – Avoid interruption between checking and setting lock value exclusion only during operations on that variable – Otherwise two threads could think that they both have lock Acquire() { int value = FREE; disable interrupts; if (value == BUSY) { Acquire() { Release() { put thread on wait queue; disable interrupts; disable interrupts; Go to sleep(); Critical if (value == BUSY) { if (anyone on wait queue) { // Enable interrupts? put thread on wait queue; take thread off wait queue } else { Section Go to sleep(); Place on ready queue; value = BUSY; // Enable interrupts? } else { } value = FREE; } else { enable interrupts; } value = BUSY; enable interrupts; } } } • Note: unlike previous solution, the critical section (inside enable interrupts; Acquire()) is very short } – User of lock can take as long as they like in their own critical section: doesn’t impact global machine behavior – Critical interrupts taken in time! 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.9 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.10 Interrupt Re-enable in Going to Sleep Interrupt Re-enable in Going to Sleep • What about re-enabling ints when going to sleep? • What about re-enabling ints when going to sleep? Acquire() { Acquire() { disable interrupts; disable interrupts; if (value == BUSY) { if (value == BUSY) { put thread on wait queue; Enable Position put thread on wait queue; Go to sleep(); Go to sleep(); } else { } else { value = BUSY; value = BUSY; } } enable interrupts; enable interrupts; } } • Before Putting thread on the wait queue? 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.11 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.12 Interrupt Re-enable in Going to Sleep Interrupt Re-enable in Going to Sleep • What about re-enabling ints when going to sleep? • What about re-enabling ints when going to sleep? Acquire() { Acquire() { disable interrupts; disable interrupts; if (value == BUSY) { if (value == BUSY) { Enable Position put thread on wait queue; Enable Position put thread on wait queue; Go to sleep(); Go to sleep(); } else { } else { value = BUSY; value = BUSY; } } enable interrupts; enable interrupts; } } • Before Putting thread on the wait queue? • Before Putting thread on the wait queue? – Release can check the queue and not wake up thread – Release can check the queue and not wake up thread • After putting the thread on the wait queue 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.13 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.14 Interrupt Re-enable in Going to Sleep Interrupt Re-enable in Going to Sleep • What about re-enabling ints when going to sleep? • What about re-enabling ints when going to sleep? Acquire() { Acquire() { disable interrupts; disable interrupts; if (value == BUSY) { if (value == BUSY) { Enable Position put thread on wait queue; put thread on wait queue; Go to sleep(); Enable Position Go to sleep(); } else { } else { value = BUSY; value = BUSY; } } enable interrupts; enable interrupts; } } • Before Putting thread on the wait queue? • Before Putting thread on the wait queue? – Release can check the queue and not wake up thread – Release can check the queue and not wake up thread • After putting the thread on the wait queue • After putting the thread on the wait queue – Release puts the thread on the ready queue, but the thread – Release puts the thread on the ready queue, but the thread still thinks it needs to go to sleep still thinks it needs to go to sleep – Misses wakeup and still holds lock (deadlock!) – Misses wakeup and still holds lock (deadlock!) • Want to put it after sleep(). But – how? 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.15 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.16 How to Re-enable After Sleep()? Administrivia • In scheduler, since interrupts are disabled when you call • Midterm Thursday 2/28 sleep: – No class on day of midterm – Responsibility of the next thread to re-enable ints – 8-10PM – no conflict with data science! – When the sleeping thread wakes up, returns to acquire and • Project 1 Design Document due next Wednesday 2/20 re-enables interrupts Thread A Thread B • Project 1 Design reviews upcoming . – High-level discussion of your approach . » What will you modify? disable ints » What algorithm will you use? sleep » How will things be linked together, etc. sleep return enable ints » Do not need final design (complete with all semicolons!) . – You will be asked about testing . » Understand testing framework . » Are there things you are doing that are not tested by tests we give disable int you? sleep • Do your own work! sleep return enable ints – Please do not try to find solutions from previous terms . – We will be on the look out for anyone doing this…today . 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.17 2/14/19 Kubiatowicz CS162 ©UCB Spring 2019 Lec 8.18 Atomic Read-Modify-Write Instructions Examples of Read-Modify-Write
Recommended publications
  • Synchronization Spinlocks - Semaphores
    CS 4410 Operating Systems Synchronization Spinlocks - Semaphores Summer 2013 Cornell University 1 Today ● How can I synchronize the execution of multiple threads of the same process? ● Example ● Race condition ● Critical-Section Problem ● Spinlocks ● Semaphors ● Usage 2 Problem Context ● Multiple threads of the same process have: ● Private registers and stack memory ● Shared access to the remainder of the process “state” ● Preemptive CPU Scheduling: ● The execution of a thread is interrupted unexpectedly. ● Multiple cores executing multiple threads of the same process. 3 Share Counting ● Mr Skroutz wants to count his $1-bills. ● Initially, he uses one thread that increases a variable bills_counter for every $1-bill. ● Then he thought to accelerate the counting by using two threads and keeping the variable bills_counter shared. 4 Share Counting bills_counter = 0 ● Thread A ● Thread B while (machine_A_has_bills) while (machine_B_has_bills) bills_counter++ bills_counter++ print bills_counter ● What it might go wrong? 5 Share Counting ● Thread A ● Thread B r1 = bills_counter r2 = bills_counter r1 = r1 +1 r2 = r2 +1 bills_counter = r1 bills_counter = r2 ● If bills_counter = 42, what are its possible values after the execution of one A/B loop ? 6 Shared counters ● One possible result: everything works! ● Another possible result: lost update! ● Called a “race condition”. 7 Race conditions ● Def: a timing dependent error involving shared state ● It depends on how threads are scheduled. ● Hard to detect 8 Critical-Section Problem bills_counter = 0 ● Thread A ● Thread B while (my_machine_has_bills) while (my_machine_has_bills) – enter critical section – enter critical section bills_counter++ bills_counter++ – exit critical section – exit critical section print bills_counter 9 Critical-Section Problem ● The solution should ● enter section satisfy: ● critical section ● Mutual exclusion ● exit section ● Progress ● remainder section ● Bounded waiting 10 General Solution ● LOCK ● A process must acquire a lock to enter a critical section.
    [Show full text]
  • Synchronization: Locks
    Last Class: Threads • Thread: a single execution stream within a process • Generalizes the idea of a process • Shared address space within a process • User level threads: user library, no kernel context switches • Kernel level threads: kernel support, parallelism • Same scheduling strategies can be used as for (single-threaded) processes – FCFS, RR, SJF, MLFQ, Lottery... Computer Science CS377: Operating Systems Lecture 5, page 1 Today: Synchronization • Synchronization – Mutual exclusion – Critical sections • Example: Too Much Milk • Locks • Synchronization primitives are required to ensure that only one thread executes in a critical section at a time. Computer Science CS377: Operating Systems Lecture 7, page 2 Recap: Synchronization •What kind of knowledge and mechanisms do we need to get independent processes to communicate and get a consistent view of the world (computer state)? •Example: Too Much Milk Time You Your roommate 3:00 Arrive home 3:05 Look in fridge, no milk 3:10 Leave for grocery store 3:15 Arrive home 3:20 Arrive at grocery store Look in fridge, no milk 3:25 Buy milk Leave for grocery store 3:35 Arrive home, put milk in fridge 3:45 Buy milk 3:50 Arrive home, put up milk 3:50 Oh no! Computer Science CS377: Operating Systems Lecture 7, page 3 Recap: Synchronization Terminology • Synchronization: use of atomic operations to ensure cooperation between threads • Mutual Exclusion: ensure that only one thread does a particular activity at a time and excludes other threads from doing it at that time • Critical Section: piece of code that only one thread can execute at a time • Lock: mechanism to prevent another process from doing something – Lock before entering a critical section, or before accessing shared data.
    [Show full text]
  • INF4140 - Models of Concurrency Locks & Barriers, Lecture 2
    Locks & barriers INF4140 - Models of concurrency Locks & barriers, lecture 2 Høsten 2015 31. 08. 2015 2 / 46 Practical Stuff Mandatory assignment 1 (“oblig”) Deadline: Friday September 25 at 18.00 Online delivery (Devilry): https://devilry.ifi.uio.no 3 / 46 Introduction Central to the course are general mechanisms and issues related to parallel programs Previously: await language and a simple version of the producer/consumer example Today Entry- and exit protocols to critical sections Protect reading and writing to shared variables Barriers Iterative algorithms: Processes must synchronize between each iteration Coordination using flags 4 / 46 Remember: await-example: Producer/Consumer 1 2 i n t buf, p := 0; c := 0; 3 4 process Producer { process Consumer { 5 i n t a [N ] ; . i n t b [N ] ; . 6 w h i l e ( p < N) { w h i l e ( c < N) { 7 < await ( p = c ) ; > < await ( p > c ) ; > 8 buf:=a[p]; b[c]:=buf; 9 p:=p+1; c:=c+1; 10 }} 11 }} Invariants An invariant holds in all states in all histories of the program. global invariant: c ≤ p ≤ c + 1 local (in the producer): 0 ≤ p ≤ N 5 / 46 Critical section Fundamental concept for concurrency Critical section: part of a program that is/needs to be “protected” against interference by other processes Execution under mutual exclusion Related to “atomicity” Main question today: How can we implement critical sections / conditional critical sections? Various solutions and properties/guarantees Using locks and low-level operations SW-only solutions? HW or OS support? Active waiting (later semaphores and passive waiting) 6 / 46 Access to Critical Section (CS) Several processes compete for access to a shared resource Only one process can have access at a time: “mutual exclusion” (mutex) Possible examples: Execution of bank transactions Access to a printer or other resources ..
    [Show full text]
  • Spinlock Vs. Sleeping Lock Spinlock Implementation(1)
    Semaphores EECS 3221.3 • Problems with the software solutions. Operating System Fundamentals – Complicated programming, not flexible to use. – Not easy to generalize to more complex synchronization problems. No.6 • Semaphore (a.k.a. lock): an easy-to-use synchronization tool – An integer variable S Process Synchronization(2) – wait(S) { while (S<=0) ; S-- ; Prof. Hui Jiang } Dept of Electrical Engineering and Computer – signal(S) { Science, York University S++ ; } Semaphore usage (1): Semaphore usage (2): the n-process critical-section problem as a General Synchronization Tool • The n processes share a semaphore, Semaphore mutex ; // mutex is initialized to 1. • Execute B in Pj only after A executed in Pi • Use semaphore flag initialized to 0 Process Pi do { " wait(mutex);! Pi Pj " critical section of Pi! ! … … signal(mutex);" A wait (flag) ; signal (flag) ; B remainder section of Pi ! … … ! } while (1);" " " Spinlock vs. Sleeping Lock Spinlock Implementation(1) • In uni-processor machine, disabling interrupt before modifying • Previous definition of semaphore requires busy waiting. semaphore. – It is called spinlock. – spinlock does not need context switch, but waste CPU cycles wait(S) { in a continuous loop. do { – spinlock is OK only for lock waiting is very short. Disable_Interrupt; signal(S) { • Semaphore without busy-waiting, called sleeping lock: if(S>0) { S-- ; Disable_Interrupt ; – In defining wait(), rather than busy-waiting, the process makes Enable_Interrupt ; S++ ; system calls to block itself and switch to waiting state, and return ; Enable_Interrupt ; put the process to a waiting queue associated with the } return ; semaphore. The control is transferred to CPU scheduler. Enable_Interrupt ; } – In defining signal(), the process makes system calls to pick a } while(1) ; process in the waiting queue of the semaphore, wake it up by } moving it to the ready queue to wait for CPU scheduling.
    [Show full text]
  • Processes and Threads
    Interprocess Communication Yücel Saygın |These slides are based on your text book and on the slides prepared by Andrew S. Tanenbaum 1 Inter-process Communication • Race Conditions: two or more processes are reading and writing on shared data and the final result depends on who runs precisely when • Mutual exclusion : making sure that if one process is accessing a shared memory, the other will be excluded form doing the same thing • Critical region: the part of the program where shared variables are accessed 2 Interprocess Communication Race Conditions Two processes want to access shared memory at same time 3 Critical Regions (1) Four conditions to provide mutual exclusion 1. No two processes simultaneously in critical region 2. No assumptions made about speeds or numbers of CPUs 3. No process running outside its critical region may block another process 4. No process must wait forever to enter its critical region 4 Critical Regions (2) Mutual exclusion using critical regions 5 Mutual Exclusion via Disabling Interrupts • Process disables all interrupts before entering its critical region • Enables all interrupts just before leaving its critical region • CPU is switched from one process to another only via clock or other interrupts • So disabling interrupts guarantees that there will be no process switch • Disadvantage: – Should give the power to control interrupts to user (what if a user turns off the interrupts and never turns them on again?) – Does not work in case of multiple CPUs. Only the CPU that executes the disable instruction is effected. • Not suitable approach for the general case but can be used by the Kernel when needed 6 Mutual Exclusion with Busy Waiting: (1)Lock Variables • Testing a variable until some value appears is called busy waiting.
    [Show full text]
  • Semaphores (Dijkstra 1965)
    Semaphores (Dijkstra 1965) n Semaphores have a non-negative integer value, and support two operations: n semaphore->P(): an atomic operation that waits for semaphore Semaphores & Monitors to become positive, then decrements it by 1 n semaphore->V(): an atomic operation that increments semaphore by 1, waking up a waiting P, if any. n Semaphores are like integers except: Arvind Krishnamurthy (1) non-negative values; Spring 2004 (2) only allow P&V --- can’t read/write value except to set it initially; (3) operations must be atomic: -- two P’s that occur together can’t decrement the value below zero. -- thread going to sleep in P won’t miss wakeup from V, even if they both happen at about the same time. Implementing semaphores Using interrupts P means “test” (proberen in Dutch) V means “increment” (verhogen in Dutch) class Semaphore { int value = 0; } n Binary semaphores: Semaphore::P() { n Like a lock; can only have value 0 or 1 (unlike the previous Disable interrupts; Semaphore::V() { “counting semaphore” which can be any non-negative integers) while (value == 0) { Disable interrupts; Enable interrupts; value++; Disable interrupts; Enable interrupts; } } n How to implement semaphores? Standard tricks: value = value - 1; Enable interrupts; n Can be built using interrupts disable/enable } n Or using test-and-set n Use a queue to prevent unnecessary busy-waiting n Question: Can we build semaphores using just locks? Using test&set How to use semaphores n Binary semaphores can be used for mutual exclusion: class Semaphore { int value = 0; initial value of 1; P() is called before the critical section; and V() is called after the int guard = 0; } critical section.
    [Show full text]
  • 9 Mutual Exclusion
    System Architecture 9 Mutual Exclusion Critical Section & Critical Region Busy-Waiting versus Blocking Lock, Semaphore, Monitor November 24 2008 Winter Term 2008/09 Gerd Liefländer © 2008 Universität Karlsruhe (TH), System Architecture Group 1 Overview Agenda HW Precondition Mutual Exclusion Problem Critical Regions Critical Sections Requirements for valid solutions Implementation levels User-level approaches HW support Kernel support Semaphores Monitors © 2008 Universität Karlsruhe (TH), System Architecture Group 2 Overview Literature Bacon, J.: Operating Systems (9, 10, 11) Nehmer,J.: Grundlagen moderner BS (6, 7, 8) Silberschatz, A.: Operating System Concepts (4, 6, 7) Stallings, W.: Operating Systems (5, 6) Tanenbaum, A.: Modern Operating Systems (2) Research papers on various locks © 2008 Universität Karlsruhe (TH), System Architecture Group 3 Atomic Instructions To understand concurrency, we need to know what the underlying indivisible HW instructions are Atomic instructions run to completion or not at all It is indivisible: it cannot be stopped in the middle and its state cannot be modified by someone else in the middle Fundamental building block: without atomic instructions we have no way for threads to work together properly load, store of words are usually atomic However, some instructions are not atomic VAX and IBM 360 had an instruction to copy a whole array © 2008 Universität Karlsruhe (TH), System Architecture Group 4 Mutual Exclusion © 2008 Universität Karlsruhe (TH), System Architecture Group 5 Mutual Exclusion Problem Assume at least two concurrent activities 1. Access to a physical or to a logical resource or to shared data has to be done exclusively 2. A program section of an activity, that has to be executed indivisibly and exclusively is called critical section CS1 3.
    [Show full text]
  • Models of Concurrency & Synchronization Algorithms
    Models of concurrency & synchronization algorithms Lecture 3 of TDA384/DIT391 Principles of Concurrent Programming Nir Piterman Chalmers University of Technology | University of Gothenburg SP1 2021/2022 Models of concurrency & synchronization algorithms Today's menu • Modeling concurrency • Mutual exclusion with only atomic reads and writes • Three failed attempts • Peterson’s algorithm • Mutual exclusion with strong fairness • Implementing mutual exclusion algorithms in Java • Implementing semaphores Modeling concurrency State/transition diagrams We capture the essential elements of concurrent programs using state/transition diagrams (also called: (finite) state automata, (finite) state machines, or transition systems). • states in a diagram capture possible program states • transitions connect states according to execution order Structural properties of a diagram capture semantic properties of the corresponding program. States A state captures the shared and local states of a concurrent program: States A state captures the shared and local states of a concurrent program: When unambiguous, we simplify a state with only the essential information: Initial states The initial state of a computation is marked with an incoming arrow: Final states The final states of a computation – where the program terminates – are marked with double-line edges: Transitions A transition corresponds to the execution of one atomic instruction, and it is an arrow connecting two states (or a state to itself): A complete state/transition diagram The complete state/transition diagram for the concurrent counter example explicitly shows all possible interleavings: State/transition diagram with locks? The state/transition diagram of the concurrent counter example using locks should contain no (states representing) race conditions: Locking Locking and unlocking are considered atomic operations.
    [Show full text]
  • Preview – Interprocess Communication
    Preview – Interprocess Communication Race Condition Mutual Exclusion with Busy Waiting Disabling Interrupts Lock Variables Strict Alternation Peterson’s Solution Test and Set Lock – help from hardware Sleep and Wakeup The Producer-Consumer Problem Race Condition in Producer-Consumer Problem Semaphores The producer-consumer problem using semaphores Mutexes Monitors CS 431 Operating Systems 1 Interprocess Communication Critical section (critical region) – The part of program where the shared memory is accessed. Three issues in InterProcess Communication (IPC) 1. How one process can pass information to another 2. How to make sure two or more processes do not get into the critical region at the same time 3. Proper sequencing when dependencies are present (e.g. A creates outputs, B consumes the outputs) CS 431 Operating Systems 2 Race Condition A situation where two or more processes are reading or writing some shared data and the final result depends on who runs precisely when, is called race condition. Network Printer Spooler Directory CS 431 Operating Systems 3 Race Condition Process B will never Process A tries to send a job to receive any output from spooler, Process A reads the printer !! in = 7, process A times out and goes to “ready” state before updating in = in + 1. CPU switches to Process B. Process B also tries to send a job to spooler. Process B reads in = 7, writes its job name in slot 7, updates i to 8 and then goes to “ready” state. CPU switches to Process A. Process A starts from the place it left off. Process writes its job name in slot 7, update i to 8.
    [Show full text]
  • Pthreads: Busy Wait, Mutexes, Semaphores, CondiOns, and Barriers Bryan Mills Chapter 4.2-4.8
    Pthreads: Busy Wait, Mutexes, Semaphores, Condi9ons, and Barriers Bryan Mills Chapter 4.2-4.8 Spring 2017 A Shared Memory System Copyright © 2010, Elsevier Inc. All rights Reserved Pthreads • Pthreads is a POSIX standard for describing a thread model, it specifies the API and the seman9cs of the calls. • Model popular –prac9cally all major thread libraries on Unix systems are Pthreads- compable • The Pthreads API is only available on POSIXR systems — Linux, MacOS X, Solaris, HPUX, … Preliminaries • Include pthread.h in the main file • Compile program with –lpthread – gcc –o test test.c –lpthread – may not report compilaon errors otherwise but calls will fail • Check return values on common func9ons Include #include <stdio.h> #include <pthread.h> This includes the pthreads library. #define NUM_THREADS 10 void *hello (void *rank) { printf("Hello Thread”); } int main() { pthread_t ids[NUM_THREADS]; for (int i=0; i < NUM_THREADS; i++) { pthread_create(&ids[i], NULL, hello, &i); } for (int i=0; i < NUM_THREADS; i++) { pthread_join(ids[i], NULL); } } C Libraries • Libraries are created from many source files, and are either built as: – Archive files (libmine.a) that are stacally linked. – Shared object files (libmine.so) that are dynamically linked • Link libraries using the gcc command line op9ons -L for the path to the library files and -l to link in a library (a .so or a .a): gcc -o myprog myprog.c -L/home/bnm/lib –lmine • You may also need to specify the library path: -I /home/bnm/include Run9me Linker • Libraries that are dynamically linked need to be able to find the shared object (.so) • LD_LIBRARY_PATH environment variable is used to tell the system where to find these files.
    [Show full text]
  • Chapter 12 (Concurrency) of Programming Language Pragmatics
    Contents 12 Concurrency 1 12.1BackgroundandMotivation........................... 2 12.1.1ALittleHistory............................. 2 12.1.2TheCaseforMulti-ThreadedPrograms................ 4 12.1.3MultiprocessorArchitecture....................... 8 12.2 Concurrent Programming Fundamentals . 11 12.2.1CommunicationandSynchronization.................. 12 12.2.2LanguagesandLibraries......................... 13 12.2.3ThreadCreationSyntax......................... 14 12.2.4ImplementationofThreads....................... 22 12.3SharedMemory.................................. 26 12.3.1Busy-WaitSynchronization....................... 27 12.3.2SchedulerImplementation........................ 30 12.3.3Scheduler-BasedSynchronization.................... 33 12.3.4ImplicitSynchronization......................... 41 12.4MessagePassing................................. 43 12.4.1NamingCommunicationPartners.................... 43 12.4.2Sending.................................. 47 12.4.3 Receiving . 50 12.4.4 RemoteProcedureCall......................... 56 SummaryandConcludingRemarks.......................... 58 ReviewQuestions.................................... 60 Exercises........................................ 61 BibliographicNotes.................................. 66 From Programming Language Pragmatics, by Michael L. Scott. Copyright c 2000, Morgan Kaufmann Publishers; all rights reserved. This material may not be copied or distributed without permission of the publisher. i Chapter 12 Concurrency The bulk of this text has focused, implicitly, on sequential
    [Show full text]
  • Semaphores and Other Wait-And-Signal Mechanisms
    Semaphores and other Wait-and-Signal mechanisms Carsten Griwodz University of Oslo (including slides by Otto Anshus and Kai Li) Critical Regions Four conditions to provide mutual exclusion 1. No two threads simultaneously in critical region 2. No assumptions made about speeds or numbers of CPUs 3. No thread running outside its critical region may block another thread 4. No thread must wait forever to enter its critical region Critical Regions Mutual exclusion using critical regions Recall Processes and Threads • Process • Thread – Address space – Program counter – Program text and data – Registers – Open files – Stack – Child process IDs – Alarms – Signal handlers – Accounting information • Implemented in kernel or in user space • Implemented in kernel • Threads are the scheduled entities Producer-Consumer Problem • Main problem description – Two threads – Different actions in the critical region – The consumer can not enter the CR more often than the producer • Two sub-problems – Unbounded PCP: the producer can enter the CR as often as it wants – Bounded PCP: the producer can enter the CR only N times more often than the consumer Unbounded PCP Q PUT (msg) GET (buf) Rules for the queue Q: •No Get when empty Consumer Producer •Q shared, so must have mutex between Put and Get Recall Mutexes • Can be acquired and released – Only one thread can hold one mutex at a time – A second thread trying to acquire must wait • Mutexes – Can be implemented using busy waiting – Simpler with advanced atomic operations • Disable interrupts, TSL, XCHG, …
    [Show full text]