首页 > 其他分享 >操作系统-同步问题分析

操作系统-同步问题分析

时间:2024-12-19 11:33:39浏览次数:5  
标签:分析 count 同步 操作系统 writer 信号量 mutex 读者 缓冲区

生产者-消费者问题

问题描述:一组生产者和一组消费者共享一个大小为 n 的缓冲区;只有缓冲区还有空位的时候生产者才能往里放数据;只有缓冲区不为空的时候消费者才能从中取数据;缓冲区是临界资源,只允许一个生产者往里放数据或者一个消费者从中取数据

关系分析:因为缓冲区是临界资源,所以需要一个信号量 mutex 控制生产者和生产者、生产者和消费者以及消费者和消费者之间的互斥访问;又因为只有缓冲区还有空位的时候生产者才能放数据进去,所以还需要一个信号量 empty 控制生产和放入数据两个动作的同步关系;同理,还需要信号量 full 控制取出数据和消费之间的同步关系

伪代码

semaphore mutex = 1, empty = n, full = 0;
// 生产者
producer() {
  P(empty);
  P(mutex);
  do_something;
  V(mutex);
  V(full);
}
// 消费者
consumer() {
  P(full);
  P(mutex);
  do_something();
  V(mutex);
  V(empty);
}

为什么我们先做 P(mutex) 而不是 P(empty)P(full) 呢?从我们的定义上理解,mutex 是控制缓冲区(临界资源)访问的信号量,在 P(mutex) 之前我们应该做好所有准备工作,信号量 empty 的控制并不是访问缓冲区过程中的动作,而是控制是否进入缓冲区访问的动作,因此应该在 mutex 之前进行;从反面理解,如果我们把它们的顺序调换,那么显然会出现生产者占据了 mutex 导致消费者在 P(mutex) 中被挂起,无法释放 empty 从而导致死锁的情况。或许可以从谓词逻辑角度做一个形式化的证明?

读者-写者问题

问题描述:有一组读者和一组作者共同对一本书进行阅读和修改,多个读者可以同时阅读这本书;有读者阅读时作者无法修改,作者修改时读者无法阅读;多个作者无法同时进行修改。按存在读者阅读时,作者的修改是否会被无限推迟把这个问题划分为读者优先和作者优先两种。

关系分析:对于读者优先问题:读者和读者之间不存在互斥关系,不需要任何信号量;当存在一个作者时,其他作者和读者不能访问这本书(临界资源),这是一种互斥关系,因此需要一个信号量 writer;当存在多个读者时,作者是不能修改临界区资源的,因此我们引入一个信号量 reader,每有一个读者进入就 V,退出就 P,又因为只有当读者的数量为 0 的时候作者才能进行修改,所以获取读者数量是一个很重要的事情,但是 P V 操作不允许我们获取信号量 reader 的大小,所以我们修改原来的设计,把信号量 reader 变为一个计数器 reader,同时引入一个信号量 mutex 控制多个读者进程对计数器的互斥访问,每有一个读者进程就把计数器加一,只有当现在的读者退出后计数器为 0 才允许作者修改,即 V(writer)

对于作者优先问题,当已经有一个作者进程在等待,就不再允许新的读者进程进入了。所以可以再引入一个信号量 exist 控制它。感觉实际上再引入一个计数器和对应的信号量也是可以的,不过不如一个信号量方便。

第一眼看上去读者-写者问题和生产者-消费者很类似,为什么我们把它们划分成两个问题呢?它们的本质区别在于作者进程是在某个值小于等于 0 时才能进行,这与 P V 操作本身的定义不太相合,导致单纯用信号量去解决读者和写者之间的互斥关系非常困难。所以在这个问题中,我们引入一个计数器 count。感觉我的描述还不是很清楚。

伪代码

// 读者优先
int count = 0;
semaphore mutex = 1, writer = 1;

reader() {
  P(mutex);
  if (count == 0) {
    P(writer);
  }
  count++;
  V(mutex);
  do_something();
  P(mutex);
  count--;
  if (count = 0) {
    V(writer);
  }
  V(mutex);
}

writer() {
  P(writer);
  do_something();
  V(writer);
}

// 作者优先
int count = 0;
semaphore mutex = 1, writer = 1, exist = 1;

reader() {
  P(exist);
  P(mutex);
  if (count == 0) {
    P(writer);
  }
  count++;
  V(mutex);
  V(exist);
  do_something();
  P(mutex);
  count--;
  if (count = 0) {
    V(writer);
  }
  V(mutex);
}

writer() {
  P(exist);
  P(writer);
  do_something();
  V(writer);
  V(exist);
}

哲学家进餐问题

问题描述:一个圆桌上五名哲学家,每两名哲学家之间有一根筷子,设计算法让哲学家能够轮流进餐。

关系分析:筷子是互斥资源,但是如果对每根筷子设置一个信号量很容易导致死锁状态;因此,“一根筷子”并不是互斥资源,“一对筷子”才是互斥资源。增加一个信号量 mutex 使得每个哲学家对左右两根筷子的操作是互斥的。mutex 可以只有一个,使得所有哲学家依次地拿起两双筷子,也可以有 5 个,代表 1 2, 2 3, 3 4, 4 5, 5 1 五对筷子。

