×

信号量

p.v.的什么是信号量?什么是信号量

admin admin 发表于2023-04-26 22:55:53 浏览56 评论0

抢沙发发表评论

本文目录

p.v.的什么是信号量

信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。
一般来说,信号量S》=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个单位资源,因此S的值减1;
当S《0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。而执行一个V操作意味着释放一个单位资源,因此S的值加1;
若S《=0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
利用信号量和PV操作实现进程互斥的一般模型是:
进程P1 进程P2 …… 进程Pn
…… …… ……
P(S); P(S); P(S);
临界区; 临界区; 临界区;
V(S); V(S); V(S);
…… …… …… ……
其中信号量S用于互斥,初值为1。
使用PV操作实现进程互斥时应该注意的是:
(1)每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。
(2)P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。
(3)互斥信号量的初值一般为1。
利用信号量和PV操作实现进程同步
PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。

什么是信号量

信号量(Semaphore)-- 相当一个信号灯,程序里是一个非负整数,表示状态.
可以用来保护两个或多个关键代码段,这些关键代码段不能并发调用。在进入一个关键代码段之前,线程必须获取一个信号量。如果关键代码段中没有任何线程,那么线程会立即进入该框图中的那个部分。一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量,然后将Acquire Semaphore 以及Release Semaphore 分别放置在每个关键代码段的首末端。确认这些信号量引用的是初始创建的信号量。

信号量的物理意义

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。
以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。
在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用。
分类
整型信号量(integer semaphore):信号量是整数
记录型信号量(record semaphore):每个信号量s除一个整数值s.value(计数)外,还有一个进程等待队列s.L,其中是阻塞在该信号量的各个进程的标识
二进制信号量(binary semaphore):只允许信号量取0或1值
每个信号量至少须记录两个信息:信号量的值和等待该信号量的进程队列。它的类型定义如下:(用类PASCAL语言表述)
semaphore = record
value: integer;
queue: ^PCB;
end;
其中PCB是进程控制块,是操作系统为每个进程建立的数据结构。
s.value》=0时,s.queue为空;
s.value《0时,s.value的绝对值为s.queue中等待进程的个数;

信号量的介绍

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。

信号量的分类

整型信号量(integer semaphore):信号量是整数
记录型信号量(record semaphore):每个信号量s除一个整数值s.value(计数)外,还有一个进程等待队列s.L,其中是阻塞在该信号量的各个进程的标识
二进制信号量(binary semaphore):只允许信号量取0或1值
每个信号量至少须记录两个信息:信号量的值和等待该信号量的进程队列。它的类型定义如下:(用类PASCAL语言表述)
semaphore = record
value: integer;
queue: ^PCB;
end;
其中PCB是进程控制块,是操作系统为每个进程建立的数据结构。
s.value》=0时,s.queue为空;
s.value《0时,s.value的绝对值为s.queue中等待进程的个数;

什么是信号量机制

