进程同步的基本元素

目录

临界资源

临界区

信号量机制

整形信号量

记录型信号量

AND信号量

信号量集

信号量的应用

实现进程互斥

实现前驱关系

管程机制

总结


临界资源

I/O设备属于临界资源。著名的生产者-消费者问题就是关于临界资源的争夺产生的进程同步的问题。

生产者-消费者

描述:一群生产者生产产品,产品生成完以后运到仓库储存,仓库的大小有限,这里的仓库在表示中抽象成了缓冲区。一群消费者需要到仓库中取产品进行消费。

 

 代码:

#include "stdio.h"
#include "unistd.h"
#define MAXSIZE 100
int in = 0;
int out = 0;
int count[1] = {0};
int child_process_id = 0;
char buffer[MAXSIZE];
void producer();
void comsumer();
void main() {

    __pid_t pid = fork();
    //int n = 0;
    //count = &n;
    printf("The process id = %d\n", pid);
    if(pid == -1) {
        perror("fork error!");
    } else if(pid == 0){
        printf("Hello from child process: %d\n", getpid());
        child_process_id = getpid();
        comsumer();

    } else {
        printf("Hello from father process: %d\n", getpid());
        //__pid_t pid1 = fork();

        producer();

    }

}

void producer() {
    while (1)
    {
        while (*count == MAXSIZE){
            printf("producer:%d, %d\n", *count, getpid());

            scanf("%d", count);

        }
        in = (in+1)%MAXSIZE;
        (*count)++;
    }
    
}

void comsumer() {

    while (1)
    {
        //FILE *file = fopen("comsumer.txt", "w");
        //fputs(buffer, file);
        //fclose(file);

        while (*count == 0){
        printf("comsumer:%d, %d\n", *count, getpid());
        scanf("%d", count);
            
        }
        //getchar();

        out = (out+1)%MAXSIZE;
        (*count)--;   
        
        }
        printf("Comsumer exit!\n");
    
}

输出结果:

临界区

count可以理解为临界资源。

临界区:访问邻接资源的代码成为临界区。

访问count代码行成为临界区。

