精华内容
下载资源
问答
  • 互斥信号量

    2021-05-08 16:40:32
    使多个进程能互斥的访问某临界资源,只需该资源设置一互斥信号量mutex,并设初始值1,然后将各进程访问该资源的临界区置于wait(mutex)和signal(mutex)操作之间即可。 互斥信号量值的描述: 初值1,取值范围...

    临界资源必须是互斥的访问,即一段时间内只能让一个进程访问,对应临界区。
    p(s)—申请资源—wait(s)
    v(s)—释放资源—signal(s)

    为使多个进程能互斥的访问某临界资源,只需为该资源设置一互斥信号量mutex,并设初始值为1,然后将各进程访问该资源的临界区置于wait(mutex)和signal(mutex)操作之间即可。

    互斥信号量值的描述:
    初值为1,取值范围为(-1,0,1)。
    当 mutex=1 时,表示两个进程皆未进入需要互斥的临界区;
    当 mutex=0 时,表示有一个进程进入临界区运行,另外一个必须等待,改入阻塞队列;
    当 mutex=-1时,表示有一个进程正在临界区运行,另一个进程因等待而阻塞在信号量队列中,需要被当前已在临界区运行的进程退出时唤醒。

    展开全文
  • 互斥信号量的初值一般设1 2、用途 (1)同步信号量的用途:防止被抢占 初始空 低优先级的任务持有信号量,高优先级的任务需要这个信号量,只有当低优先级的任务give(释放)信号量,高优先级的任务才能take...

    1、初值
    同步信号量的初值一般设为0;
    互斥信号量的初值一般设为1

    2、用途
    (1)同步信号量的用途:防止被抢占 初始为空
    低优先级的任务持有信号量,高优先级的任务需要这个信号量,只有当低优先级的任务give(释放)信号量,高优先级的任务才能take(获取)信号量。通过这种机制低优先级的任务就可以防止被高优先级的任务抢占。give和take是分别在两个任务里做的。

    (2)互斥信号量的用途:对临界区上锁 初始为满
    当一个任务想对临界区访问时,为了防止别的任务也对该临界区操作,它需要对该临界区上锁,即take(获取)一个互斥的信号量,以保证独享。当该任务take(获取)一个互斥的信号量以后,它仍然能被高优先级的任务抢占,但高优先级的用户仍然无法访问它已经上锁的临界区。而解锁也是由上锁的任务来做的。take和give是在一个任务里完成的。

    3、值的含义
    (1)同步信号量,值为资源可以使用的个数,信号量小于0,则线程进行等待,信号量大于0,表示可用资源个数。初始值0.
    (2)互斥信号量只有两个值0或1,0表示资源正在被占用,线程等待。1表示,资源没有被使用,线程可以进入。初始值为1

    展开全文
  • UCOSIII信号量和互斥信号量

    千次阅读 2016-08-08 10:58:12
    在可剥夺的内核中,当任务独占式使用共享资源的时候,会低优的任务高于高级优先任务运行的现象,这个现象叫做优先级反转,未来了解决这个优先级反转的问题,UCOSIII引入可互斥信号量这个概念。信号量 信号量像是一种...
    在UCOSIII中可能会偶多个任务会访问共享资源,因此信号量最早用来控制任务存取共享资源,现在信号量也被用来实现任务间的同步以及任务和ISP同步。在可剥夺的内核中,当任务独占式使用共享资源的时候,会低优的任务高于高级优先任务运行的现象,这个现象叫做优先级反转,未来了解决这个优先级反转的问题,UCOSIII引入可互斥信号量这个概念。
    
    信号量
    信号量像是一种上锁机制,代码必须获得对应的钥匙才能继续执行,一旦获得了钥匙也就意味着该任务具有进入被锁部分代码的权限 。一旦执行至被锁代码段,则任务一直等待到对应被锁部分代码的钥匙再次释放才能继续执行。
    信号量分为两种:二进制与计数型,二进制信号量只能取0和1两个值,计数型信号量不止可以取2个值,在共享资源中只要有任何可以使用信号量,中断服务程序则不能使用。
    1.二进制信号量
    某一资源对应的信号量为1的时候,那么就可以使用这一资源,如果对应信号量为 0,那么等待该信号量的任务就会被放进表中。在等待信号量的时候也可以设置超时,如果过设定的间任务没有等到信号量话那么该就会进入绪态。任务以“发信号”的方式操作信号量。 可以看出如果一个信号量为二进制的话,一次只能一个任务使用共享资源。
    2.计数型信号量
    有时候我们需要可以同时有多个任务访问共享资源,这个时候二进制信号量就不能使用了,计数型信号量就是用来解决这个问题的。比如某一个信号量初始化值为10,那么只有前10个请求该信号的任务可以使用共享资源,以后的任务需要等待前10个任务释放掉信号量。每当有任务请求信号量的时候,信号量的值就会减1,知道减为0.当有任务释放掉信号量的时候信号量就会加1.
    ![信号量API函数](https://img-blog.csdn.net/20160808103057934)
    
    创建互斥型信号量
    创建互斥型信号量使用函数OSMutexCreate()
    p_mutex : 指向互斥型信号量控制块。互斥型信号量必须有用户应程序进行实际分配,可以使用如下所示代码。
        OS_MUTEX MyMutex;
    p_name: 互斥信号量的名字
    p_err: 调用此函数后返回的错误码。
    
    请求互斥型信号量
    当一个任务需要对资源进行独占式访问的时候就可以使用函数OSMutexPend(),如果该互斥信号量正在被其他的任务使用,那么UCOSIII就会将强求这个互斥信号量的任务放置在这个互斥信号量的等待表中。任务会一直等待,知道这个互斥信号被释放掉,或者设定的超时时间到达位置。如果在设置的超时时间到达之前信号量被释放,UCOSIII将会恢复所有等待这个信号量中的优先级最高的任务。
    注意!如果占用该互斥信号量的任务比当前申请互斥信号量的任务优先级低的话,OSMutexPend()函数将会占用该互斥信号量的任务优先级提到和当前申请任务的优先级一样。当占用互斥信号量的任务释放掉该互斥信号后,恢复到之前的优先级。
    p_mutex : 指向互斥信号量。
    timeout : 指定等待互斥信号量的超时间(钟节拍数),如果在指定的时间内互斥信号量没有释放,则允许任务恢复执行。该值设置为0的话,表示任务将会一直等,直到信号量被释放掉。
    opt : 用于选择是否使阻塞模式。
          OS_OPT_PEND_BLOCKING 指定互斥信号量被占用时,任务挂起等待该互斥信号量。
          OS_OPT_PEND_NON_BLOCKING 指定当互斥信号量被占用时,直接返回任务。
          注意!当设置为 OS_OPT_PEND_NON_BLOCKING  ,是 timeout 参数就没有意义了,应该设置为0。
    p_ts : 指向一个时间戳,记录发送、终止或删除互斥信号量的时刻。
    p_err: 用于保存掉用此函数后返回的错误码。
    
    发送互斥信号量
    我们可以通过调用函数OSMutexPost()来释放互斥型信号量,只有之前调用过函数OSMutexPend()获取互斥信号量,才需要调用OSMutexPost()函数来释放这个互斥信号量
    p_mutex: 指向互斥信号量。
    opt: 用来指定是否进行任务调度操作
        OS_OPT_POST_NONE 不指定特的选项
        OS_OPT_POST_NO_SCHED 禁止在本函数内执行任务调度操作。
    p_err: 用来保存调此函数返回的错误码。
    
    展开全文
  • 为了解决这个问题,引出了互斥信号量的概念。 1:信号量   信号量是一种上锁机制,该任务必须获得相应的钥匙才能进入,直至代码执行结束,释放钥匙,程序才退出。信号量分两种,一种是二进制信号量,一种是计数型

    前言:
      在ucosiii中有可能会有多个任务访问共享资源,同时对这个共享资源操作时会出错,因此信号量最早是用来控制任务存取共享资源。现在信号量被用来实现任务之间的同步和Isr之间的同步。在可剥夺的内核中,当任务独占式使用共享资源时就会出现低优先级任务先于高优先任务运行的现象,这个现象称之为优先级翻转现象。为了解决这个问题,引出了互斥信号量的概念。

    1:信号量
      信号量是一种上锁机制,该任务必须获得相应的钥匙才能进入,直至代码执行结束,释放钥匙,程序才退出。信号量分两种,一种是二进制信号量,一种是计数型信号量。二进制信号量只有0和1两个值,计数型信号量可以有多个值。
    (1)二进制信号量
      当某个资源对应的信号量为1时,则表示这个资源可用;当为0时,则表示这个资源不可用。如果某个任务一直在等待,在超过等待时间后进入就绪状态。可以看出使用二进制信号量的资源,一次只能有一个任务使用这个资源。
    (2)计数型信号量
      多线程任务就会出现多个任务同时访问同一资源,这个时候二进制信号量就比较受限,不能多个任务同时访问,比较耗时间。如果使用的是计数型信号量就可以允许多个任务同时访问。每当有任务访问时 信号量数值加1,任务释放时减1.

    2:优先级反转现象
    优先级反转在可剥夺型内核中是非常常见的,在实时任务系统中不允许出现这样的情况出现,这样会破坏任务的预期顺序。先来看看到底什么是优先级反转现象:
    优先级反转示意图
    (1)任务H和任务M处于挂起状态,等待某一事件的发生,任务L正在运行
    (2)某一时刻任务L想要访问共享资源,在此之前必须获取对应资源的信号量
    (3)任务L获取信号量后开始使用共享资源
    (4)由于任务H的优先级高,他在某个事件发生后,剥夺了任务L的cpu使用权
    (5)任务H开始运行
    (6)任务H运行过程中也要 使用任务L正在使用的共享资源,由于信号量还在被任务L占用着,任务 H只能挂起等待信号量的到来
    (7)任务L继续运行
    (8)由于任务M的优先级也比 任务L的优先级高,所以,任务M剥夺了任务L的cpu使用权
    (9)任务M执行
    (10)任务M执行完后,释放cpu使用权,任务L继续执行
    (11)任务L执行
    (12)任务L执行完后,释放信号量,在切换到任务H
    (13)任务H得到信号量后,继续执行

      在以上给出例子中我们可以看到,实际上任务H的优先级是最高的,理论上他应该最先执行完,在等待任务L释放信号的时候,被任务M抢去了cpu的使用权,使得任务H等待的时间更加增长,这就相当于任务M的优先级高于任务H的优先级,导致优先级反转。

    3:互斥信号量
      为了避免优先级反转现象,ucosiii支持一种特殊的二进制信号量,叫互斥信号量。他究竟是怎么避免的呢?我们取个例子来看:
    使用互斥信号量访问共享资源
    (1)任务H和任务M处于挂起状态,等待某一事件的发生,任务L正在运行
    (2)某一时刻任务L想要访问共享资源,在此之前必须获取对应资源的信号量
    (3)任务L获取信号量后开始使用共享资源
    (4)由于任务H的优先级高,他在某个事件发生后,剥夺了任务L的cpu使用权
    (5)任务H开始运行
    (6)任务H运行过程中也要使用正在被任务L占有的共享资源,考虑到任务L正占用资源,ucosiii会把任务L的优先级提升到跟任务H一样的优先级,使得任务L能继续执行,不会被其他中等优先级任务打断。
    (7)任务L以任务H的优先级运行,此时任务H并没有运行,因为共享资源的信号量在任务L手中,任务H还在等待它释放信号量
    (8)任务L完成操作后,释放掉互斥信号量,ucosiii会将任务L的优先级恢复到提升之前的值,并释放了信号量
    (9)任务H得到信号量后继续执行
    (10)任务H访问完共享资源后,释放掉互斥信号量,
    (11)此时没有优先级高于任务H的任务,所以继续执行任务H
    (12)等任务H完成后,某一事件发生后,执行任务M
    (13)任务M继续执行
      互斥信号量只有任务才能使用,在中断服务程序中则不可以。ucosiii允许用户嵌套使用互斥信号量,一旦一个任务获得了一个互斥信号量,那么该任务可以对该互斥信号量嵌套使用250次,当然释放的时候也要释放相同的次数才能真正释放这个互斥信号量。

    展开全文
  • C++ 多线程中互斥信号量的使用

    千次阅读 2017-07-09 23:10:08
    互斥信号量mutex 互斥量使用示例互斥信号量mutex互斥信号量是一种内核对象,它用来保证一个线程独占一个资源的访问。在使用互斥信号量的时候,有四个主要的函数: (1)CreateMutex,创建互斥信号量。函数原型如下...
  • 互斥信号量和二进制信号量的区别(转)2009年12月03日 星期四 09:50 A.M.互斥信号量和二进制信号量的区别 互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。同一个任务可以递归申请。 二进制...
  •  二值信号量主要用于进行共享资源的独占式访问,比如我们用一个变量来标志一个资源是否可用,当这个变量1的时候表示资源可用,当这个资源为0的时候表示资源不可用,但是二值信号量容易产生优先级反转,影响系统的...
  • 互斥信号量时信号量的一个特例,信号量的计数值只能为0和1。 但是互斥信号量和信号量之间还是有区别的。互斥信号量需要解决优先级反转的问题。 由于UCOSII是优先级实时系统,所以必须要保证优先级高的任务能够...
  • 互斥信号量与信号量的理解

    万次阅读 多人点赞 2018-09-17 10:10:24
    互斥信号量可以看成特殊情况下的信号量,他的计数器就是0或者1,只在这两个之间徘徊。 举个例子(不一定恰当,欢迎纠正): 现在有很多串口扩展卡,一张卡能扩展出好几个串口,比如说4个,这个扩展卡就是一个共享...
  • 理解互斥信号量

    2012-04-20 10:52:25
    互斥量和信号量的区别  1. 互斥量用于线程的互斥,信号线用于线程的同步。  这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。  互斥:是指某一资源同时只允许一个访问者对其进行访问,具有...
  • UCOS-ii中的互斥信号量-优先级反转

    千次阅读 2017-12-26 23:11:17
    二值信号量主要用于进行共享资源的独占式...互斥信号量一般用于降解优先级反转,优先级反转就是高优先级的任务的优先级被拉低了。具体如下: 我们有三个任务Task1,Task2,Task3,三个任务的优先级依次降低。 void
  • (2)只有获得互斥信号量的任务才能释放互斥信号量,所以中断上下文中不能释放互斥信号量。 (3)支持嵌套请求,即获得互斥信号量的任务可再次请求该互斥信号量。若嵌套请求信号量,则每请求一次将消耗一个信号量。...
  • ucos互斥信号量

    千次阅读 2009-08-30 13:37:00
    2008-11-23互斥型信号量(mutex)互斥信号量功能:1) 实现对资源的独占式访问(二值信号量)。2) 降解优先级反转。优先级反转:使用实时内核,优先级反转问题是实时系统中出现得最多的问题。设,任务1优先级高于...
  • 【UCOSIII】UCOSIII的互斥信号量

    万次阅读 2018-07-02 21:18:54
    信号量用于控制对共享资源的保护,但是现在基本用来做任务同步用(不太清楚的可以参考链接:【UCOSIII】UCOSIII的信号量)。   优先级反转 优先级反转在可剥夺内核中是非常常见的,在实时系统中不允许出现这种...
  • UCOSIII信号量,互斥信号量

    千次阅读 2016-04-13 21:05:44
    UCOSIII信号量信号量:二值信号量(共享资源)  计数信号量(任务同步)·  任务内带信号量(只能用于任务同步,一种计数信号量) 1:二值信号量,计数信号量 //定义信号量 OS_SEM MY_SEM; //创建信号量 ...
  • 二值信号量和互斥信号量的区别

    千次阅读 2014-06-30 16:00:23
    互斥信号量和二进制信号量的区别   互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。同一个任务可以递归申请。    二进制信号量,一个任务申请成功后,可以由另一个任务释放。  ...
  • 互斥信号量和二进制信号量的区别

    千次阅读 2011-08-01 19:19:28
    互斥信号量和二进制信号量的区别   互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。同一个任务可以递归申请。    二进制信号量,一个任务申请成功后,可以由另一个任务释放。   二...
  • uc/os-ii 互斥信号量及mutex.c源码分析

    千次阅读 2018-04-26 19:56:30
    互斥信号量互斥信号量最主要的功能是对共享资源的互斥访问控制。是一种特殊的二值信号量,它支持所有权、递归访问、任务删除安全等概念,以及一些避免优先级反转、饥饿、死锁等互斥固有问题的解决方法。 ...
  • //指定等待互斥信号量的超时节拍,超时继续执行,0位一直等待 OS_OPT opt, //是否阻塞 //OS_OPT_PEND_BLOCKING无效挂起 //OS_OPT_PEND_NON_BLOCKING无效直接返回 CPU_TS *p_ts, //时间戳 OS_ERR *p_err)...
  • 四种进程或线程同步互斥的控制方法 ... 3、信号量:控制一个具有有限数量用户资源而设计。  4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。   临界区(Critical Section)
  • pthread互斥信号量使用总结

    千次阅读 2012-05-21 19:24:24
    glibc提供的pthread互斥信号量可以用在进程内部,也可以用在进程间,可以在初始化时通过pthread_mutexattr_setpshared接口设置该信号 量属性,表示是进程内还是进程间。进程内的使用较为简单,本文的总结主要是针对...
  • 实际应用中, 可能会是去 open 一个 I2C 设备节点, 这个 I2C 控制着一个 I2C 多路分配器(例如1分8) 8路 I2C 连接着8个相同的 ...为了多进程共同访问这个 I2C 资源, 就要用信号量做同步和互斥了 // semaphore.c #in...
  • 互斥信号量 如果有三个任务ABC,优先级的顺序也是ABC,A和C共用一个信号。如果在C占用信号的时候,A处于等待状态,当B处于就绪状态的时候就会打断C任务的执行,从而影响A任务得到信号量。这样B任务就会出现优先级的...
  • 在可剥夺的内核中,当任务独占式使用共享资源的时候,会出现低优先级的任务先于高优先级任务运行的现象,这个现象被称为优先级反转,为了解决优先级反转这个问题,UCOSIII引入了互斥信号量这个概念。本章,就来讲解...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,441
精华内容 17,376
关键字:

互斥信号量为0表示