哲学家进餐问题学习卡片

🍽️

问题描述

  • 5位哲学家围坐在圆桌旁,每人左右各有一根筷子(共5根)
  • 哲学家只有两种行为:思考进餐
  • 进餐规则:
    • 必须同时拿到左右两根筷子才能进餐
    • 若筷子被占用则需等待
    • 进餐完毕后放下筷子继续思考
🔍

问题分析

  • 资源竞争特点:
    • 每位哲学家需要同时获取两个临界资源(左右筷子)
    • 相邻哲学家共享同一根筷子(互斥访问)
  • 初始解决方案的死锁风险
    • 所有哲学家同时拿起左边筷子,无法获取右边筷子而永久等待
    • 形成"循环等待"条件
1️⃣

解决方案1: 限制并发数

  • 核心思想:最多允许4位哲学家同时进餐
  • 实现原理
    • 设置初始值为4的同步信号量
    • 保证至少有一位哲学家能获得两根筷子
    • 打破"循环等待"的必要条件
2️⃣

解决方案2: 奇偶编号

  • 执行顺序
    • 奇数号哲学家:先左后右
    • 偶数号哲学家:先右后左
  • 优势
    • 相邻哲学家会竞争同一根筷子
    • 确保至少一人能完整获取两根筷子
    • 避免"持有并等待"情况
3️⃣

解决方案3: 互斥锁

  • 实现方式
    • 确保拿筷子操作是原子性
    • 哲学家要么完整拿到两根筷子,要么一根都拿不到
    • 防止部分获取导致的死锁
  • 关键点
    • mutex保护的是"拿筷子"过程而非筷子本身
📝

核心考点

  • 理解多资源竞争场景下的死锁条件
  • 掌握三种典型解决方案的实现原理
  • 问题特征
    • 每个进程需要同时持有多个临界资源
    • 资源分配存在环形依赖
  • 解决思路
    • 破坏死锁四个必要条件之一(特别是"循环等待")
    • 通过资源预分配或执行顺序限制避免死锁