信号量机制
目录
1摘要
2基本信息
(2)若S减1后仍大于或等于零,则进程继续执行; 信号量机制分 信号量集的定义:
基本信息
提出时间
1965年
  1965年,荷兰学者Dijkstra提出了利用信号量机制解决进程同步问题,信号量正式成为有效的进程同步工具,现在信号量机制被广泛的用于单处理机和多处理机系统以及计算机网络中。
  信号量S是一个整数,S大于等于零时代表可供并发进程使用的资源实体数,但S小于零时则表示正在等待使用临界区的进程数。
  Dijkstra同时提出了对信号量操作的PV原语。
  P原语操作的动作是:
  (1)S减1;
  (2)若S减1后仍大于或等于零,则进程继续执行;
  (3)若S减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。
  V原语操作的动作是:
  (1)S加1;
  (2)若相加结果大于零,则进程继续执行;
  (3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语行期间不允许有中断的发生。
  信号量机制分 整型信号量机制、记录型信号量机制、and型信号量机制、信号量集。
  整型信号量是一种最简单的信号量,主要用于解决并发程序互斥访问临界资源问题。
  记号信号量在整型信号量的举出上进行了改进,让不能进入临界区的进程“让权等待”,即进程状态有运行转换为阻塞状态,进程进入阻塞队列中等待。
  AND型信号量集是将进程在运行中所需要的临界资源全部一次性分配给进程,等进程用完后再全部一次释放。
  信号量集的定义:
  1.用s1、s2、...sn分别表示有n类裂解资源信号量;
  2.用d1、d2、...dn分别表示进程需要的每类临界资源个数;
  3.用t1、t2、...tn分别表示每类临界资源分给进程的下限值;

信号量机制怎么理解

信号量:信号量(Semaphores)的数据结构由一个值value和一个进程链表指针L组成,信号量的值代表了资源的数目,链表指针链接了所有等待访问该资源的进程。
PV操作:通过对信号量S进行两个标准的原子操作(不可中断的操作)wait(S)和signa(S),可以实现进程的同步和互斥。这两个操作又常被称为P、V操作,其定义如下:
  P(S):①将信号量S的值减1,即S.value=S.value-1;
   ②如果S.value≥0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
  V(S):①将信号量S的值加1,即S.value=S.value+1;
   ②如果S.value》0,则该进程继续执行;否则释放S.L中第一个的等待进程。
说明:S.value代表可用的资源数目,当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。
   一次P操作意味着请求分配一个单位资源,因此S.value减1,当S.value《0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。
   而执行一次V操作意味着释放一个单位资源,因此S.value加1;若S≤0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去

说明使用信号量实现的功能,为什么能实现这样的功能,都使用了哪些数据结构


1.String——字符串String数据结构是简单的key-value类型,value不仅可以是String,也可以是数字(当数字类型用Long可以表示的时候encoding就是整型,其他都存储在sdshdr当做字符串)。使用Strings类型,可以完全实现目前Memcached的功能,并且效率更高。还可以享受Redis的定时持久化(可以选择RDB模式或者AOF模式),操作日志及Replication等功能。除了提供与Memcached一样的get、set、incr、decr等操作外,Redis还提供了下面一些操作:2.Hash——字典在Memcached中,我们经常将一些结构化的信息打包成hashmap,在客户端序列化后存储为一个字符串的值(一般是JSON格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,通常需要将字符串(JSON)取出来,然后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。简单修改一个属性就干这么多事情,消耗必定是很大的,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。3.List——列表List说白了就是链表(redis使用双端链表实现的List),相信学过数据结构知识的人都应该能理解其结构。使用List结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的TimeLine)。List的另一个应用就是消息队列,可以利用List的*PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段元素的API,你可以直接查询,删除List中某一段的元素。4.Set——集合Set就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的Set数据结构,可以存储一些集合性的数据。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为Redis非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。1.共同好友、二度好友2.利用唯一性,可以统计访问网站的所有独立IP3.好友推荐的时候,根据tag求交集,大于某个threshold就可以推荐5.SortedSet——有序集合和Sets相比,SortedSets是将Set中的元素增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如一个存储全班同学成绩的SortedSets,其集合value可以是同学的学号,而score就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用SortedSets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

信号量的操作方式


对信号量有4种操作(include《semaphore》):
1. 初始化(initialize),也叫做建立(create) int sem_init(sem_t *sem, int pshared, unsigned int value);
2. 等信号(wait),也可叫做挂起(suspend)int sem_wait(sem_t *sem);
3. 给信号(signal)或发信号(post) int sem_post(sem_t *sem);
4.清理(destroy) int sem_destory(sem_t *sem);


信号量是什么有什么区别使用信号量进行任务间通信有何优缺点


一:UCOS是一种抢占式的多任务操作系统,如果最高优先级的任务不主动放弃CPU的使用的话,其他任务是无法运行的,通常情况下,高优先级的任务在使用完CPU或其他资源后都要主动放弃,可以通过延时函数或者时等待一些信号量之类的让自己挂起。但是如果最高优先级任务一直使用CPU,那就跟单任务没有什么区别了。
二:可以通过等待信号量,消息等是当前任务挂起,或者通过通过延时函数将任务挂起,从而让其他优先级的任务运行。
UC/OS的信号量,消息队列,邮箱的区别
信号量像一把钥匙,任务要运行下去,需先拿到这把钥匙。
消息邮箱是一个指针型变量。可以向一个任务或一个中断服务子程序发送一则消息(一个指针),同样,一个或多个任务通过内核服务,可以接收这则消息。消息邮箱也可以当作只取2个值的信号量来用。
消息队列实际上是邮箱阵列。