Operating systems
Locks
Prashanth L.A.
2023-10-09
Lecture 28
What are locks
- Want: critical section executes as if it were
a single atomic instruction
- Solution: Add locks around critical section
The basic idea
balance = balance + 1;
1 lock_t mutex; // some globally-allocated lock ’mutex’
2 ...
3 lock(&mutex);
4 balance = balance + 1;
5 unlock(&mutex);
Lock variable
- available (or unlocked or
free): No thread holds the lock
- acquired (or locked or
held): Exactly one thread holds the lock and presumably
is in a critical section
Semantics
- Call lock() to acquire the lock
- If no other thread holds the lock, the thread will
acquire the lock and enter the critical
section \(\Leftarrow\) Owner
thread
- Other threads cannot enter the critical section
- Owner calls unlock(), one of the waiting threads will acquire the
lock
Pthread Locks
1 pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
2
3 Pthread_mutex_lock(&lock); // wrapper; exits on failure
4 balance = balance + 1;
5 Pthread_mutex_unlock(&lock);
Note: different locks to protect different variables
The crux
How can we build an efficient lock?
Efficient locks provide mutual exclusion at low cost, and also might attain a few other properties we discuss below.
What hardware support is needed?
What OS support?
Evaluating locks
Mutual exclusion
- Does the lock prevent multiple threads from entering a critical
section?
Fairness
- Does each thread contending for the lock get a fair shot at
acquiring it once it is free?
- Does any thread contending for the lock starve while doing so, thus
never obtaining it?
- The time overheads added by using the lock
Mutual exclusion by controlling interrupts
- Disable Interrupts for critical sections
void lock() {
DisableInterrupts();
}
void unlock() {
EnableInterrupts();
}
Problems? (poll)
- cannot trust programs
- does not work on multi-processors
First attempt: A simple flag
typedef struct __lock_t { int flag; } lock_t;
void init(lock_t *mutex) {
// 0 -> lock is available, 1 -> held
mutex->flag = 0;
}
void lock(lock_t *mutex) {
while (mutex->flag == 1) // __TEST__ the flag
; // spin-wait (do nothing)
mutex->flag = 1; // now __SET__ it !
}
void unlock(lock_t *mutex) {
mutex->flag = 0;
}
Does this code ensure mutual exclusion?
Problems with first attempt
![](data:image/jpeg;base64,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)
Any other problems?
- Spin-wait wastes time waiting for another thread
Lecture 29
Solution: Test and set (with HW support)
- An atomic instruction to support the creation of
simple locks
int TestAndSet(int *old_ptr, int new) {
int old = *old_ptr; // fetch old value at old_ptr
*old_ptr = new; // store ’new’ into old_ptr
return old; // return the old value
}
return the old value pointed to by the old ptr, and
simultaneously update said value to new
Test and set is atomic
Build a spin lock with test-and-set
typedef struct __lock_t {
// whatever data structs you need goes here
} lock_t;
void init(lock_t *lock) { // init code goes here
}
void lock(lock_t *lock) {
// lock acquire code goes here
}
void unlock(lock_t *lock) {
// lock release code goes here
}
A Simple Spin Lock using test-and-set
typedef struct __lock_t {
int flag;
} lock_t;
void init(lock_t *lock) {
// 0: lock is available, 1: lock is held
lock->flag = 0;
}
void lock(lock_t *lock) {
while (TestAndSet(&lock->flag, 1) == 1)
; // spin-wait (do nothing)
}
void unlock(lock_t *lock) {
lock->flag = 0;
}
Evaluating Spin Locks
Correctness
- The spin lock only allows a single thread to entry the critical
section
Fairness
- Spin locks don’t provide any fairness guarantees
- Single CPU: high performance overhead
- Multiple CPUs: If #threads roughly equals #CPUs, spin locks work
reasonably well
Compare-And-Swap
- Test whether the value at *addr is equal to expected
- If yes, updatethe memory location pointed to by ptr with the new
value, else do nothing
- In either case, return the old value at that memory
location
int CompareAndSwap(int *addr, int expected, int new) {
int old = *addr;
if (old == expected)
*addr = new;
return old;
}
Build a spin lock with compare-and-swap
typedef struct __lock_t {
// whatever data structs you need goes here
} lock_t;
void init(lock_t *lock) { // init code goes here
}
void lock(lock_t *lock) {
// lock acquire code goes here
}
void unlock(lock_t *lock) {
// lock release code goes here
}
Compare-and-swap based lock
void lock(lock_t *lock) {
while ( CompareAndSwap(&lock->flag, 0, 1) == 1)
; // spin
}
Load-Linked and Store-Conditional
- The store-conditional only succeeds if no intermittent
store to the address has taken place
- success : return 1 and update the value at
ptr to value
- fail : the value at ptr is not updates and
0 is returned
int LoadLinked(int *ptr) {
return *ptr;
}
int StoreConditional(int *ptr, int value) {
if (no one has updated *ptr since the LoadLinked to this address) {
*ptr = value;
return 1; // success!
} else {
return 0; // failed to update
}
}
Build a spin lock with Load-Linked and Store-Conditional
typedef struct __lock_t {
// whatever data structs you need goes here
} lock_t;
void init(lock_t *lock) { // init code goes here
}
void lock(lock_t *lock) {
// lock acquire code goes here
}
void unlock(lock_t *lock) {
// lock release code goes here
}
Spin-ock with LL/SC
void lock(lock_t *lock) {
while (1) {
while (LoadLinked(&lock->flag) == 1)
; // spin until it’s zero
if (StoreConditional(&lock->flag, 1) == 1)
return; // if set-it-to-1 was a success: all done
// otherwise: try it all over again
}
}
void unlock(lock_t *lock) {
lock->flag = 0;
}
Lecture 30
Problems (poll)
- Too much spinning: What happens when one thread
grabs a lock but is interrupted, and there are many other threads
sitting there trying to spin and grab the lock?
- Fairness as a problem: a thread could spin forever
even as other threads acquire and release the lock.
- Priority inversion: can you think of a scenario
where two threads with \(T2>T1\) (T2
is schedued first), and \(T2\) runs
ahead of \(T1\)
- Avoiding spin-locks won’t solve the problem: can you think of a
scenario where three threads with \(T3>T2>T1\), and \(T2\) runs ahead of \(T3\)
- How to fix priority inversion?
Fetch-And-Add
Atomically increment a value while returning the old value
at a particular address
int FetchAndAdd(int *ptr) {
int old = *ptr;
*ptr = old \+ 1;
return old;
}
Ticket Lock using fetch-and-add
typedef struct __lock_t {
int ticket;
int turn;
} lock_t;
void lock_init(lock_t *lock) {
lock->ticket = 0;
lock->turn = 0;
}
void lock(lock_t *lock) {
int myturn = FetchAndAdd(&lock->ticket);
while (lock->turn != myturn)
; // spin
}
void unlock(lock_t *lock) {
FetchAndAdd(&lock->turn);
}
Why is ticket lock better than test-and-set?
So Much Spinning
- HW-based locks are simple and ensure mutual
exclusion
- However, they are inefficient, e.g., a thread may
spin and waste an entire time slice
To avoid spinning, OS needs to do some work
A Simple Approach: Just Yield
- When you are going to spin, give up the CPU to another
thread
- OS system call moves the caller from the running state to
the ready state
void init() {
flag = 0;
}
void lock() {
while (TestAndSet(&flag, 1) == 1)
yield(); // give up the CPU
}
void unlock() {
flag = 0;
}
- Problems
- Context switch cost
- Starvation
Using Queues: Sleeping Instead of Spinning
- Queue to keep track of which threads are
waiting to enter the lock
Solaris solution
park() // Put a calling thread to sleep
unpark(threadID) //Wake a particular thread as designated by threadID
typedef struct __lock_t {
int flag;
int guard;
queue_t * q;
}
lock_t;
void lock_init(lock_t * m) {
m -> flag = 0;
m -> guard = 0;
queue_init(m -> q);
}
void lock(lock_t * m) {
while (TestAndSet( & m -> guard, 1) == 1)
; //acquire guard lock by spinning
if (m -> flag == 0) {
m -> flag = 1; // lock is acquired
m -> guard = 0;
} else {
queue_add(m -> q, gettid());
m -> guard = 0;
park();
}
}
void unlock(lock_t * m) {
while (TestAndSet( & m -> guard, 1) == 1)
; //acquire guard lock by spinning
if (queue_empty(m -> q))
m -> flag = 0; // let go of lock; no one wants it
else
unpark(queue_remove(m -> q)); // hold lock (for next thread!)
m -> guard = 0;
}
Lecture 31
Wakeup/waiting race
- In case of releasing the lock ( thread A ) just before the
call to park() ( thread B ) Thread B would sleep forever
(potentially)
Solaris solution: setpark()
- By calling this routine, a thread can indicate it is about
to park
- If it happens to be interrupted and another thread calls unpark
before park is actually called, the subsequent park returns immediately
instead of sleeping
// lock() code changed bit
queue_add(m->q, gettid());
setpark(); // new code
m->guard = 0;
Other stuff
Linux-based Futex Locks
- Linux provides a futex (is similar to Solaris’s park and
unpark)
- futex_wait(.,.) and futex_wake(.): read these bits on your own
Two-Phase Locks
- A two-phase lock realizes that spinning can be useful if
the lock is about to be released
- In the first phase, the lock spins for a while, hoping that it can
acquire the lock.
- If the lock is not acquired during the first spin phase, a sec- ond
phase is entered, where the caller is put to sleep, and only woken up
when the lock becomes free later.
Data structures with locks
Lock-based Concurrent Data structure
- Add locks to a data structure
- Ensure thread safety .
The crux
When given a particular data structure, how should we add locks to it, in order to make it work correctly?
How do we add locks such that the data structure yields high performance, enabling many threads concurrent access?
Example: Concurrent Counters without Locks
typedef struct __counter_t {
int value;
} counter_t;
void init(counter_t *c) {
c->value = 0;
}
void increment(counter_t *c) {
c->value++;
}
void decrement(counter_t *c) {
c->value--;
}
int get(counter_t *c) {
return c->value;
}
Simple but not scalable
Counter with locks
typedef struct __counter_t {
int value;
pthread_lock_t lock;
}
counter_t;
void init(counter_t * c) {
c -> value = 0;
Pthread_mutex_init( & c -> lock, NULL);
}
void increment(counter_t * c) {
Pthread_mutex_lock( & c -> lock);
c -> value++;
Pthread_mutex_unlock( & c -> lock);
}
Sloppy counter
- Many local counters, one per CPU
- A single global counter
How to count sloppily?
- A thread running on a core increments its local counter.
- The local values are periodically transferred to the global
counter.
- How often the local-to-global transfer occurs? Use a
threshold \(S\)
- Think about small vs. big values for \(S\)
Access control
Sloppy counter example
![](data:image/jpeg;base64,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)
Choosing sloppiness parameter
S
![](data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QBARXhpZgAATU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAACLKADAAQAAAABAAABmQAAAAD/4gJASUNDX1BST0ZJTEUAAQEAAAIwQURCRQIQAABtbnRyUkdCIFhZWiAH0AAIAAsAEwAzADthY3NwQVBQTAAAAABub25lAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUFEQkUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApjcHJ0AAAA/AAAADJkZXNjAAABMAAAAGt3dHB0AAABnAAAABRia3B0AAABsAAAABRyVFJDAAABxAAAAA5nVFJDAAAB1AAAAA5iVFJDAAAB5AAAAA5yWFlaAAAB9AAAABRnWFlaAAACCAAAABRiWFlaAAACHAAAABR0ZXh0AAAAAENvcHlyaWdodCAyMDAwIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkAAAAZGVzYwAAAAAAAAARQWRvYmUgUkdCICgxOTk4KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAGN1cnYAAAAAAAAAAQIzAABjdXJ2AAAAAAAAAAECMwAAY3VydgAAAAAAAAABAjMAAFhZWiAAAAAAAACcGAAAT6UAAAT8WFlaIAAAAAAAADSNAACgLAAAD5VYWVogAAAAAAAAJjEAABAvAAC+nP/AABEIAZkCLAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2wBDAAICAgICAgMCAgMFAwMDBQYFBQUFBggGBgYGBggKCAgICAgICgoKCgoKCgoMDAwMDAwODg4ODg8PDw8PDw8PDw//2wBDAQICAgQEBAcEBAcQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/3QAEACP/2gAMAwEAAhEDEQA/AP38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/0P38ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/0f38ooooAKKKKACiiigAooooAK/P/wD4KG6/+0j4a+BPivWfg3e6HpHhy10iZtYvbma7j1qNGbYy6cIUMKsyHG93DLk7cEBh+gFfLf7bPh7X/Ff7KPxO8OeF9NudY1a/0iWK2s7OF7i4nkLLhY4owzu3soJoA8M/bG+IWs+CP+CeN94l0/V7jTtZvtG0G1ivY5ZEnWS8ltUlkEiHzN3ls7Ejk815f+ywP2Urv406PB4G+JfxBufF1nBPdWGl+LL/AFCC21SB4XieWG3vIkW4VUZpFUHcNu/bhSR9T/FO/wDiR4K/Zj8Mar4M+Htv8QNV0K20aS/8P3sBkuHtYYkFx9mhIybuI4KKVJ4YBS2AfnLXvHl7+1/8ePgnffDDwP4j0PT/AIcavNrms67rulyaWlrD5BjOnRNLkyyXDYWVUyAApyRkqAfpV4s8XeHPA2iTeI/Fd8mnabbsiyTOGKqZGCqMKCeSQOlec6B+0V8FfFGv6f4X0HxXbXeqarI0NrAFlVpZFjeUqpZAMhEZuvQV7TXgPxs/5Gz4N/8AY5j/ANMuq0Ae/UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAf/0v38ooooAKKKKACiiigAooooAKKKKACiiigArwH42f8AI2fBv/scx/6ZdVr36vAfjZ/yNnwb/wCxzH/pl1WgD36iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9P9/KKKKACiiigAooooAKKKKACiiigAooooAK8B+Nn/ACNnwb/7HMf+mXVa9+rwH42f8jZ8G/8Ascx/6ZdVoA9+ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//U/fyiiigAooooAKKKKACiiigAooooAKKKKACvAfjZ/wAjZ8G/+xzH/pl1Wvfq8B+Nn/I2fBv/ALHMf+mXVaAPfqKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/1f38ooooAKKKKACiiigAooooAKKKKACiiigAr5l+LHiXQdb8bfC+w0q+iubrRPHS2t9ErfvLaY6DqUoSRTypaN1dc8MrBhkE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+zPFp+meIr/SdR1D9oCXTob+CdxcWyS6hJGhjYk8RkhlU5XIHFfoj4A/Ys0Pwz8RvD/xI8efEHxP8SbvwWkkfh628QXUU1vpplTyzNtjij82faMCV8noSCyqy9An7G3wwTwja+DBqesfYrPxuPHqP59v5p1QXBufKJ+z7fs2842bRJj/AJaZ5oA+YJfhP4T/AGWv2z/hRbfCFtTs9M8eaH4n/tyxm1G6vk1CXSLWKeCZ/tUshMzM3LDHTgDLZ+GfA2ieMPjf8EtQ+POu/Dz4ga98W/EJ1HU9L8b6XrENrp+myRyyLbRWsTajGI7SHywkqtDuA3hSAFI/d/xT8G/DHi74s+BvjHqVzeR614Ah1SCwhieMWsi6vEkM5nVo2diqxjZsdMHOQ3QfKGsf8E8fBl4useFdA+Inizw58NfEN3Je3/hCwvIk0x3mffLFCzRNLDbyty8SsQcnBHGAD5c+M/g74wfFDWvhX4/+OfgHV/ir4Mh8D2a674X8N6sLW9svEUrb5tRNnbTxNcrImFjEb7R6gKN632jaz8UP2MtF8F/s5eJPEHjLT9B8aCDW/D2t3v8AYfiJ9Ltt0l14dM8r5EkQkjwAx+ThSSoQ/cnxG/Y38PeJPGGjfEH4X+Mdb+FfiHR9Gh8PCbQXiEM+k25zDbywTo6t5XRGyCMDOdq452T9gP4VD4V2/wAPrPxBr9trlt4hbxavilbxTrZ19xte8aYpsJZcKU2YwAfv/PQB5H+w/J8JPC/xc8YeA/Amn+L/AIZ6jcaXb303gDxSszwQCKQRPqWnzzTTmRHZhG53jcccYUbf1Fr5U+DH7K+m/C74g6j8X/FfjPW/iL461HT10kanrUkX+jaeJBMbe2hhREjVpAGY8nPTGW3fVdABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH/9f9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9D9/KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9k=)
Non-concurrent linked list
typedef struct __node_t {
int key;
struct __node_t *next;
} node_t;
typedef struct __list_t {
node_t *head;
} list_t;
void List_Init(list_t *L) {
L->head = NULL;
}
void List_Insert(list_t *L, int key) {
node_t *new = malloc(sizeof(node_t));
if (new == NULL) { perror("malloc"); return; }
new->key = key;
new->next = L->head;
L->head = new;
}
int List_Lookup(list_t *L, int key) {
node_t *tmp = L->head;
while (tmp) {
if (tmp->key == key)
return 1;
tmp = tmp->next;
}
return 0;
}
void List_Print(list_t *L) {
node_t *tmp = L->head;
while (tmp) {
printf("%d ", tmp->key);
tmp = tmp->next;
}
printf("\n");
}
int
main(int argc, char *argv[])
{
list_t mylist;
List_Init(&mylist);
List_Insert(&mylist, 10);
List_Insert(&mylist, 30);
List_Insert(&mylist, 5);
List_Print(&mylist);
printf("In List: 10? %d 20? %d\n",
List_Lookup(&mylist, 10), List_Lookup(&mylist, 20));
return 0;
}
Concurrent linked list with locks
void List_Insert(list_t *L, int key) {
pthread_mutex_lock(&L->lock);
node_t *new = malloc(sizeof(node_t));
if (new == NULL) { perror("malloc"); pthread_mutex_unlock(&L->lock); return; }
new->key = key;
new->next = L->head;
L->head = new;
pthread_mutex_unlock(&L->lock);
}
int List_Lookup(list_t *L, int key) {
pthread_mutex_lock(&L->lock);
node_t *curr = L->head;
while (curr) {
if (curr->key == key){
pthread_mutex_unlock(&L->lock);
return 1;
}
curr = curr->next;
}
pthread_mutex_unlock(&L->lock);
return 0;
}
Improvement: lock only the necessary code segments
void List_Insert(list_t *L, int key) {
// synchronization not needed
node_t *new = malloc(sizeof(node_t));
if (new == NULL) {
perror("malloc");
return; }
new->key = key;
// just lock critical section
pthread_mutex_lock(&L->lock);
new->next = L->head;
L->head = new;
pthread_mutex_unlock(&L->lock);
}
int List_Lookup(list_t *L, int key) {
int rv = -1;
pthread_mutex_lock(&L->lock);
node_t *curr = L->head;
while (curr) {
if (curr->key == key) {
rv = 0;
break; }
curr = curr->next;
}
pthread_mutex_unlock(&L->lock);
return rv; // now both success and failure
}
A better alternative
Hand-Over-Locking
- Instead of using a single lock for the entire list, the technique
employs a lock for each node in the list. While traversing the list,
before moving to the next node, the code acquires the lock of the next
node and releases the lock of the current node.