也可以用 AND 信号量解决这个问题



伪代码

semaphore mutex = 1, chopstick[5] = [1, 1, 1, 1, 1];

philosopher() {
  P(mutex);
  P(chopstick[i]);
  P(chopstick[i + 1]);
  V(mutex);
  do_something();
  V(chopstick[i]);
  V(chopstick[i + 1]);
}

考研习题分析

生产者-消费者模型的变体,使用信号量 mutex 维护缓冲区的互斥使用,使用信号量 empty 维护空缓冲区,使用信号量 odd 维护缓冲区中奇数,使用信号量 even 维护缓冲区中偶数

semaphore mutex = 1, empty = N, odd = 0, even = 0;

P1() {
  
}

标签:分析,count,同步,操作系统,writer,信号量,mutex,读者,缓冲区
From: https://www.cnblogs.com/sysss-blogs/p/18616479

相关文章

  • 毕业设计:python高校舆情分析系统+可视化+情感分析 舆情分析+Flask框架(源码)✅
    毕业设计:python高校舆情分析系统+可视化+情感分析舆情分析+Flask框架(源码)✅1、项目介绍技术栈:Python语言、Flask框架、requests爬虫、snownlp情感分析、Echarts可视化、HTML2、项目界面(1)系统首页数据概况(2)敏感词统计分析(3)词云图分析(4)话题趋势分析(5)新闻词云图......
  • 毕业设计:python二手车数据分析可视化系统 requests爬虫 Echarts可视化 Django框架(源码
    毕业设计:python二手车数据分析可视化系统requests爬虫Echarts可视化Django框架(源码)✅1、项目介绍技术栈:python语言、Django框架、MySQL数据库、requests爬虫技术、汽车之家二手车、Echarts可视化2、项目界面(1)中国地图–全国各地车辆数据(2)会员注册年份与等级(3)二......
  • 毕业设计:python电商评论数据采集分析可视化系统 Flask框架 NLP情感分析 LDA主题分析 B
    毕业设计:python电商评论数据采集分析可视化系统Flask框架NLP情感分析LDA主题分析Bayes评论分类(源码)✅1、项目介绍项目技术说明:python语言、Flask框架、MySQL数据库、Echarts可视化、评论多维度分析、NLP情感分析、LDA主题分析、Bayes评论分类2、项目界面(1)评论数......
  • Linux内存泄露案例分析和内存管理分享
    作者:京东科技李遵举一、问题近期我们运维同事接到线上LB(负载均衡)服务内存报警,运维同事反馈说LB集群有部分机器的内存使用率超过80%,有的甚至超过90%,而且内存使用率还再不停的增长。接到内存报警的消息,让整个团队都比较紧张,我们团队负责的LB服务是零售、物流、科技等业务服务的流......
  • linux操作系统安装
    1.centenos镜像文件下载2.创建一个虚拟机1)打开VMware软件,选择创建新的虚拟机,在弹出的虚拟机向导的窗口选择自定义配置,点击下一步;2)默认设置3)选择稍后安装系统4)客户机操作系统选择Linux,版本选择CentOS7(64位)5)命名虚拟机,选择存储路径6)处理器配置根据需求配置7)虚拟机内......
  • Apache SeaTunnel如何实现MongoDB到Doris无缝数据同步?
    如果你需要使用ApacheSeaTunnel将MongoDB数据库的数据同步到Doris,你可以按照以下步骤进行操作。这些步骤基于ApacheSeaTunnel的官方文档和社区提供的最佳实践:一、环境准备下载并安装SeaTunnel:访问SeaTunnel的官方GitHub页面,下载最新稳定版本的SeaTunnel。解压下载的文件......
  • 管理系统、微信小程序类源码文档-哔哩哔哩教程同步
    文章目录前言通用表基于Java+SpringBoot+Vue前后端分离手机销售商城系统设计实现:基于Java+SpringBoot+Vue+uniapp实现大学生校园兼职微信小程序......
  • Java四种同步数据结构对比
    前言相信各位在遇到并发场景处理数据时都碰到过该选什么数据结构进行存储的问题,本文就Java中常用的四种数据结构进行简单的讨论正文ConcurrentLinkedQueueConcurrentLinkedQueue是java.util.concurrent(JUC)包下的一个线程安全的队列实现。基于非阻塞算法(Michael-Scott非阻塞......
  • 【AI安全漏洞】VLLM反序列化漏洞分析与保姆级复现(附批量利用)
    #CVE-2024-9052环境需要Linux(这里使用kali)、Anaconda首先安装Anaconda前言最好使用linux,如果使用windows可能会产生各种报错(各种各种各种!!!),最好使用Anaconda,方便独立管理虚拟机使用conda创建虚拟机、python要求3.10condacreate-nvllm_beampython=3.10-y启动该虚拟机......
  • 【阿里matlab算法】matlab实现Arduino气象站气象数据分析——气象数据分析
    MATLAB实现Arduino气象站气象数据分析1、项目下载:本项目完整论文和全套实现源码见下面资源,有需要的朋友可以点击进行下载说明文档(点击下载)本算法文档matlab实现Arduino气象站气象数据分析-气象站仿真-气象数据分析-matlab更多阿里matlab精品项目可点击下方文字直达查看:......