Deterministic Futexes Revisited

Deterministic Futexes Revisited

OSPERT 2018-07-03 A. Zuepke Deterministic Futexes Revisited Alexander Zuepke, Robert Kaiser [email protected] OSPERT 2018-07-03 A. Zuepke Futexes ● Futexes: underlying mechanism for thread synchronization in Linux ● libc provides: – Mutexes and Condition Variables – Semaphores, Reader-Writer Locks, Barriers, … ● Linux kernel provides system calls to: – suspend the calling thread – wake a given number of waiting threads ● First prototype in Linux kernel version 2.5.7 2 OSPERT 2018-07-03 A. Zuepke Futexes ● Linux Futex API #include <linux/futex.h> int SYS_futex(int *uaddr, int op, int val, const struct timespec *timeout, int *uaddr2, int val3); ● Operations – FUTEX_WAIT Suspend calling thread on futex uaddr – FUTEX_WAKE Wake val threads waiting on futex uaddr – FUTEX_REQUEUE Move threads waiting on uaddr to uaddr2 – … more operations available → see FUTEX(2) man page 3 OSPERT 2018-07-03 A. Zuepke Mutex Example ● mutex_lock / mutex_unlock – Fast path: use atomic operations to change a 32-bit integer variable in user space unlocked – No system call involved! fast path: atomic ops ● mutex_lock on contention – Atomically indicate pending waiters locked – futex_wait system call ● Look-up wait queue slow path: futex syscall ● Check futex value again ● Enqueue calling thread in wait queue locked w/ contention ● Suspend calling thread wait queue in kernel ● mutex_unlock on contention – futex_wake system call ● Look-up wait queue ● Wake first waiting thread 4 OSPERT 2018-07-03 A. Zuepke Condition Variable Example ● cond_signal/broadcast Cond Mutex Wait } Wait Queue c d e Queue a b c d e – Atomically increment futex value – Call futex_requeue to move one/all waiters from condition variable wait queue to mutex wait queue 5 OSPERT 2018-07-03 A. Zuepke Futexes ● Futex ↔ generic compare-and-block mechanism ● Implement POSIX synchronization mechanisms in user space ● But: – Can we use it in safety critical systems? – Certification? – WCET? – Interference analysis? 6 OSPERT 2018-07-03 A. Zuepke Futexes ● Futex ↔ generic compare-and-block mechanism ● Implement POSIX synchronization mechanisms in user space FUTEX ● But: – Can we use it in safety critical systems? – Certification? – WCET? – Interference analysis? 7 OSPERT 2018-07-03 A. Zuepke Futexes ● Futex ↔ generic compare-and-block mechanism ● Implement POSIX synchronization mechanisms in user space FUTEX ● But: – Can we use futexes in real-time systems? – WCET? – Interference? – Determinism? 8 OSPERT 2018-07-03 A. Zuepke Outline ● Linux implementation ● Our OSPERT 2013 approach ● Requirements for determinism ● Our new approach ● Discussion 9 OSPERT 2018-07-03 A. Zuepke Linux Implementation 10 OSPERT 2018-07-03 A. Zuepke Linux Implementation ● Hash of shared wait queues – num_cpus x 256 hash buckets – all operations in O(1) time ● Wait queues – Priority-sorted linked list ● O(n) find ● O(p) insertion ● O(1) removal ● Locking: per hash bucket 11 OSPERT 2018-07-03 A. Zuepke Linux Implementation ● Hash of shared wait queues – num_cpus x 256 hash buckets – all operations in O(1) time ● Wait queues Futex A – Priority-sorted linked list ● O(n) find Futex B # ● O(p) insertion ● O(1) removal Futex C ● Locking: per hash bucket 12 OSPERT 2018-07-03 A. Zuepke Linux Implementation ● Hash of shared wait queues – num_cpus x 256 hash buckets – all operations in O(1) time ● Wait queues Futex A – Priority-sorted linked list a ● O(n) find Futex B # ● O(p) insertion ● O(1) removal Futex C ● Locking: per hash bucket 13 OSPERT 2018-07-03 A. Zuepke Linux Implementation ● Hash of shared wait queues – num_cpus x 256 hash buckets – all operations in O(1) time ● Wait queues Futex A – Priority-sorted linked list a ● O(n) find Futex B # ● O(p) insertion b ● O(1) removal Futex C ● Locking: per hash bucket 14 OSPERT 2018-07-03 A. Zuepke Linux Implementation ● Hash of shared wait queues – num_cpus x 256 hash buckets – all operations in O(1) time ● Wait queues Futex A – Priority-sorted linked list a c ● O(n) find Futex B # ● O(p) insertion b ● O(1) removal Futex C ● Locking: per hash bucket 15 OSPERT 2018-07-03 A. Zuepke Linux Implementation ● Hash of shared wait queues – num_cpus x 256 hash buckets – all operations in O(1) time ● Wait queues Futex A – Priority-sorted linked list a c ● O(n) find Hash Futex B # ● O(p) insertion b Collision! ● O(1) removal Futex C ● Locking: per hash bucket 16 OSPERT 2018-07-03 A. Zuepke Linux Implementation ● Experiment – Two processes – 2048 blocked threads each – Process α requeues 2048 threads from αsrc to αdst – Process β requeues 1 thread from βsrc to βdst – Measure β’s execution time – Note: four wait queues! 17 OSPERT 2018-07-03 A. Zuepke Linux Implementation 900 800 700 600 ] s u [ e 500 m i t n o i t u c 400 e x e s ' β t 300 ypically 5 us 200 #1 distinct wait queues 100 βsrc ≠ βdst, α... ≠ β... 0 operations in constant time 0 500 1000 1500 2000 Thread # requeued from set of blocked threads #1: β requeues to distinct futex wait queues α not involved Core 2 Duo @ 3.00 GHz, Linux 4.6.12-rt5, Ubuntu 16.04 18 OSPERT 2018-07-03 A. Zuepke Linux Implementation 900 800 700 600 ] s u [ e 500 m i #2 shared wait queue for β t n o i t βsrc = βdst, α... ≠ β… u c 400 e x ch e r a linear search in plist, s e ' s β ar 300 line ist threads remain in place in pl 200 #1 distinct wait queues 100 βsrc ≠ βdst, α... ≠ β... 0 operations in constant time 0 500 1000 1500 2000 Thread # requeued from set of blocked threads #2: β requeues to same futex wait queue α not involved Core 2 Duo @ 3.00 GHz, Linux 4.6.12-rt5, Ubuntu 16.04 19 OSPERT 2018-07-03 A. Zuepke Linux Implementation 900 #3 shared wait queue for α, β 800 βsrc = βdst = αsrc = αdst 700 linear search in plist, 2048 unrelated threads 600 W ] o s rs u [ t e C 500 a m i s #2 shared wait queue for β unrelatedt e n ? o i t βsrc = βdst, α... ≠ β… u threads c 400 e x e linear search in plist, s ' β 300 threads remain in place 200 #1 distinct wait queues 100 βsrc ≠ βdst, α... ≠ β... 0 operations in constant time 0 500 1000 1500 2000 Thread # requeued from set of blocked threads #3: β requeues to same futex wait queue α also requeues 2048 threads Core 2 Duo @ 3.00 GHz, Linux 4.6.12-rt5, Ubuntu 16.04 20 OSPERT 2018-07-03 A. Zuepke Linux Implementation ● Drawbacks of Linux implementation – Shared wait queues – Dynamic memory allocations for PI mutexes – Not preemptive 21 OSPERT 2018-07-03 A. Zuepke Our OSPERT 2013 Approach 22 OSPERT 2018-07-03 A. Zuepke OSPERT 2013 Approach* futex ● Save thread ID of first waiter Thread ID next to the futex in user space of 1st waiter → O(1) look-up of wait queue ● FIFO ordering in wait queue → wait queues use linked lists ● futex_requeue appends whole linked lists → in O(1) time ● other operations: also O(1) time * A. Zuepke, “Deterministic Fast User Space Synchronization”, OSPERT 2013 23 OSPERT 2018-07-03 A. Zuepke OSPERT 2013 Approach* ● Limitations of paper version: – Limited set of futex operations – No “wake all” operation (for barriers) – Only FIFO ordering ● Overcoming these limitations is possible: – Priority ordering of wait queue – Preemptive “wake_all” operation * A. Zuepke, “Deterministic Fast User Space Synchronization”, OSPERT 2013 24 OSPERT 2018-07-03 A. Zuepke OSPERT 2013 Approach* ● Particular Problems: – Consistency of linked list during deletion/timeout handling while another thread walks this list – “Sneak-in”: prevent woken threads from re-entering a wait queue – Scalability: requires a global lock design → Result: complex implementation → Take a fresh look ... * A. Zuepke, “Deterministic Fast User Space Synchronization”, OSPERT 2013 25 OSPERT 2018-07-03 A. Zuepke Requirements for Determinism Use dedicated wait queues! 26 OSPERT 2018-07-03 A. Zuepke Requirements 0. Do not share wait queues 1. No dynamic memory allocations 2. Priority ordered wait queues; FIFO order on tie 3. Wait queue: use binary search tree (BST) 4. Wait queue look-up: use BST as well 5. Preemptible “wake/preempt all” operations 6. Prevent “sneak-in” 7. Transparent preemption 8. Fine granular locking 27 OSPERT 2018-07-03 A. Zuepke Requirements No interference 0. Do not share wait queues 1. No dynamic memory allocations 2. Priority ordered wait queues; FIFO order on tie 3. Wait queue: use binary search tree (BST) 4. Wait queue look-up: use BST as well 5. Preemptible “wake/preempt all” operations 6. Prevent “sneak-in” 7. Transparent preemption 8. Fine granular locking 28 OSPERT 2018-07-03 A. Zuepke Requirements No interference 0. Do not share wait queues 1. No dynamic memory allocations No unexpected failures 2. Priority ordered wait queues; FIFO order on tie 3. Wait queue: use binary search tree (BST) 4. Wait queue look-up: use BST as well 5. Preemptible “wake/preempt all” operations 6. Prevent “sneak-in” 7. Transparent preemption 8. Fine granular locking 29 OSPERT 2018-07-03 A. Zuepke Requirements No interference 0. Do not share wait queues 1. No dynamic memory allocations No unexpected failures 2. Priority ordered wait queues; FIFO order on tie 3. Wait queue: use binary search tree (BST) O(log n) time 4. Wait queue look-up: use BST as well 5. Preemptible “wake/preempt all” operations 6. Prevent “sneak-in” 7. Transparent preemption 8. Fine granular locking 30 OSPERT 2018-07-03 A. Zuepke Requirements No interference 0. Do not share wait queues 1. No dynamic memory allocations No unexpected failures 2. Priority ordered wait queues; FIFO order on tie 3.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    58 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us