进程间通信(3)信号量初识

在这里插入图片描述

临界资源和临界区

我们首先要理解,什么时临界资源,临界区呢?
1).临界资源是被保护起来的资源
2).临界区就是访问临界资源的代码
那么共享内存是临界资源吗?答案是不是,因为普通的共享内存并没有被保护起来。
那么我们如何对共享资源进行保护呢?

如何保护临界资源

保护一个临界资源,我们无外乎要做到两点,1.同步,2.互斥。
1).同步:同步保证了进程访问临界资源有一定的顺序
2).互斥:互斥保证了在同一时间只有一个进程访问临界资源
只要满足上述两点,就能保证各个进程对临界资源的写入和读出,都是合法有序的。
那么我们如何保护临界资源呢,我们可以通过信号量

什么是信号量

信号量是IPC资源,信号量可以理解为一个计数器,在某个进程要访问临界资源时,需要先申请信号量,预留资源
在操作系统中,将申请信号量的操作称为P操作, 释放信号量被称为V操作。
在这里插入图片描述
对于一块资源,我们可以将其分成多份,让每一份都满足互斥和同步,这样对于一块临界资源,我们就可以实现并发访问了。
要实现互斥,则一个信号量就足够了。
若要实现同步,则需要给每个小空间都分配一个信号量。
所以信号量就是实现同步和互斥,从而保护临界资源
而信号量之所以属于进程间通信,这是因为对于多个要访问临界资源的进程,首先要申请信号量,要申请信号量,则要保证进程们可以看到同一份资源,所以信号量不能由任意通信的进程单方提供,最好由操作系统提供,并且信号量要满足原子性。

信号量的接口

信号量的接口和共享内存十分相似。
1).semget接口申请信号量。
在这里插入图片描述

1).参数key,和共享内存一样,也是提供ftok函数生成一个key,同时该key值也是操作系统用于识别唯一的信号量的值。
2).参数nsems,用户创建的信号量的个数。
3).参数semflg,也同共享内存一样,有两个选项,详情可以去看共享内存那篇文章。
该接口返回值为信号量集标识符,可以表示一个信号量,如果申请失败,返回-1。
在这里插入图片描述

2).semctl接口控制信号量
在这里插入图片描述

1).参数semid,表示对哪一个信号量进行控制。
2).参数semnum,代表对该信号量中的哪一个信号量进行操作,因为返回的信号量标识符代表某个信号量集,这就代表该信号量集中有很多信号量。
3).参数cmd,和共享内存的shmctl的cmd参数相同。
返回值成功返回0,失败返回-1。

3).semop接口操作某个信号量
在这里插入图片描述

1).参数semid,表示对哪一个信号量进行操作。
2).参数sops,是一个结构体,并且是一个返回参数,可以让我们获得信号量的属性。
3).参数nsops,表示要对该信号量集中的那个信号量操作。
返回值如果成功返回0,失败返回-1。

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值