首页 > 其他分享 >信号量机制以及管道通信

信号量机制以及管道通信

时间:2024-08-16 18:54:40浏览次数:9  
标签:写端 通信 信号量 管道 线程 sem 资源

一、信号量(个数) 反映的是资源的数量
1.1、信号量定义

1、信号量 -----来描述 可使用的资源的个数

2、p操作 -----表示 使用这个资源 资源个数减一

1.2、p操作逻辑

尝试获取资源

有资源可用,直接使用,资源个数减一

如果没有资源则等待

v操作 ------产生这个资源 资源个数加1

1.3、v操作逻辑

释放一个资源

如果此时有任务,在等待这个资源,这个资源直接给对应的任务

如果没有任务需要使用这个资源,此时将这个资源个数加1

1.4、站在各线程角度上来看

1、写线程 ----p(写资源) //申请资源

buf[1024] //公共资源 //buf2[1024]

可以写数据 的条件

  1. 开始时,buf空的
  2. 读线程 读完了

2、v(读资源)

读线程//buf充当读资源

//一开始,buf中没有数据可可读的

读进程的条件

1、写线程结束

p(读资源)

v(写资源)

二、信号量机制操作过程
2.1 、基本概念

linux下的线程同步===》信号量机制 ===》semaphore.h
信号量的分类:
1、信号无名量==》线程问通信
2、有名信号量:==》进程间通信
框架:

  1. 信号量的定义
  2. 信号量的初始化
  3. 信号量的PV操作(核心)sem wait()/ sem post()
  4. 信号量的销毁。
2.2、 信号量的定义

sem_t sem 定义的是一类资源(有几种资源,建立几个变量 )

2.3、初始化

初始化的作用就是确定各类资源的个数

功能:将已经定义好的信号量赋值

参数

sem 要初始化的信号量

pshared:

  • 为0 ,表示线程间的使用的信号量
  •   不为0,表示进程间的使用的信号量

value:

  • 指定一个初始化的值,代表资源的个数

返回值

  • 成功返回0
  • 失败返回 -1
2.4、p操作

sem_wait(sem_t *p)表示p操作,将当前要使用的i资源传递进来,然后wait 函数进行判断
作用

判断当前sem信号量是否有资源可用。如果sem有资源(=1),则申请该资源,程序继续运行;如果sem没有资源(==0),则线程阻塞等待,一旦有资源则自动申请资源并继续运行程序。
注意:sem 申请资源后会自动执行sem=sem-1;sem 要判断的信号量资源参数。

返回值:

  • 成功0
  • 失败 -1

注意 

也就是说,我们用wait函数传递过去之后,他会自动进去判断资源有无,如果有,我们就进去使用,并且如果 有,先对资源个数减一,否则,没有在外围等待资源的到来  

2.5、v操作

int sem post(semt *sem);//v操作
功能:

函数可以将指定的sem信号量资源释放并默认执行,sem=sem+1,线程在该函数上不会阻塞。

参数:

  • sem 要释放资源的信号量

返回值:

  • 成功0
  • 失败 -1;
2.6、信号量的销毁
int sem destroy(sem t *sem)

功能:使用完毕将指定的信号量销毁

参数:sem要销毁的信号量

返回值:成功0,失败-1

三、进程通信
3.1、进程间的通信

进程创建好之后,父子进程的空间,相互独立

3.2、通信方式

//同一主机

1、古老的通信方式 管道:管道可以接收发送很多信息

  • 无名管道 (1)
  • 有名管道 (2)
  • 信号(7)

2、IPC对象通信 system v BSD suse fedora kernel.org

  • 消息队列(用的相对少,这里不讨论)(4)
  • 共享内存(*) //最高效 (5)
  • 信号量集() //信号量 用于进程间的(主要)(6)

//不同主机

3、socket通信

  • 网络通信(7)
3.3、管道

1、管道的特点

  1. 管道大小 65536字节 64k
  2. 管道操作特点
  • 数据读走之后,认为数据就没有了(水管)
  • //写端存在,读端也存在(前提)
  • 管道如果为空,此时可以一直写,直到写满
  • 管道空:可以写数据
  • 管道满:会造成-->写阻塞
  • //写端存在,读端不存在
  • 此时,写操作,会导致管道破裂,程序回收到SIGPIPE//这个信号会使得程序结束
  • //写端存在,读管道
  • 可以读管道,但是管道中没有数据了此时读操作 阻塞(阻塞的原因是因为写端没有关闭,还认为会有数据写入,等待数据的写入)
  • 管道空,读不到数据,这时会造成读操作阻塞
  • //写端不存在, 读管道
  • 可以读管道,但是管道中没有数据了此时读操作 不阻塞
