信号量机制以及管道通信

一、信号量(个数) 反映的是资源的数量
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

 

  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值