MST
星途 面试题库

面试题:并发与同步:简述操作系统活锁常见场景及一种避免策略

请简要描述在操作系统并发与同步环境下,可能出现活锁的常见场景,并详细阐述一种有效的避免活锁的策略,包括该策略的原理和实现方式。
31.3万 热度难度
操作系统并发与同步

知识考点

AI 面试

面试题答案

一键面试

活锁常见场景

  1. 资源分配场景:多个进程或线程都在尝试获取资源,但由于资源分配策略不当,例如每个进程都在获取部分资源后又释放并重新尝试获取全部资源,导致它们一直在重复相同的获取 - 释放动作,却始终无法获取到足够资源继续执行。
  2. 消息传递场景:在分布式系统或进程间通信中,两个或多个进程相互等待对方发送的消息来执行下一步操作。如果它们都在等待对方先发送消息,并且每次检测到对方未发送消息时就立即重试发送自己的消息,就会陷入活锁,不断尝试但无进展。

避免活锁策略 - 引入随机延迟

  1. 原理:通过在重试操作中引入随机延迟,打破进程或线程之间的对称性,使得它们不会一直重复相同的操作序列。随机延迟可以让不同的进程或线程在不同的时间点重试,从而有机会打破循环等待状态,让某个进程能够获取到所需资源继续执行。
  2. 实现方式: 以Python的多线程示例来说明,假设我们有两个线程竞争资源,代码如下:
import threading
import time
import random


class Resource:
    def __init__(self):
        self.lock = threading.Lock()


resource = Resource()


def thread_function(name):
    while True:
        if resource.lock.acquire(timeout=1):
            try:
                print(f"{name} acquired the resource.")
                # 模拟使用资源
                time.sleep(1)
                break
            finally:
                resource.lock.release()
        else:
            # 引入随机延迟
            delay = random.uniform(0, 1)
            print(f"{name} did not acquire the resource. Retrying in {delay} seconds.")
            time.sleep(delay)


if __name__ == "__main__":
    t1 = threading.Thread(target=thread_function, args=("Thread 1",))
    t2 = threading.Thread(target=thread_function, args=("Thread 2",))
    t1.start()
    t2.start()
    t1.join()
    t2.join()

在上述代码中,当线程未能获取到锁时,会随机等待0到1秒的时间后再重试,通过这种方式减少活锁发生的可能性。