当前位置: 首页 > news >正文

【操作系统专业课】第二次作业

第1题(进程同步与互斥)

使用二值信号量实现 n 个进程之间的互斥


1. 定义一个二值信号量 mutex1

二值信号量:二值信号量只有两种取值,0 (资源已被占用)和 1(资源可用)。

2. 进程进入临界区前的操作:每个进程在进入临界区之前,都需要执行 P(mutex) 操作。

P 操作的定义如下:

  • 若 mutex 的值大于 0,则将 mutex 的值减 1,进程可以进入临界区。

  • 若 mutex 的值等于 0,则进程会被阻塞,进入等待队列,直到 mutex 的值大于 0 时被唤醒。

当进程成功执行 P(mutex) 操作后,即获得了对临界区资源的访问权,可以进入临界区执行相应的操作。

3. 进程在临界区内的操作:临界区是指一次只允许一个进程访问的代码段,在这里实现对共享资源的互斥访问。

4. 进程离开临界区后的操作:当进程完成在临界区内的操作后,需要执行 V(mutex) 操作来释放对临界区资源的占用。

V 操作的定义如下:

  • 将 mutex 的值加 1

  • 如果有进程在等待队列中等待访问临界区资源(即 mutex 的值在执行 V 操作之前为 0),则唤醒等待队列中的一个进程,使其可以进入临界区。

第2题(进程同步与互斥)

证明 Dekker 算法满足临界区问题的三个要求

Dekker算法:第一个著名的正确解决两个进程临界区问题的软件方法

两个进程P_0P_1共享以下变量:

boolean flag[2];   //进程i,j的标志位:代表两个不同进程(线程)是否准备好进入临界区等相关状态
int turn;   //决定哪个进程优先(两个都为T时看他)

进程P_{i}\left (i == 0or 1\right )进程P_{j}\left (j == 0or 1\right )的结构如下。

while (true) {   //持续尝试进入临界区flag[i] = true;  //i进程有进入临界区的意愿while (flag[j]) {  //j进程是否有进入临界区的意愿if (turn == j) {  //然后进一步检查 turn 的值,如果 turn 指向另一个进程(j)flag[i] = false;   //当前进程(i)会先放弃自己的请求(flag[i] = false)while (turn == j) {}   //然后等待直到 turn 不再指向另一个进程flag[i] = true;   //之后重新设置自己的标志位(flag[i] = true)turn = j;   //并且将 turn 让给另一个进程(turn = j)}}// 这里可以添加临界区代码flag[i] = false;       //最后再次放弃自己的请求(flag[i] = false)// 这里可以添加非临界区代码
}

互斥证明

假设进程P_{i}进入了临界区,那么在它进入临界区之前,一定是执行了 flag[i] = true,并且要么 flag[j] == false,要么 flag[j] == true 且 turn!= j

如果 flag[j] == false,说明进程P_{j}此时没有进入临界区的意愿,也就不会与P_{i}同时进入临界区。

如果 flag[j] == true 且 turn!= j,那么根据算法,当P_{j}有进入临界区的意愿时,由于 turn 不指向它,它会被阻塞在相应的循环中,无法进入临界区。

同理,当进程P_{j}进入临界区时,也能得出类似结论。所以,该算法保证了任何时刻最多只有一个进程能进入临界区,满足互斥要求。

有空让进证明

当临界区空闲时,即没有进程在临界区内,此时 flag[0] 和 flag[1] 都为 false

假设此时进程P_{i}想要进入临界区,它会执行 flag[i] = true,然后由于 flag[j] == false,它可以直接进入临界区,不会被阻塞。

因此,只要临界区空闲,有进程请求进入临界区时,该进程就能进入临界区,满足有空让进的要求。

有限等待证明

相关文章:

【操作系统专业课】第二次作业

第1题(进程同步与互斥) 使用二值信号量实现 n 个进程之间的互斥。 1. 定义一个二值信号量 mutex= 1。 二值信号量:二值信号量只有两种取值,0 (资源已被占用)和 1(资源可用)。 2. 进程进入临界区前的操作:每个进程在进入临界区之前,都需要执行 P(mutex) 操作。 P 操作…...

Scala的迭代器

