Many concurrent programs assign priorities to threads to improve responsiveness. When used in conjunction with synchronization mechanisms such as mutexes and condition variables, however, priorities can lead to priority inversions, in which high-priority threads are delayed by low-priority ones. Priority inversions in the use of mutexes are easily handled using dynamic techniques such as priority inheritance, but priority inversions in the use of condition variables are not well-studied and dynamic techniques are not suitable. In this work, we use a combination of static and dynamic techniques to prevent priority inversion in code that uses mutexes and condition variables. A type system ensures that condition variables are used safely, even while dynamic techniques change thread priorities at runtime to eliminate priority inversions in the use of mutexes. We prove the soundness of our system, using a model of priority inversions based on cost models for parallel programs. To show that the type system is practical to implement, we encode it within the type systems of Rust and C++, and show that the restrictions are not overly burdensome by writing sizeable case studies using these encodings, including porting the Memcached object server to use our C++ implementation.
翻译:许多并发程序分配线程优先级以提高响应性。但是,当与互斥锁和条件变量等同步机制结合使用时,优先级可能会导致优先级反转,即高优先级线程被低优先级线程延迟。使用动态技术如优先级继承等可以轻松处理使用互斥锁的优先级反转,但使用条件变量的优先级反转尚未得到很好的研究,动态技术也不适用。在本工作中,我们结合使用静态和动态技术,以防止在使用互斥锁和条件变量的代码中发生优先级反转。类型系统确保条件变量的安全使用,即使在使用互斥锁的优先级反转期间动态技术更改线程优先级以消除优先级反转。我们使用基于并行程序成本模型的优先级反转模型证明了我们系统的正确性。为了表明类型系统实际可实现,我们将其编码到Rust和C ++的类型系统中,并通过编写使用这些编码的大型案例研究来证明限制不会过于繁琐,包括将Memcached对象服务器移植到我们的C++实现。