OneOS操作系统入门-07:任务同步与通信:信号量

一、信号量简介

1.1、信号量介绍

  信号量是一种用于控制对共享资源访问的同步机制,它在多线程编程和操作系统中非常常见。信号量的核心概念是计数器,这个计数器的值表示可用资源的数量或者执行特定任务的许可数量。

1.1.1、共享资源访问

举一个很常见的例子,某个停车场有 100 个停车位,这 100 个停车位大家都可以用,对于大家来说这 100 个停车位就是共享资源。 假设现在这个停车场正常运行,你要把车停到这个停车场肯定要先看一下现在停了多少车了? 还有没有停车位?当前停车数量就是一个信号量,具体的停车数量就是信号量值,当这个值到 100 的时候说明停车场满了。停车场满的时你可以等一会看看有没有其他的车开出停车场,当 有车开出停车场的时候停车数量就会减一,也就是说信号量减一,此时你就可以把车停进去了, 你把车停进去以后停车数量就会加一,也就是信号量加一。这就是一个典型的使用信号量进行 共享资源管理的案例,在这个案例中使用的就是计数型信号量。

1.1.2、任务同步

信号量的另一个重要的应用场合就是任务 同步,用于任务与任务或中断与任务之间的同步。在执行中断服务函数的时候可以通过向任务 发送信号量来通知任务它所期待的事件发生了,当退出中断服务函数以后在任务调度器的调度 下同步的任务就会执行。在编写中断服务函数的时候我们都知道一定要快进快出,中断服务函 数里面不能放太多的代码,否则的话会影响的中断的实时性。裸机编写中断服务函数的时候一 般都只是在中断服务函数中打个标记,然后在其他的地方根据标记来做具体的处理过程。在使 用 RTOS 系统的时候我们就可以借助信号量完成此功能,当中断发生的时候就释放信号量,中 断服务函数不做具体的处理。具体的处理过程做成一个任务,这个任务会获取信号量,如果获 取到信号量就说明中断发生了,那么就开始完成相应的处理,这样做的好处就是中断执行时间 非常短。这个例子就是中断与任务之间使用信号量来完成同步,当然了,任务与任务之间也可 以使用信号量来完成同步。

1.2、信号量原理详解

信号量的基本操作为 P 操作和 V 操作(通俗来讲,P 操作就是申请信号量,此时信号量的值会-1,而 V 操作恰好相反,V 操作会让信号量的值+1),假如信号量的值为 S。 则 P(S)的主要功能是:先执行 S=S-1;若 S>=0,则表示申请到资源,进程继续执行; 若 S<0 则无资源可用,阻塞该进程,并将它插入该信号量的等待队列 Q 中。 而 V(S)的主要功能是:先执行 S=S+1;若 S>0,则表示资源先前不为 0(资源足够), 原进程继续执行;若 S<=0 则表示资源先前不足,但是现在释放了一个资源,那么等待队列 Q 中的第一个进程将会被移出,使得其变为就绪状态并插入就绪队列,然后再返回原进程继续执行。下图可以表示 P 操作和 V 操作的简示图,可以利于更好的理解信号量的本质。

1.2.1、任务间信号量实现原理

信号量也是基于阻塞队列实现,每个信号量都对应有一个资源数,当信号量的资源数为 0 时,任务成功获取信号量就会导致任务阻塞,并且任务被放到阻塞队列,当另一个任务释放信 号量时,资源数加 1,将阻塞任务唤醒,并放到就绪队列,如下图所示。

图中(1),任务 1 先运行。

图中(2),任务 1 获取信号量,由于此时资源数为 0,获取失败。

图中(3),任务 1 被放到阻塞队列。

图中(4),任务 2 运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值