1.对比foreach 它的优点在于: (1) 内存效率高。迭代器采用延迟计算的方式,它不会将整个集合加载到内存中,而是在每次调用next方法时才计算并返回下一个元素。 (2) 统一的遍历方法。迭代器为不同类型的集合(如列表、集合、映射等…...

(RK3566驱动开发 - 1).pinctrl和gpio子系统

一.设备树 pinctrl部分可以参考 rockchip 官方的绑定文档 :kernel/Documentation/devicetree/bindings/pinctrl PIN_BANK:引脚所属的组 - 本次例程使用的是 GPIO3_A1 这个引脚,所以所属的组为 3; PIN_BANK_IDX:引脚的…...

css三角制作(二十课)

代码&#xff1a; <style>/* 边框原理 */.box1 {width: 0;height: 0;border-top: 100px solid pink;border-bottom: 100px solid blue;border-left: 100px solid yellow;border-right: 100px solid greenyellow;}/* 三角制作 */.box2 {width: 0;height: 0;border: 100px …...

C++_priority_queue(优先级队列)

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 小伞的主页&#xff1a;xiaosan_blog 1. priority_queue的介绍和使用 priority_queue文档介绍 优先级队列的实现的关键…...

微信小程序——01开发前的准备和开发工具

文章目录 一、开发前的准备1注册小程序账号2安装开发者工具 二、开发者工具的使用1创建项目2 工具的使用3目录结构4各个页面之间的关系5 权限管理6提交审核和发布 一、开发前的准备 开发前需要进行以下准备&#xff1a; 1 注册小程序账号2激活邮箱3 信息登记4 登录小程序管理后…...

MySQL 的主从复制数据同步

一、什么是 MySQL 的主从复制 MySQL 的主从复制&#xff08;Master-Slave Replication&#xff09;是一种将数据从一个主数据库服务器&#xff08;主库&#xff09;复制到一个或多个从数据库服务器&#xff08;从库&#xff09;的技术。主库负责所有的数据写操作&#xff0c;从…...

python——面向对象

一、面向对象编程 1.1 面向过程与面向对象 面向过程和面向对象都是一种编程方式&#xff0c;只不过再设计上有区别。 1.1.1 面向过程pop&#xff1a; 举例&#xff1a;孩子上学 1. 妈妈起床 2. 妈妈洗漱 3. 妈妈做饭 4. 妈妈把孩子叫起来 5. 孩子起床 6. 孩子洗漱 7. 孩子吃…...

Microsoft 365 Exchange如何设置可信发件IP白名单

1、 进入到 Microsoft 365 admin center 管理中心 &#xff0c;点击 管理中心 下的 安全 在弹出的新页面中&#xff0c;依次点击 策略和规则 – 威胁策略 – 反垃圾邮件 再单击 连接筛选器策略(默认) – 编辑连接筛选器策略 2、在 IP 允许列表 中添加可信邮件 IP 段&#xff0…...

LM27313典型电路之升压电路

下图为升压芯片LM27313典型电路图&#xff1a; 从图中可以看出&#xff1a;系统电压VSYS3.7伏&#xff0c;通过C26与C27两个滤波电容后&#xff0c;到达升压芯片的VIN输入脚pin5。 其中电源芯片的电压输出由下式子决定&#xff1a; VOUT1.23*(1R17/R21) 其中VOUT是图中的V5D…...

嵌入式面试八股文(七)·#ifndef#define#endif的作用、以及内存分区(全局区、堆区、栈区、代码区)

目录 1. 头文件中的#ifndef / #define / #endif的作用是什么&#xff1f; 2. 内存分区&#xff1a;全局区、堆区、栈区、代码区简单描述&#xff1f; 2.1 代码区&#xff08;Text Segment&#xff09;&#xff1a; 2.2 全局区&#xff08;Data Segment&#xff09;&…...

【弱监督视频异常检测】2024-ESWA-基于扩散的弱监督视频异常检测常态预训练

2024-ESWA-Diffusion-based normality pre-training for weakly supervised video anomaly detection 基于扩散的弱监督视频异常检测常态预训练摘要1. 引言2. 相关工作3. 方法论3.1. 使用扩散自动编码器进行常态学习3.2. 全局-局部特征编码器3.2.1 局部块3.2.2 全局块3.2.3 协同…...

Android 13 实现屏幕熄屏一段时候后关闭 Wi-Fi 和清空多任务列表

明白了,您这个补丁的功能是当设备屏幕关闭一段时间后,自动关闭 Wi-Fi 连接并清空多任务菜单。以下是更新后的博客内容,包含了对功能的详细解释和代码实现: 修改 PowerManagerService.java 以实现屏幕灭屏后关闭 Wi-Fi 和清空多任务菜单功能 在本篇博客中,我们将介绍一个针…...

Elasticsearch磁盘占用大于95%时将所有索引置为只读

在一个稳定运行的功能中,突然收到报错。经查明,是在向 Elasticsearch 中插入文档时出现了错误: AuthorizationException: AuthorizationException(403, ucluster_block_exception, ublocked by: [FORBIDDEN/12/index read-only / allow delete (api)];) 网上也有其他人报出类…...

删除 git config 保存的密码

要从 Git 中删除保存的密码&#xff0c;你可以根据你之前使用的保存方法来操作。以下是一些常见的方法来删除 Git 中保存的密码&#xff1a; 删除 credential.helper 中的密码 如果你之前使用 store 或 cache 作为 credential.helper&#xff0c;你可以执行以下步骤来删除保存…...

Springboot环境搭建详解

springboot学习视频记录&#xff1a; 笔记&#xff1a; a&#xff1a;Springboot maven常见依赖、配置文件笔记-CSDN博客 b&#xff1a;Springboot环境搭建详解-CSDN博客 day01 6&#xff1a;springboot的parent和starter依赖- a 7&#xff1a;启动类的位置配置- b 8&am…...

SpringCloud框架学习(第三部分:Resilience4j 与 Micrometer)

目录 九、CircuitBreaker断路器 1.前言&#xff08;Hystrix&#xff09; 2.服务雪崩 3.Circuit Breaker 4. Resilience4j 5.案例实战 &#xff08;1&#xff09;熔断&#xff08;服务熔断 服务降级&#xff09; Ⅰ. 按照 COUNT_BASED&#xff08;计数的滑动窗口&#xf…...

Scala的Map集合(不可变)

package gxy//类型&#xff1a;不可变&#xff0c;可变 //操作&#xff1a;添加元素&#xff0c;删除元素&#xff0c;查询元素&#xff0c;移除元素&#xff0c;遍历 object map {def main(args: Array[String]): Unit {//不可变mapval map1 Map("鄂" -> "…...

深入剖析:Spring MVC与Struts的较量

标题&#xff1a;深入剖析&#xff1a;Spring MVC与Struts的较量 引言 在Java Web开发领域&#xff0c;Spring MVC和Struts是两个非常流行的框架。它们各自拥有不同的特点&#xff0c;适用于不同的应用场景。本文将深入探讨Spring MVC和Struts的区别&#xff0c;从底层机制、…...

4.Mybatis中,在Mapper的SQL映射文件中,使用<choose><when>无法识别参数的情况

正确结果 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"com.itheima.mapper.Bra…...

解锁SD-PPP:将AI绘画能力无缝融入Photoshop工作流

解锁SD-PPP&#xff1a;将AI绘画能力无缝融入Photoshop工作流 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp 你是否曾经在Photoshop中创作时&#xff0c;突然需要一个AI生成的元素来完善设计&#xff0c;却不得不…...

STM32CubeIDE新手避坑:如何正确添加自定义文件夹(以OLED驱动为例)

STM32CubeIDE工程管理实战&#xff1a;从零构建模块化OLED驱动框架 第一次在STM32CubeIDE中引入第三方驱动时&#xff0c;90%的开发者都会在头文件引用环节卡壳。那些看似简单的"../BSP/oled.h"路径背后&#xff0c;隐藏着嵌入式工程管理的核心逻辑。本文将用真实的O…...

3分钟学会:如何用Chrome扩展一键保存完整网页内容

3分钟学会&#xff1a;如何用Chrome扩展一键保存完整网页内容 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extension…...

手把手教你用正点原子RV1126开发板玩转RKMedia:从录音到RTSP推流保姆级教程

手把手教你用正点原子RV1126开发板玩转RKMedia&#xff1a;从录音到RTSP推流保姆级教程 第一次拿到正点原子ATK-DLRV1126开发板时&#xff0c;那种既兴奋又忐忑的心情至今记忆犹新。作为一款基于Rockchip RV1126芯片的嵌入式开发平台&#xff0c;它强大的多媒体处理能力让人跃…...

2026年阿里云OpenClaw/Hermes Agent配置Token Plan新手友好流程

2026年阿里云OpenClaw/Hermes Agent配置Token Plan新手友好流程。OpenClaw是开源的个人AI助手&#xff0c;Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具&…...

5分钟搭建Sunshine游戏串流:免费开源让全家共享游戏乐趣

5分钟搭建Sunshine游戏串流&#xff1a;免费开源让全家共享游戏乐趣 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾经梦想在客厅沙发上畅玩书房电脑里的3A大作&#xff1…...

从‘浴盆曲线’到加速测试:拆解企业级SSD如何做到MTBF 200万小时

从‘浴盆曲线’到加速测试&#xff1a;拆解企业级SSD如何做到MTBF 200万小时 当企业技术决策者面对存储方案选型时&#xff0c;一个看似简单的参数常引发激烈讨论&#xff1a;为什么同样容量的企业级SSD价格是消费级的3-5倍&#xff1f;答案藏在MTBF&#xff08;Mean Time Betw…...

文渊智阁:教育智能化的技术革新与实践

在人工智能技术飞速发展的今天&#xff0c;教育智能化已成为推动科研与教学变革的重要力量。湖北文渊智阁互联网科技有限公司&#xff08;以下简称“文渊智阁”&#xff09;凭借其深厚的技术积累和创新能力&#xff0c;在教育智能化领域取得了显著成果。本文将深入探讨文渊智阁…...

【权威实测】Perplexity vs PubMed vs Scite:在结构生物学领域,它为何将文献召回率提升68%?

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity生物知识搜索 Perplexity 是一款以实时网络检索与引用溯源为核心能力的 AI 搜索工具&#xff0c;其在生命科学领域的应用正迅速拓展。不同于传统大模型依赖静态训练数据&#xff0c;Perplexity 在执…...

告别HDR格式混乱:用Python代码实战HLG与PQ曲线互转(附完整代码)

告别HDR格式混乱&#xff1a;用Python代码实战HLG与PQ曲线互转&#xff08;附完整代码&#xff09; 在视频处理领域&#xff0c;HDR&#xff08;高动态范围&#xff09;技术已经成为提升视觉体验的关键要素。然而&#xff0c;HLG&#xff08;Hybrid Log-Gamma&#xff09;和PQ&…...