一、信号量(个数) 反映的是资源的数量
1.1、信号量定义
1、信号量 -----来描述 可使用的资源的个数
2、p操作 -----表示 使用这个资源 资源个数减一
1.2、p操作逻辑
尝试获取资源
有资源可用,直接使用,资源个数减一
如果没有资源则等待
v操作 ------产生这个资源 资源个数加1
1.3、v操作逻辑
释放一个资源
如果此时有任务,在等待这个资源,这个资源直接给对应的任务
如果没有任务需要使用这个资源,此时将这个资源个数加1
1.4、站在各线程角度上来看
1、写线程 ----p(写资源) //申请资源
buf[1024] //公共资源 //buf2[1024]
可以写数据 的条件
- 开始时,buf空的
- 读线程 读完了
2、v(读资源)
读线程//buf充当读资源
//一开始,buf中没有数据可可读的
读进程的条件
1、写线程结束
p(读资源)
读
v(写资源)
二、信号量机制操作过程
2.1 、基本概念
linux下的线程同步===》信号量机制 ===》semaphore.h
信号量的分类:
1、信号无名量==》线程问通信
2、有名信号量:==》进程间通信
框架:
- 信号量的定义
- 信号量的初始化
- 信号量的PV操作(核心)sem wait()/ sem post()
- 信号量的销毁。
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、管道的特点
- 管道大小 65536字节 64k
- 管道操作特点
- 数据读走之后,认为数据就没有了(水管)
- //写端存在,读端也存在(前提)
- 管道如果为空,此时可以一直写,直到写满
- 管道空:可以写数据
- 管道满:会造成-->写阻塞
- //写端存在,读端不存在
- 此时,写操作,会导致管道破裂,程序回收到SIGPIPE//这个信号会使得程序结束
- //写端存在,读管道
- 可以读管道,但是管道中没有数据了此时读操作 阻塞(阻塞的原因是因为写端没有关闭,还认为会有数据写入,等待数据的写入)
- 管道空,读不到数据,这时会造成读操作阻塞
- //写端不存在, 读管道
- 可以读管道,但是管道中没有数据了此时读操作 不阻塞
3.4、管道底层逻辑
3.5、无名管道的创建
单一方向的数据频道,可以用来进程间通信,
数组是用来返回两个文件描述符(可以对文件进行读写)是涉及管道的两端,[0]读端,[1]关联到写端,数据是从写端写入到内核直到他被读端读到。
功能:创建一个管道
参数:pipefd//用来获取 管道的两端,,[0]读端,[1]写端
返回值:成功 0;失败 -1 && errno
标签:写端,通信,信号量,管道,线程,sem,资源 From: https://blog.csdn.net/weixin_63722559/article/details/141258029