3.4、管道底层逻辑
3.5、无名管道的创建 

单一方向的数据频道,可以用来进程间通信,

数组是用来返回两个文件描述符(可以对文件进行读写)是涉及管道的两端,[0]读端,[1]关联到写端,数据是从写端写入到内核直到他被读端读到。

功能:创建一个管道

参数:pipefd//用来获取 管道的两端,,[0]读端,[1]写端

返回值:成功 0;失败 -1 && errno

 

标签:写端,通信,信号量,管道,线程,sem,资源
From: https://blog.csdn.net/weixin_63722559/article/details/141258029

相关文章

  • 【linux学习指南】Linux管理文件与处理数据二(重定向与管道)
    文章目录......
  • 【现代通信技术】第五章 分组交换技术
    一、分组交换的基本原理   下面,我们将介绍一下分组的传输方式、分组经过路由器为何会产生时延、路由协议的基本概念。    在通信源端有需要传输的数据时,可以将信息分成若干个分组,并且在分组的首部填写好相应的控制字段。然后将分组送入网络进行传输,分组经过网......
  • Spring Boot集成Spring Cloud Bus进行消息总线通信
    SpringBoot集成SpringCloudBus进行消息总线通信大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在微服务架构中,服务之间的通信是一个常见需求。SpringCloudBus提供了一种基于消息总线的通信机制,可以用于服务间的配置更新、事件发布和订阅等场景......
  • Kubernetes中Pod间通信的详细解析
    目录同一个节点中Pod通信原理网络拓扑结构通信过程不同节点上的Pod通信原理网络拓扑结构通信过程同一个节点中Pod通信原理网络拓扑结构Pod:每个Pod都有一个唯一的IP地址(例如,172.16.3.2和172.16.3.3)。Pod内部的网络接口(eth0)连接到一个虚拟网络设备(veth)。虚拟网络设备(vethp......
  • 20240815有名管道双端线程通信
    //端1#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<string.h>#include<pthread.h>#include<errno.h>#include<......
  • BMS和AFE通信问题
    接插件导致通信失效问题报告问题描述:整个系统是由5个电池包组成,1个电池包外挂1个采集子板,每个子板共2个AFE.板间以及板内均为变压器隔离。由于储能项目一个标准箱子里面放置了两个电池包,因此这5个电池包,被分成2+2+1的形式放在3个封闭的箱体内。从箱子1到箱子2的菊花链会经过......
  • shell编程中的管道符 ‘|‘
    在Shell编程中,管道符`|`是一个非常有用的工具,用于将一个命令的输出传递给另一个命令作为输入。这种操作叫做管道(piping)。 具体来说,当你在Shell中使用`|`时,它会将前一个命令的标准输出(stdout)作为后一个命令的标准输入(stdin)。这允许你将多个命令组合在一起,实现复杂的操作......
  • UCOSIII信号量详解
    目录​编辑前言一、信号量的类型二、信号量的使用方法2.1创建信号量2.2请求信号量:2.3释放信号量:三、信号量的作用四、注意事项五、信号量的API函数六、代码实现6.1创建信号量6.2使用信号量前言UCOSIII信号量是UCOSIII操作系统中用于任务同步和互斥访问共......
  • 【高录用-超稳定EI检索】2024年第四届网络通信与信息安全国际学术会议(ICNCIS 2024,8月2
    2024年第四届网络通信与信息安全国际学术会议(ICNCIS2024)将于2024年8月23-25日于杭州召开。会议围绕网络通信在信息安全领域中的最新研究成果,为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供一个分享专业经验,扩大专业网络,面对面交流新思想......
  • 【MATLAB源码-第138期】基于matlab的D2D蜂窝通信仿真,对比启发式算法,最优化算法和随机
    操作环境:MATLAB2022a1、算法描述D2D蜂窝通信介绍D2D蜂窝通信允许在同一蜂窝网络覆盖区域内的终端设备直接相互通信,而无需数据经过基站或网络核心部分转发。这种通信模式具有几个显著优点:首先,它可以显著降低通信延迟,因为数据传输路径更短;其次,由于减少了基站的中转,可以提高......