while (*count == MAXSIZE){//进入消费者临界区的条件

(*count)++;//生产者临界区

while (*count == 0){//进入消费者的临界区的条件

(*count)--;  

信号量机制

整形信号量

代码:

wait(S){

while(S <= 0) ;

S--;

}

signal(S) {

S++;

}

定义:

整形信号量S

简称

wait

P

signal

V

 

记录型信号量

代码:

typedef struct{

int value;

struct process_control_block *list;

}semaphore;

wait(semaphore *S) {

S->value--;

if(S->value < 0)block(S->list);

}

signal(semaphore *S) {

S->value++;

if(S->value<=0) wakeup(S->list);

}

S->value

某类资源的数目

S->list

等待使用某类资源的进程队列

block

阻塞进程队列,后续进程无法使用该类资源

wakeup

唤醒进程队列,可以使用该类资源

AND信号量

前面的信号量都是解决单个信号时出现的问题,如果出现两个或者以上的信号量呢?

信号量Dmutex = 1

信号量Emutex = 1

进程A:

进程B

由于并发进程存在随机性;所以存在以下的执行顺序:

A.P(Dmutex)

0

B.P(Emutex)

0

A.P(Emutex)

-1

A阻塞

B.P(Dmutex)

-1

B阻塞

伪码:

Swait(S1,S2,...,Sn)

{

while(true){

if(Si >=1 && ... Sn >=1) {

for(i = 1; i <=n; i++)Si--;

break;

} else {

将所有进程放入等待队列中

}

}

Ssignal(S1,S2,...,Sn)

{

while(true){

for(i = 1; i <=n; i++)Si--;

}

将所有进程放入就绪队列中

}

信号量集

如果一次性对多个进程的信号量做操作,同时每一次不是-1,而是减一个不确定值。信号量集可以解决这个问题。

Swait(S1,t1,d1,...,Sn,tn,dn);

Ssignal(S1,d1,...,Sn,dn);

信号量的应用

实现进程互斥

mutex的取值范围为-1,0,1时,结合以下的代码可以实现进程互斥。

while(1) {

wait(mutex);

临界区;

signal(mutex);

}

实现前驱关系

如果p1,p2进程存在p1->p2的关系,可以通过信号量机制,来实现前驱关系。

假设p1,p2都需要mutex = 0的信号量。

p1:signal(mutex);

p2:wait(mutex);

如果用有向图的理论来解释:

signal相当于p1到p2的边的起点,而wait相当于这条边的终点。

管程机制

管程是前面讲到的集中信号量机制的一个封装,统一的使用管程方法来实现进程的互斥,同步问题。


总结

本文从进程同步的一些基本元素:临界资源,临界区,信号量和管程机制,并且结合代码和伪码。来阐述一些概念。

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

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

相关文章

产品经理:做好有效的客户需求分析

需求分析是产品开发过程中的重要环节&#xff0c;它直接决定了产品是否能够满足市场需求和用户期望。通过深入了解客户需求&#xff0c;产品经理可以确保产品功能的设计符合用户的实际需求&#xff0c;从而提高产品的用户满意度和市场竞争力。 一、识别用户需求 识别用户需求…

mysql用户管理知识点

1、权限表 1.1、user表 1.1.1、用户列 Host、User、Password分别表示主机名、用户名、密码 1.1.2、权限列 决定了用户的权限&#xff0c;描述了在全局范围内允许对数据和数据库进行操作。 1.1.3、安全列 安全列有6个字段&#xff0c;其中两个是ssl相关的&#xff0c;2个是x509相…

虚拟仿真实训平台如何与不同专业进行融合?

虚拟仿真实训平台根据跨专业实训教学和职业培训的不同特点&#xff0c;兼顾实训课程设计的专业性和兼容性&#xff0c;根据不同专业特性确定虚拟仿真实训教学内容&#xff0c;研发虚拟仿真实训教学资源&#xff0c;优化人才培养方案和职业培训方案&#xff0c;改革实训教学体系…

游戏陪玩系统源码线上陪玩软件开发电竞陪练小程序陪玩APP

思维导图 规则说明 支持陪玩官&#xff0c;一级和二级&#xff0c;系统配置设置的是初始化佣金&#xff0c;可以单个设置某个人的佣金比例&#xff0c;分销模块只涉及到下单交易模块&#xff0c;其他的不参与&#xff0c;邀请的用户被下单&#xff0c;即可获得收益。 理解规则…

【面试笔记】C++ 软件开发工程师,智驾研发方向(非算法)

文章目录 1. 前言2. 基础问题2.1 什么是C++中的类?如何定义和实例化一个类?2.2 请解释C++中的继承和多态性。2.3 什么是虚函数?为什么在基类中使用虚函数?2.4 解释封装、继承和多态的概念,并提供相应的代码示例。2.5 如何处理内存泄漏问题?提供一些常见的内存管理技术。2…

LabVIEW冲击响应谱分析系统

LabVIEW冲击响应谱分析系统 开发了一种基于LabVIEW开发的冲击响应谱分析系统&#xff0c;该系统主要用于分析在短时间内高量级输入力作用下装备的响应。通过改进的递归数字滤波法和样条函数法进行冲击响应谱的计算&#xff0c;实现了冲击有效持续时间的自动提取和响应谱的精准…

13.56MHz电动车NFC刷卡解锁

随着电动车市场的快速发展&#xff0c;车主对车辆的智能化和便捷性的要求也在不断提升。仪表盘作为电动车的重要组成部分&#xff0c;不仅需要提供基本的行驶信息&#xff0c;还需要具备智能交互功能。 基于13.56MHz频率的NFC&#xff08;近场通信&#xff09;技术为电动车仪表…

李国武:六西格玛绿带项目的实施过程中可能遇到哪些问题?

作为六西格玛管理体系中的中坚力量&#xff0c;绿带项目在企业的转型升级中扮演着举足轻重的角色。然而&#xff0c;在实施六西格玛绿带项目的过程中&#xff0c;企业往往会遭遇一系列挑战。具体如深圳天行健企业管理咨询公司下文所述&#xff1a; 首先&#xff0c;人才与知识的…

雷士大路灯有必要买吗?雷士、书客、孩视宝护眼落地灯实测PK!

面对市面上众多的护眼大路灯品牌&#xff0c;其中雷士、书客和孩视宝这几款大路灯受到了广泛的青睐&#xff0c;也是热度比较高的几款产品&#xff0c;正是因为这么多款大路灯&#xff0c;很多伙伴在看到文章推荐后很纠结&#xff0c;不知道如何选择&#xff0c;也有一部分伙伴…

微信小游戏性能优化解决方案全新发布

小游戏凭借其简单易上手、玩法多样、互动性强的特点&#xff0c;迅速在市场中崭露头角。MMO、ARPG、卡牌等游戏类型也纷纷入局。玩家对启动时间长、发热、加载缓慢、闪退等问题也越来越敏感。 为了突破这些性能瓶颈&#xff0c;UWA全新发布了针对微信小游戏的性能优化解决方案…

水库大坝安全监测系统打通监控数据“最后一公里”

一、概述 我国有水库8万座左右&#xff0c;其中土石坝多数&#xff0c;病险水库占水库也很多。众所周知&#xff0c;水库在防洪、兴利上具有重要的调节作用&#xff0c;如何保证水库安全&#xff0c;及合理有效的利用水资源&#xff0c;是水利建设者需要探讨的主要内容。科学技…

OpenCV学习(4.2) 图像的几何变换

1.目标 学习将不同的几何变换应用到图像上&#xff0c;如平移、旋转、仿射变换等。你会看到这些函数: cv.getPerspectiveTransform 2.缩放 缩放是调整图片的大小。 OpenCV 使用 cv.resize() 函数进行调整。可以手动指定图像的大小&#xff0c;也可以指定比例因子。可以使用不…

【python】成功解决“ModuleNotFoundError: No module named ‘gensim’”错误的全面指南

成功解决“ModuleNotFoundError: No module named ‘gensim’”错误的全面指南 在Python编程中&#xff0c;尤其是进行文本挖掘和自然语言处理&#xff08;NLP&#xff09;时&#xff0c;gensim库是一个常用的工具&#xff0c;用于主题建模、文档相似度计算、词向量表示&#x…

【教程】使用 Tailchat 搭建团队内部聊天平台,Slack 的下一个替代品!

前言 多人协作&#xff0c;私有聊天一直是团队协作的关键点&#xff0c;现在有很多专注于团队协作的应用和平台&#xff0c;比如飞书、企业微信和Slack等。这期教程将带你手把手的搭建一个在线的团队协作向聊天室&#xff0c;希望对你有所帮助! 本期聊天室使用TailChat作为服务…

服务器数据恢复—raid5阵列上分配的卷被删除后重建如何恢复被删除卷的数据?

服务器存储数据恢复环境&#xff1a; 某品牌FlexStorage P5730服务器存储&#xff0c;存储中有一组由24块硬盘组建的RAID5阵列&#xff0c;包括1块热备硬盘。 服务器存储故障&#xff1a; 存储中的2个卷被删除&#xff0c;删除之后重建了一个新卷。需要恢复之前删除的一个卷的数…

【Java数据结构】二叉树详解(二)

&#x1f512;文章目录&#xff1a; 1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 2. 二叉树的模拟——正文 2.1获取树中节点的个数 2.2获取叶子节点的个数 2.3获取第K层节点的个数 2.4获取二叉树的高度 2.5 检测值为value的元素是否存在 …

明天15点!如何打好重保预防针:迎战HVV经验分享

在当今数字化时代&#xff0c;网络攻击日益猖獗&#xff0c;各行各业面临的网络安全威胁不断升级。从钓鱼邮件到复杂的APT攻击&#xff0c;网络犯罪分子的手法层出不穷&#xff0c;给各行各业的信息安全带来了前所未有的挑战。 在这样的背景下&#xff0c;"HVV行动"应…

【案例实战】 基于OpenCV实现鹿茸面积计算

学习《人工智能应用软件开发》&#xff0c;学会所有OpenCV技能就这么简单&#xff01; 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; 有人在我得B站答疑群里发了下面的图&#xff1a; 问&#xff1a;如何计算鹿茸最外圈蜡皮面积占整个鹿茸…

从人才战略到人才生态,金徽酒高增长的“明线”与“暗线”

执笔 | 文 清 编辑 | 扬 灵 2016年3月&#xff0c;金徽酒于A股上市&#xff0c;全年实现营收12.77亿元。2023年&#xff0c;金徽酒实现营收25.48亿元&#xff0c;比上市当年增加99.5%&#xff0c;近乎翻倍。而当我们深度关注金徽酒&#xff0c;在其业绩高增长的“明线”背…

弘君资本:半导体板块强势拉升,上海贝岭涨停,台基股份等大涨

半导体板块5日盘中强势拉升&#xff0c;到发稿&#xff0c;台基股份涨超15%&#xff0c;中晶科技、上海贝岭等涨停&#xff0c;国科微、长川科技涨超7%&#xff0c;紫光国微、富满微、金海通等涨超5%。 组织表示&#xff0c;半导体职业处于历史较低水平&#xff0c;大基金三期…