信号量机制的实际使用-第二十九天

目录

回顾旧知

实现进程互斥

实现进程同步

实现进程的前驱关系

本节思维导图


回顾旧知

1、一个信号量对应一种资源

2、信号量的值 = 该种资源的剩余数量(信号量值小于0,说明此时有进程在等待这种资源)

3、P(S):申请一个资源S,如果资源不够就阻塞等待

4、V(S):释放一个资源S,如果有进程在等待该资源,则唤醒一个进程

实现进程互斥

实现步骤:

  1. 并发进程的关键活动(单核处理机情况下各进程轮流访问访问临界区),划定临界区(如:对临界资源打印机的访问就应放在临界区)
  2. 设置互斥信号量mutex,初始值为1(mutex表示“进入临界区的名额”)
  3. 在进入区P(mutex):申请资源
  4. 在退出区V(mutex):释放资源

注意事项:

  1. 对不同的临界资源需要设置不同的互斥信号量
  2. P、V操作必须成对出现(缺少P操作不能保证临界资源的互斥访问,缺少V操作会导致资源永不被释放,等待进程永不被唤醒) 

/*记录型信号量的定义*/
typedef struct
{
    int value;          //剩余资源数
    struct process *L;  //等待队列
}semaphore;

/*信号量机制实现互斥*/
semaphore mutex = 1;    //初始化信号量

P1()
{
...
P(mutex);        //使用临界资源前需要加锁
临界区代码段...
V(mutex);        //使用临界区资源后需要解锁
...
}

P2()
{
...
P(mutex);        //使用临界资源前需要加锁
临界区代码段...
V(mutex);        //使用临界区资源后需要解锁
...
}

实现进程同步

进程同步:令各并发进程按要求有序的推进(让本来异步并发的进程互相配合,有序推进)

异步性的体现:若分配给P1进程的时间片只允许该进程执行完自己的代码1和代码2,然后就要为P2进程分配时间片,若该时间片只允许该进程执行完自己的代码4,然后就要为P1进程分配......,这就导致代码段的执行顺序是未知的

实现步骤:

  1. 分析什么地方需要实现“同步关系”(必须保证“一前一后”执行的两个操作或两句代码)
  2. 设置同步信号量S,初始值为0(信号量S表示“某种资源”)
  3. 在“前操作”之后执行V(S)
  4. 在“后操作”之前执行P(S)

(前V后P)

/*信号量机制实现同步*/
semaphore S = 0;    //初始化同步信号量,初始值为0

P1()
{
    代码1:
    代码2;
    V(S);   //释放资源
    代码3;
}

P2()
{
    P(S);   
    代码4:
    代码5;
    代码6;
}

关于如何保证“代码4(后操作)一定是在代码2(前操作)之后执行”的解释:

  1. 若先执行到V(S)操作,则S++后S=1。之后执行到P(S)操作时,由于S=1,表示有可用资源,会执行S--,S的值变为0,P2进程不会执行block原语,而是继续向下执行代码4
  2. 若先执行到P(S)操作,由于S=0,S--后会S=-1,表示此时没有可用资源,因此P操作中会执行block原语,主动请求阻塞。之后当执行完代码2(时间片用完),继而执行V(S)操作,S++,使S变回0,由于此时有进程在该信号量对应的阻塞队列中,因此会在V操作中执行wakeup原语,唤醒P2进程。这样P2就可以继续执行代码4了
  3. 信号量S代表“某种资源”,刚开始是没有这种资源的,P2需要使用这种资源,而又只能由P1产生这种资源

实现进程的前驱关系

本节思维导图

~over~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/285537.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三层架构概述

三层架构就是把整个软件的代码分为三个层次,分层的目的是:规范代码,大型软件需要团队配合的时候问题就来了,由于每个程序员风格不一样,而开发软件大量的代码风格不统一就会造成后期调试和维护出现问题,然而…

Dryad数据库学习

从一篇science论文中看到数据存储在了这个平台,这里分享一下:datadryad.org 亲测无需注册,可以直接下载,从一个数据测试看,数据存储在亚马逊云,下载速度还可以,6M/s的样子。 Dryad 是一个开放的…

把类成员函数作为参数传递给thread类......

(1)把类成员函数作为参数传递给thread类 一般地,在调用类的非静态函数时,编译器会隐式添加一参数,它是所操作对象的地址, 用于绑定对象和成员函数,并且位于所有其他实际参数之前。例如,类example具有成员函…

SMD NTC Thermistor NTC热敏电阻(贴片式)

热敏电阻器(Thermistor)是一种电阻值对温度极为灵敏的半导体元件,又可分为负温度系数(NTC)热敏电阻和正温度系数(PTC) NTC热敏电阻用于温度测量,温度控制,温度补偿等&…

单片机快速入门

参考连接: 安装MinGW-64(在win10上搭建C/C开发环境)https://zhuanlan.zhihu.com/p/85429160MinGW-64; 链接:https://pan.baidu.com/s/1oE1FmjyK7aJPnDC8vASmCg?pwdy1mz 提取码:y1mz --来自百度网盘超级会员V7的分享野…

