【Linux操作系统】互斥的4个概念以及认识信号量

文章介绍了进程互斥的四个概念,包括公共资源、互斥、临界资源和临界区,强调了原子性的重要性。接着详细讲解了信号量的概念,将其比喻为电影院的票务系统,说明了P操作(申请资源)和V操作(释放资源)的工作原理。还提到了如何创建、查看和删除信号量的接口,并给出了semop函数用于操作信号量的详细信息。
摘要由CSDN通过智能技术生成


信号量主要用于同步和互斥的,下面先来看看什么是同步和互斥。

进程互斥的4个概念

我们把大家都能看到的资源,称为公共资源。并且要想实现进程间通信,首要条件就是要让互相通信的进程看到同一份资源。

  • 互斥:由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥,所以任何一个时刻,都只允许一个执行流在进行共享资源的访问。(解决方法:加锁)
  • 我们把任何一个时刻,都只允许一个执行流在进行访问共享资源,叫做临界资源或互斥资源。
  • 临界资源是要通过代码访问的,凡是访问临界资源的代码,叫做临界区(在进程中涉及到互斥资源的程序段叫临界区)。
  • 原子性:要么不做,要么做完,只有两种确定状态的属性。
  • 特性方面:IPC资源必须删除,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核

认识信号量

信号量又称信号灯,本质是一个描述资源数量的计数器。

任何一个执行流,想访问临界资源中的一个子资源时,都不能直接访问,必须先申请信号量资源,相当于计数器count–(资源数量减1,OS会进行资源数量的判断,如果资源用完了,就会被挂起,阻塞进程,直到有进程将资源释放),申请成功后,才能进入自己的临界区,访问对应的临界资源。最后释放信号量资源,相当于把计数器count++(资源数量加1),只要将计数器增加,就表示将我们对应的资源进行了归还,这分别称为PV(荷兰语:通过and释放)操作。
在这里插入图片描述

可以类比生活中的电影院,看电影之前,我们得先买票,而买票的的本质功能就是对座位资源的预定机制,并且确保不会导致座位冲突。
假设我们要看晚上18:00的《蜘蛛侠:纵横宇宙》,我们得先申请座位,若预定座位成功了,则座位资源(临界资源就会减减),如果这一场电影的票被卖完了,那么我们就阻塞住了,直到有人退票(临界资源++),我们才能预定电影院放映厅的座位资源。

所有进程都必须先看到同一份信号量,竟然这样,那么信号量也是共享资源咯,所以信号量被归类到了进程间通信,但它不以传送数据为目的,而以让不同的进程看到同一份计数器为目的,并且信号量必须保证的++,–操作是保证原子性的。

认识接口

创建获取信号量

在这里插入图片描述

查看删除信号量——ipc

ipcs -s //查看信号量
ipcrm -s semid //释放信号量
或者使用semctl删除,类似共享内存。

控制信号量

在这里插入图片描述
在这里插入图片描述

信号量的数据结构如下:

在这里插入图片描述

信号量加减

对信号量集进行操作我们需要用semop函数,semop函数的函数原型如下:

int semop(int semid, struct sembuf *sops, unsigned nsops);

功能:
semop是用于操作信号量的系统调用函数之一,它可以实现对信号量进行P、V操作,从而解决多进程或多线程之间的互斥和同步问题。当一个进程要访问共享资源,需要调用semop函数执行P操作,该操作会将信号量减1,如果值小于0,则当前进程会被阻塞住,直到有其它进程执行V操作使信号量加加,释放共享资源。

  1. P操作:我们将申请信号量的操作叫做P操作,申请信号量的本质就是有权限访问临界资源,申请成功后,P操作的本质就是让计数器–即可
  2. V操作:将释放信号量叫做V操作,归还临界资源,V操作的本质是让计数器++

参数解读:

  • semid:要操作的信号量标识符,由semget函数返回。
  • sops:类型是struct sembuf*,是一个指向sembuf结构体数组的指针,表示要对哪些信号量进行操作,sembuf结构体需要我们自己定义,它包括三个成员变量,分别是:sem_num(要操作的信号量在信号量集合中的下标),sem_op(对信号量执行的操作,负值代表P操作,正值代表V操作,0表示不做任何操作),sem_flg(控制操作行为的标志,默认SEM_UNDO在进程异常终止时撤销未完成的操作,因为信号量要保证其原子性)。
  • nsops:表示要执行操作的sembuf结构体数量。

理解IPC

在这里插入图片描述

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_麦子熟了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值