进程同步的基本元素

news2024/11/16 23:52:56

目录

临界资源

临界区

信号量机制

整形信号量

记录型信号量

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相当于这条边的终点。

管程机制

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


总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阅读 Spring(SpringBoot)源码的一些实用技巧

前言 我们在阅读Spring&#xff08;SpringBoot&#xff09;源码的时候&#xff0c;有可能会被一下前置知识点卡住&#xff0c;影响继续阅读的动力。根据我对Spring的理解&#xff0c;整理一些实用的技巧&#xff0c;减少大家的阅读障碍。如果有什么不正确的地方欢迎大家指正、…

辞职后,如何理性面对公司的挽留?我的职场选择之路

辞职后&#xff0c;面对公司的挽留&#xff0c;你会决定留下还是离开呢&#xff1f;这是一个让人犹豫不决的问题。 让我们来分析一下个人在职场中的价值和期望。每个人都有自己的职业规划和发展目标&#xff0c;这是非常正常的。在工作中&#xff0c;我们希望自己能够得到充分的…

React路由(React笔记之五)

本文是结合实践中和学习技术文章总结出来的笔记(个人使用),如有雷同纯属正常((✿◠‿◠)) 喜欢的话点个赞,谢谢! React路由介绍 现在前端的项目一般都是SPA单页面应用,不再是以前多个页面多套HTML代码项目了,应用内的跳转不需要刷新页面就能完成页面跳转靠的就是路由系统 R…

IPFS节点部署及连接java服务接口

文章目录 引言前言&#xff1a;IPFS网络部署1.下载安装文件2.安装及初始化3.测试上传文件 引入IPFS 依赖包初始化IPFS创建接口类以及实现类创建前端访问的控制类前端设计及验证 引言 该篇文章是记录使用IPFS存储文件与java的Springboot项目连接的过程&#xff0c;前端简单地用…

傲医医疗集成引擎 Rhapsody 在超融合信创平台表现如何?

作者&#xff1a;SmartX 商业团队 黄玉辉 随着越来越多的医疗用户基于超融合基础设施实现 IT 基础架构信创转型&#xff0c;超融合信创架构在医疗业务场景中的实际表现也得到更多关注。尤其是集成平台业务场景——作为三甲医院互联互通评级中不可缺少的核心业务系统&#xff0…

使用Ollama+OpenWebUI本地部署Gemma谷歌AI开放大模型完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; &#x1f916;Ollama部署LLM专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月4日10点50分 &#x1f004;️文章质量&#xff1…

Spring Boot既打jar包又打war包如何做

你好&#xff0c;我是柳岸花开。 引言 在软件开发中&#xff0c;根据不同的部署需求&#xff0c;我们可能需要将应用打包成不同的格式。Spring Boot作为目前流行的Java应用开发框架&#xff0c;提供了一种简单的方式来打包应用。本文将介绍如何利用Maven Profiles在Spring Boot…

Photoshop版本选择及系统要求

1、ps2018cc/2020cc版本 适合新手&#xff0c;增加了很多智能化操作&#xff0c;非常方便好上手。 2020&#xff1a; 2、ps2015版本 cc2015版本不论是功能还是硬件上&#xff0c;都是不二选择&#xff0c;适合于配置较低的电脑&#xff0c;该有的基本功能它都有。 3、2021/2…

【最新鸿蒙应用开发】——一篇搞懂什么是UIAbility

UIAbility组件 UIAbility组件是一种包含UI的应用组件&#xff0c;UIAbility组件是系统调度的基本单元&#xff08;最小单元&#xff09;&#xff0c;为应用提供绘制界面的窗口&#xff0c;主要用于和用户交互。一个应用可以包含一个或多个UIAbility组件。 UIAbility的设计理念…

PySpark特征工程(III)--特征选择

有这么一句话在业界广泛流传&#xff1a;数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已。由此可见&#xff0c;特征工程在机器学习中占有相当重要的地位。在实际应用当中&#xff0c;可以说特征工程是机器学习成功的关键。 特征工程是数据分析…

Windows下 CLion中,配置 OpenCV、LibTorch

首先按照win下C部署深度学习模型之clion配置pytorchopencv教程记录 步骤配置。 LibTorch 部分 在测试LibTorch时会出现类似 c10.dll not found 的问题&#xff08;Debug才有&#xff09;&#xff1a; 参考C部署Pytorch&#xff08;Libtorch&#xff09;出现问题、错误汇总和 …

git常见问题及解决

文章目录 git常见问题及解决1. 不同操作系统使用git时&#xff0c;CRLF的处理换行问题1.1 什么是CRLF和LF1.2 在Git中设置自动转换 2. 多个仓库相同代码推送被拒绝3. git使用vi编辑器时候报错&#xff1a;Swap file "./.git/.COMMIT_EDITMSG.swp" already exists!4. …

3. redis常见部署架构

redis常见部署架构 一、redis常见部署架构1、常见部署架构2、多实例部署2.1 规划安装目录、配置文件2.2.2 编辑实例配置文件2.2.3 启动实例2.2.4 测试数据读写 3、redis主从复制3.1 规划3.2 从服务器配置3.3 验证主从状态3.4 主从角色切换 4、分片集群4.1 原理4.2 分片集群的部…

completefuture造成的rpc重试事故

前言 最近经历了一个由于 completefuture 的使用&#xff0c;导致RPC重试机制触发而引起的重复写入异常的生产bug。复盘下来&#xff0c;并非是错误的使用了completefuture&#xff0c;而是一些开发时很难意识到的坑。 背景 用户反馈通过应用A使用ota批量升级设备时存在概率…

美容美发门店收银管理系统源码分享-美业系统App端闪退怎么办?

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 活动促销 PC管理后台、手机APP、iPad APP、微信小程序 ▶ 手机App应用闪退怎么办&#xff1f;博弈美业系统为例 • 可能原因&#xff1a; 1、手机版本过低 2、未更新…

第二证券炒股技巧:短线炒股技巧?

在股票商场上&#xff0c;出资者分为长线和短线这两大类&#xff0c;其间短线炒股存在以下技巧&#xff1a; 1、早盘集合竞价时间上的技巧 早上集合竞价对短线出资者来说比较重要&#xff0c;其间早上集合竞价期间9&#xff1a;15-9:20之间出资者能够进行撤单操作&#xff0c…

Spring boot集成通义千问大模型实现智能问答

Spring boot集成通义千问大模型实现智能问答 背景 我在用idea进行java开发时发现了通义灵码这款免费的智能代码补全插件&#xff0c;用了一段时间了&#xff0c;感觉很不错。就想着在自己的项目中也能集成通义千问大模型实现智能回答&#xff0c;毕竟对接openai需要解决网络问…

【WEEK15】 【DAY1】异步任务【中文版】

2024.6.3 Monday 目录 17.异步、定时、邮件任务17.1.异步任务17.1.1.新建springboot-09-test项目17.1.2.创建一个service包17.1.2.1.创建一个类AsyncService 17.1.3.编写controller包17.1.3.1.编写AsyncController类 17.1.4.运行Springboot09TestApplication.java17.1.5.修改S…

Python课设-学生信息管理系统

一、效果展示图 二、前端代码 1、HTML代码 <1>index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

【Unity美术】spine软件的使用—2D动画的制作

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…