【力扣100】【好题】79.单词搜索

添加链接描述 class Solution(object):# 定义上下左右四个行走方向directs [(0, 1), (0, -1), (1, 0), (-1, 0)]def exist(self, board, word):""":type board: List[List[str]]:type word: str:rtype: bool"""m len(board)if m 0:return Fa…

Clojure 实战(4):编写 Hadoop MapReduce 脚本

Hadoop简介 众所周知,我们已经进入了大数据时代,每天都有PB级的数据需要处理、分析,从中提取出有用的信息。Hadoop就是这一时代背景下的产物。它是Apache基金会下的开源项目,受Google两篇论文的启发,采用分布式的文件…

怎么给直播录屏?超简单教程,一学就会!

随着直播行业的兴起,许多玩家和观众都希望能够录制直播内容以方便随时回顾或与他人分享。可是怎么给直播录屏呢?本文将详细介绍两种流行的直播录屏方法。通过学习这两种工具,你可以轻松实现直播录屏,记录并分享你的直播内容。 怎么…

一种安防场景下融合注意力机制和时空图卷积神经网络的人体动作识别方法与流程

本发明涉及模式识别与计算机视觉领域,尤其涉及一种安防场景下融合注意力机制和时空图卷积神经网络的人体动作识别方法。 背景技术: 视觉一直是人类获取外界信息的最重要、最直观的途径,据有关统计,人类获取信息的80%都…

2024-01-01 力扣高频SQL50题目 练习笔记

1. 1661求机器平均运行时间 在做这道题的时候,我遇到了4个问题 # 求平均的问题 如何找到个数? -> 相减对应列值后,直接average 就行。因为avg就是自动确定要除的个数(当然要联合正确的group by 分组) # 怎么根据machine_id和process_id…

主流大语言模型集体曝出训练数据泄露漏洞

内容概要: 安全研究人员发现,黑客可利用新的数据提取攻击方法从当今主流的大语言模型(包括开源和封闭,对齐和未对齐模型)中大规模提取训练数据。当前绝大多数大语言模型的记忆(训练数据)可被恢…

004、变量与可变性

1. 变量与可变性 在Rust中,变量默认是不可变的,这一设计是为了让你安全方便地写出复杂、甚至是并行的代码。 当然,Rust也提供了可使用的可变变量的方法,这个待会讨论。 当一个变量是不可变时,一旦它被绑定到某个值上面…

【Python动漫系列】HelloKitty(完整代码)

文章目录 HelloKitty环境需求完整代码HelloKitty Hello Kitty是一个非常受欢迎的卡通人物,以其可爱的形象和广泛的产品系列而闻名于世。Hello Kitty的形象是一个没有嘴巴的小白猫,穿着蓝色连衣裙和红色蝴蝶结。她有一对大大的眼睛和一个小小的鼻子,看起来非常可爱。 Hello…

Linux基础知识点(五-信号)

一、信号的基本概念 1.1 信号的概念 信号(signal),又称为软中断信号,用于通知进程发生了异步事件,它是Linux系统响应某些条件而产生的一个事件,它是在软件层次上对中断机制的一种模拟,是一种异…

创新美食体验:从零开始的同城上门做饭APP开发指南

同城上门做饭APP为用户提供了一种全新的用餐方式。本文将带领读者从零开始,探索同城上门做饭APP的开发过程,深入了解技术细节和创新要点。 1.了解用户需求 在着手开发同城上门做饭APP之前,首要任务是深入了解目标用户的需求。调查用户对于美…

直接形式1(三阶)补偿器

直接形式1(三阶)补偿器 直接形式1(DF1)结构是一种常见类型的离散时间控制结构,用于实现被指定为极点零点集或z(传递函数)中的有理多项式的控制律。 请注意,系数已被调整以标准化分母中 z 的最高幂。 一般…

【漏洞复现】冰峰VPN存在敏感信息泄露漏洞

漏洞描述 冰峰VPN log/system.log模块日志信息泄露漏洞 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利…

TinyEngine 服务端正式开源啦!!!

背景介绍 TinyEngine 低代码引擎介绍 随着企业对于低代码开发平台的需求日益增长,急需一个通用的解决方案来满足各种低代码平台的开发需求。正是在这种情况下,低代码引擎应运而生。它是一种通用的开发框架,通过对低代码平台系统常用的功能进…

yolov5简单手势识别

实验目的 实验要求只需要识别五个简单的手势即可,分别对应的一下五个动作 动作对应标签名点赞goodOKok单手比心love数字 5five数字8eight 使用yolov5实现目标检测功能,有一下几个主要步骤 环境配置(包括conda、labelimg、yolov5的下载&am…

2023海内外零知识证明学习资料汇总(二)(深入理解零知识证明篇)

工欲善其事,必先利其器 Web3开发中,各种工具、教程、社区、语言框架.。。。 种类繁多,是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役? 参见另一篇博文👉 2024最全面且有知识深度的web3开发工具、web3学习项目…