操作系统 哲学家进餐问题

简介: 操作系统 哲学家进餐问题

哲学家进餐问题

问题描述

5个哲学家以交替思考、进餐的方式生活, 他们坐在一张圆桌旁,桌 子上有 5 个碗和 5 只筷子。当一个哲学家思考时,他与相邻的两个哲学家不会相互影响;但当他进餐时,需同时获得最靠近他的左右两只筷子,若其中一只筷子被相邻的哲学家拿走,他就必须等待。

image.png

问题分析

将哲学家看作进程,将筷子看作资源;经过分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用。为了实现对筷子的互斥使用,可以用一个信号量表示一根筷子,由着五根筷子对应的五个信号量构成信号量数组,便可实现互斥访问

semaphone chopstick[5] = {1, 1, 1, 1, 1};

记录型信号量

代码实现

semaphone chopstick[5] = {1, 1, 1, 1, 1};
void philosopher(int i){
  do{
    wait(chopstick[i]);
    wait(chopstick[(i + 1) % 5]);
    ……
    eat;
    ……
    signal(chopstick[(i + 1) % 5]);
    signal(chopstick[i]);
    ……
    think;
    ……
  }while(TRUE);
}

死锁问题

  • 问题出现:
    在上述的代码中,每次哲学家都是先wait(chopstick[i]):拿左边的筷子,随后wait(chopstick[(i + 1) % 5]):拿右边的筷子。但是如果五个哲学家的进程在并发的过程中全部一起执行了wait(chopstick[i]),那么此时信号量chopstick将全部为0,进程陷入死锁状态
  • 解决思路:
  1. 至多只允许 4 个哲学家同时进餐。
semaphone chopstick[5] = {1, 1, 1, 1, 1};
semaphone count = 4
void philosopher(int i){
  do{
    wait(count);
    wait(chopstick[i]);
    wait(chopstick[(i + 1) % 5]);
    ……
    eat;
    ……
    signal(chopstick[(i + 1) % 5]);
    signal(chopstick[i]);
    signal(count);
    ……
    think;
    ……
  }while(TRUE);
}
  1. 仅当哲学家左右两边的筷子都可用时, 才允许他进餐。
    此处的思想便是接下来的AND信号量的实现方法
  2. 规定奇数号哲学家先拿左边的筷子, 再拿右边的筷子 ; 而偶数号哲学家则先拿右边的筷子,再拿左边的筷子。
semaphone chopstick[5] = {1, 1, 1, 1, 1};
void philosopher(int i){
  do{
    if(i % 2 != 0){
      wait(chopstick[i]);
      wait(chopstick[(i + 1) % 5]);
      ……
      eat;
      ……
      signal(chopstick[(i + 1) % 5]);
      signal(chopstick[i]);
    }else{
      wait(chopstick[(i + 1) % 5]);
      wait(chopstick[i]);
      ……
      eat;
      ……
      signal(chopstick[i]);
      signal(chopstick[(i + 1) % 5]);
    }
    ……
    think;
    ……
  }while(TRUE);
}

AND信号量

实现思路

仅当哲学家左右两边的筷子都可用时, 才允许他进餐

代码实现

semaphone chopstick[5] = {1, 1, 1, 1, 1};
void philosopher(int i){
  do{
    Swait(chopstick[i], chopstick[(i + 1) % 5])
    ……
    eat;
    ……
    Ssignal(chopstick[i], chopstick[(i + 1) % 5]);
    ……
    think;
    ……
  }while(TRUE);
}


目录
相关文章
【操作系统】Dijkstra提出的经典的同步问题——哲学家进餐问题
【操作系统】Dijkstra提出的经典的同步问题——哲学家进餐问题
208 0
【操作系统】Dijkstra提出的经典的同步问题——哲学家进餐问题
【操作系统作业】哲学家就餐问题
【操作系统作业】哲学家就餐问题
【操作系统作业】哲学家就餐问题
|
Java 程序员 编译器
2.7操作系统(读者—写者问题 哲学家进餐问题 管程 )
1.读者—写者问题 2.哲学家进餐问题 实现 3.管程 1.为什么要引入管程? ​2.管程的定义和基本特征 3.扩展1:用管程解决生产者消费者问题 4.扩展2:Java中类似于管程的机制
2.7操作系统(读者—写者问题 哲学家进餐问题 管程 )
|
5天前
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
50 10
|
3月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
114 0
Vanilla OS:下一代安全 Linux 发行版
|
1月前
|
弹性计算 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot是由阿里云推出的操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行等功能,极大提升了Linux系统的使用效率。用户只需通过简单的命令或自然语言描述问题,OS Copilot即可快速提供解决方案并执行相应操作。例如,查询磁盘使用量等常见任务变得轻松快捷。此外,它还支持从文件读取复杂任务定义,进一步简化了操作流程。虽然在某些模式下可能存在小问题,但总体上大大节省了学习和操作时间,提高了工作效率。
134 2
OS Copilot-操作系统智能助手-Linux新手小白的福音
|
1月前
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
75 7
|
1月前
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
67 6
|
1月前
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享
|
3月前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
137 4