操作系统学习-6. 信号量

【操作系统】信号量实现互斥同步以及前驱图问题 一、信号量实现互斥问题 进程互斥:当一个进程访问临界资源时,另一个想要访问该临界资源的进程需要先等待,直到当前临界资源访问完成为止。 参照如下措施: 注意:对不同的临界资源需要设罝不同的互斥信号量,P、v操作必须成对出现。缺少P(mutex)就不能保证临界资源的互斥访问。缺少V(mutex)会导致资源永不被释放,等待进程永不被唤醒。 如摄像头和打印机就是不同的临界资源,设置的信号量需要不同(如m1,m2); semapore mutex=1;//初始化信号量 p1(){ .. p(mut.. 阅读详情

写在前面:

这一篇博客将讨论信号量(Semaphores)机制。将学习三种基本类型的信号量,然后将用信号量实现互斥与前趋两种进程关系。

该机制由荷兰学者 Dijkstra 提出,是一种卓有成效的进程同步工具。
在系统中,给予每一个进程一个信号量,代表每个进程目前的状态,未得到控制权的进程会在特定地方被强迫停下来,等待可以继续进行的信号到来。如果信号量是一个任意的整数,通常被称为计数信号量(Counting semaphore),或一般信号量(general semaphore);如果信号量只有二进制的0或1,称为二进制信号量(binary semaphore)。在linux系统中,二进制信号量(binary semaphore)又称互斥锁(Mutex)。——Wikipedia。

整型信号量:

最初由 Dijkstra 把整型信号量定义为一个用于表示资源数目的整型量 S,它与一般整型量不同,除初始化外,仅能通过两个标准的原子操作(Atomic Operation) wait(S)和 signal(S)来访问。这两个操作一直被分别称为 P、V 操作。wait操作是使进程等待,申请资源;signal操作是使资源释放。

其实就是利用整型数这样的一个数据结构来表示进程资源是否可用:

  • 当S<=0时,资源不可用;
  • 当S>0时,资源可用。

进一步,Wait(S)与Signal(S)操作可描述为:

wait(S): while S<=0 do no-op;
          S:=S-1;

signal(S): S:=S+1;

wait(S)和 signal(S)是两个原子操作,因此,它们在执行时是不可中断的。亦即,当一个进程在修改某信号量时,没有其他进程可同时对该信号量进行修改。此外,在 wait 操作中,对 S 值的测试和做 S:=S-1 操作时都不可中断。

在整型信号量机制中的 wait 操作,只要是信号量 S≤0,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,而是使进程处于“忙等”的状态。换句话说,一旦一个进程需要的资源不可用,那么进程就会一直等待,直到资源可用为止,相当于在火车上,想上厕所,但厕所现在有人,那么就会一直等到里面的人出来,然后去上厕所才行。而应该退出临界区。为了解决这一问题,提出了记录型信号量。

记录型信号量:

记录型信号量机制是一种不存在“忙等”现象的进程同步机制。但在采取了“让权等待”的策略后,又会出
现多个进程等待访问同一临界资源的情况。为此,在信号量机制中,除了需要一个用于代表资源数目的整型变量 value 外,还应增加一个进程链表指针 L,用于链接上述的所有等待进程。记录型信号量是由于它采用了记录型的数据结构而得名的。它所包含的上述两个数据项可描述为:

type semaphore=record
               value: integer;
               L: list of process;
               end

相应地,wait(S)和 signal(S)操作可描述为:

procedure wait(S)
          var S:semaphore;
          begin
              S.value:=S.value-1;
              if S.value<0 then block(S.L);
          end

procedure signal(S)
          var S: semaphore;
          begin
              S.value:=S.value+1;
              if S.value<=0 then wakeup(S.L);
          end

在记录型信号量机制中,S.value 的初值表示系统中某类资源的数目,因而又称为资源信号量。如果 S.value 的初值为 1,表示只允许一个进程访问临界资源,此时的信号量转化为互斥信号量,用于进程互斥。当 S.value<=0 时,表示该类资源已分配完毕;当 S.value>0 时,表示该类资源可用。

每次 wait 操作,意味着进程请求一个单位的该类资源,使系统中可供分配的该类资源数减少一个,因此描述为 S.value:=S.value-1;当 S.value<0 时,表示该类资源已分配完毕,因此进程应调用 block 原语,进行自我阻塞,放弃处理机,并插入到信号量链表S.L 中。

每次 signal 操作,表示执行进程释放一个单位资源,使系统中可供分配的该类资源数增加一个,故 S.value:=S.value+1 操作表示资源数目加 1。若加 1 后仍是 S.value≤0,则表示在该信号量链表中,仍有等待该资源的进程被阻塞,故还应调用 wakeup 原语,将 S.L 链表中的第一个等待进程唤醒。

关于block与wakeup原语可参考:操作系统学习-4. 进程控制

AND型信号量:

上述的进程互斥问题,是针对各进程之间只共享一个临界资源而言的。在有些应用场合,是一个进程需要先获得两个或更多的共享资源后方能执行其任务。然而这些时候如果仍采用记录型信号量,会导致两个进程各占用一部分的共享资源,从而谁也不让谁,导致“死锁”。

例如:现有两个进程 A和 B,他们都要求访问共享数据 D 和 E。可为这两个数据分别设置用于互斥的信号量 Dmutex 和 Emutex,并令它们的初值都是 1。。相应地,在两个进程中都要包含两个对 Dmutex 和 Emutex 的操作,即:

process A: wait(Dmutex);wait(Emutex);
process B: wait(Emutex);wait(Dmutex);

若进程 A 和 B 按下述次序交替执行 wait 操作:

process A: wait(Dmutex); //于是 Dmutex=0
process B: wait(Emutex); //于是 Emutex=0
process A: wait(Emutex); //于是 Emutex=-1 A 阻塞
process B: wait(Dmutex); //于是 Dmutex=-1 B 阻塞

最后,进程 A 和 B 处于僵持状态。在无外力作用下,两者都将无法从僵持状态中解脱出来。我们称此时的进程 A 和 B 已进入死锁状态。显然,当进程同时要求的共享资源愈多时,发生进程死锁的可能性也就愈大。

宁可锦上添花,也不雪中送炭:
AND 同步机制的基本思想是:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其它所有可能为之分配的资源也不分配给它。亦即,对若干个临界资源的分配,采取原子操作方式:要么把它所请求的资源全部分配到进程,要么一个也不分配。由死锁理论可知,这样就可避免上述死锁情况的发生。

在 wait 操作中,增加了一个“AND”条件,故称为AND 同步,或称为同时 wait 操作,即Swait(Simultaneous wait)定义如下:

Swait(S1,S2,…,Sn)
        if S1>=1 and … and Sn>=1 then
            for i:=1 to n do
                Si:=Si-1;
            endfor
        else
            当发现第一个Si<1就把该进程放入等待队列,并将其程序计数器置于Swait操作的开始位置。
        endif

同样的,同时signal操作,即Ssignal(Simultaneous signal)定义如下:

Ssignal(S1,S2,…,Sn)
        for i:=1 to n do
            Si:=Si+1;
        将所有等待Si的进程由等待队列取出放入到就绪队列。
        endfor;

这里有涉及到程序计数器的概念,程序计数器(Program Counter,PC)是用于存放下一条指令所在单元的地址的地方。当执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。此后经过分析指令,执行指令。完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令。

利用信号量实现进程互斥:

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

关于访问临界资源的循环进程可参考:操作系统学习-5. 进程同步 。

利用信号量实现进程互斥的进程可描述如下:

Var mutex: semaphore:=1;
    begin
        parbegin
            process 1: begin
                           repeat
                               wait(mutex);
                               critical section
                               signal(mutex);
                               remainder seetion
                           until false;
                        end
            process 2: begin
                           repeat
                               wait(mutex);
                               critical section
                               signal(mutex);
                               remainder section
                           until false;
                       end
        parend
    end

每个欲访问该临界资源的进程在进入临界区之前,都要先对 mutex 执行wait 操作,若该资源此刻未被访问,本次 wait 操作必然成功,进程便可进入自己的临界区;这时若再有其他进程也欲进入自己的临界区,此时由于对 mutex 执行 wait 操作定会失败,因而该进程阻塞,从而保证了该临界资源能被互斥地访问。

当访问临界资源的进程退出临界区后,又应对 mutex 执行 signal 操作,以便释放该临界资源。

在利用信号量机制实现进程互斥时应注意,wait(mutex)和 signal(mutex)必须成对地出现。
缺少 wait(mutex)将会导致系统混乱,不能保证对临界资源的互斥访问;
缺少 signal(mutex)将会使临界资源永远不被释放,从而使因等待该资源而阻塞的进程不能被唤醒。

用信号量实现前趋关系:

设有两个并发执行的进程 P1 和 P2。P1 中有语句 S1;P2 中有语句 S2。我们希望在 S1 执行后再执行 S2。

为实现这种前趋关系,我们只须使进程 P1 和 P2 共享一个公用信号量 S,并赋予其初值为 0,将 signal(S)操作放在语句 S1 后面;而在 S2 语句前面插入 wait(S)操作,即:

  • 在进程 P1 中,用 S1;signal(S);
  • 在进程 P2 中,用 wait(S);S2;

由于 S 被初始化为 0,这样,若 P2 先执行必定阻塞,只有在进程 P1 执行完 S1;signal(S);操作后使 S 增为 1 时,P2 进程方能执行语句 S2 成功。

同样,我们可以利用信号量,按照语句间的前趋关系(见下图),写出一个更为复杂的可并发执行的程序。


图1.前趋图举例
这里写图片描述


图中 S1,S2,S3,…,S6 是最简单的程序段(只有一条语句)。

为使各程序段能正确执行,应设置若干个初始值为“0”的信号量。如为保证 S1→S2,S1→S3的前趋关系,应分别设置信号量 a 和 b,同样,为了保证 S2→S4,S2→S5,S3→S6,S4→S6和 S5→S6,应设置信号量 c,d,e,f,g。进程描述如下:

Var a,b,c,d,e,f,g:semaphore: =0,0,0,0,0,0,0;
    begin
        parbegin
            begin 
                S1; 
                signal(a); signal(b); 
            end;
            begin 
                wait(a); 
                S2; 
                signal(c); signal(d); 
            end;
            begin 
                wait(b); 
                S3; 
                signal(e); 
            end;
            begin 
                wait(c); 
                S4; 
                signal(f); 
            end;
            begin 
                wait(d); 
                S5; 
                signal(g); 
            end;
            begin 
                wait(e); wait(f); wait(g); 
                S6; 
            end;
        parend
    end
计算机操作系统【慕课版】课后习题解答 第四章 进程同步 一、简答题 1.什么是临界资源?什么是临界区? 临界资源:以互斥形式访问的资源;临界区:访问临界资源的代码。 2.同步机制应遵循的准则有哪些? 空闲让进;忙则等待;有限等待;让权等待。 3.为什么各进程对临界资源的访问必须互斥? 临界资源指的是每次只允许一个进程进行访问的软硬件资源,所以各进程对临界资源进行互斥访问。 4.如何保证各进程互斥地访问临界资源? 1)空闲让进 当临界资源处于空闲状态,允许一个请求进入临界区的进程立即进入临界区,从 而有效的利用资源。 2)忙则等待 已经有进程进入 阅读详情

相关推荐

第二章 进程管理

第二章 进程管理 2.1进前趋图和程序执行 2.1.1前趋图 前趋图(Precedence Graph)是一个有向无循环图,记为 DAG(Directed Acyclic Graph),用 于描述进程之间执行的前后关系。 2.1.2程序的顺序执行 仅当前一操作(程序段)执行完后,才能执行后继操作。例如,在进行计算时,总须先输入用户的程序和数据,然后进行计算,最后才能打印计算结果。 程序顺序执行...

1038

16利用信号量实现前驱关系

利用信号量实现前驱关系 信号量也可以用来描述程序之间或者语句之间的前驱关系。 实现算法如下: Semaphore a1=a2=b1=b2=c=d=e=0; //初始化信号量 S1(){ …; V(a1);V(a2); //S1已经运行完成 } S2(){ P(a1); //检查S1是否运行完成 …; V(b1);V(b2);//S2已经运行完成 } S3(){ P(a2); //检查S1是否已经运行完成 …; V©; //S3已经运行完成 } S4(){ P(b1); //检查S

weixin_41883890的博客 3599

xv6 信号量机制从零实现:基于自旋锁的 4 个核心系统调用剖析

本文深入剖析了在xv6操作系统中从零实现信号量机制的完整过程,重点讲解了基于自旋锁的4个核心系统调用(sem_create、sem_p、sem_v、sem_free)的设计与实现。通过原子操作、进程睡眠/唤醒机制等关键技术,解决了并发编程中的同步问题,为操作系统学习者提供了实践信号量原理的绝佳案例。

weixin_34072296的博客 341

freeRTOS学习笔记-信号量的原理及实现

信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问, 常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中,各任务之间需要同步或互斥实现临界资源的保护,信号量功能可以为用户提供这方面的支持。抽象的来讲,信号量是一个非负整数,所有获取它的任务都会将该整数减一(获取它当然是为了使用资源),当该整数值为零时,所有试图获取它的任务都将处于阻塞状态。通常一个信号量的计数值用于对应有效的资源数,表示剩下的可被占用的互斥资源数。

qq_30032639的博客 1370

操作系统——信号量机制(PV操作)

学习PV时,不要一头钻到代码里,要注意理解信号量背后的含义,一个信号量对应一种资源,信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量。 P就是wait操作,等待资源,V就是++操作,释放资源 首先我们要明白S1、S2、S3的含义,S1就是盘子里的资源情况,起始一个水果,为1;S2为儿子所拥有资源情况(橘子),初始他没有拿到水果,故初始时S2=0;S3为女儿的拥有资源情况(苹果)。 ①由于题目S1为1,所以这一空先请求资源,让孩子们吃水果,所以P

与其邻渊羡渔,不如退而结网 3万+

FreeRTOS学习五(信号量)

信号量是操作系统中重要的一部分,信号量一般用来进行资源管理和任务同步。信号量分为二值信号量、计数型信号量、互斥信号量。不同信号量的应用场景也不同,但是有些应用场景是可以互换着使用的。...

qq_26226375的博客 9027

操作系统学习笔记——第六讲——进程同步(6.2信号量)

1. 信号量(Semaphore) 2. 信号量的发明者——迪科斯彻 3. 整型信号量 4. 记录型信号量(可去除忙等) 5. 信号量的类型 6. 互斥信号量的使用 7. 同步信号量的使用 ...

预见未来to50的专栏 226

实时操作系统UCOS学习笔记11----UCOSIII信号量(Sem)和互斥信号量(Mutex)

在UCOSIII中有可能会有多个任务会访问共享资源,因此信号量最早用来控制任务存取共享资源,现在信号量也被用来实现任务间的同步以及任务和ISR间同步。在可剥夺的内核中,当任务独占式使用共享资源的时候,会出现低优先级的任务先于高优先级任务运行的现象,这个现象被称为优先级反转,为了解决优先级反转这个问题,UCOSIII引入了互斥信号量这个概念。本章,就来讲解一下UCOSIII的信号量和互斥信号量。 1、信号量 信号量像是一种上锁机制,代码必须获得对应的钥匙才能继续执行,一旦获得了钥匙,也就意味着该任务具有进入被

qq_38958704的博客 2787

Web前端最新【操作系统】操作系统基本知识点复习总结(1),网易严选前端开发三面面经

一个好的心态和一个坚持的心很重要,很多冲着高薪的人想学习前端,但是能学到最后的没有几个,遇到困难就放弃了,这种人到处都是,就是因为有的东西难,所以他的回报才很大,我们评判一个前端开发者是什么水平,就是他解决问题的能力有多强。开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】分享一些前端面试题以及学习路线给大家什么是信号量?进程互斥七、死锁避免死锁的银行家算法八、中断九、操作系统管理中内存分页和分段十、核心态&用户态||(管态&目态)一、并发和共享=======

2401_84447043的博客 636

挑战第七天:Llamaindex RAG 实践

安装python 依赖包,并安装 Llamaindex和相关包以及Sentence Transformer 模型。进入开发机后,创建新的conda环境,命名为。镜像,然后在资源配置中,使用。的选项,然后立即创建开发机器。后,点击 选择镜像 使用。然后安装相关基础依赖。

weixin_53579823的博客 728

Basler相机和pylon viewer 的使用

文章目录1 线路连接2 安装和使用pylon 1 线路连接 电源线接到电源插座,网线接到电脑(电脑没有网口的话,可用转换器转到type-c接口)。 2 安装和使用pylon 参考 Basler pylon安装及对网口相机基本设置 相机和电脑以太网IP设置参考:balser相机IP设置 关于相机参数和pylon viewer的详细设置,可以参考pylon Viewer安装路径下的文档(Documentation) ...

Deephome的博客 1万+

FreeRTOS学习笔记——基于stm32f103c8t6核心板

TaskHandle_t * const pxCreatedTask 任务句柄,类似中断处理函数的句柄,需要宏定义取地址。使用stm32f103c8t6核心板学习正点原子视频,留下笔记以便日后查阅,有需要的uu可以参考一下,希望有所帮助。后续会不断更新......BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, 要创建的任务函数。const char * const pcName, 要创建的任务函数名称。自动分配的堆栈字大小(字x4=字节)

2401_84964442的博客 466

从0入门LocoTrack:6倍加速的SLAM追踪新范式实战指南

传统点追踪方法(如CorrTracker、TAPIR)在处理大规模场景或实时任务时,要么精度不足,要么速度太慢。而LocoTrack通过“局部4D相关性”和“Transformer全局关联”的创新设计,实现了精度与速度的双重突破速度:比现有SOTA方法快6倍,吞吐量高达数万点/秒;精度:在Kinetics、DAVIS等数据集上,定位误差显著低于传统方法;鲁棒性:能应对低纹理、动态场景等复杂环境,这是传统方法的“噩梦场景”。

m0_71589036的博客 95

第四章 xv6操作系统中级实验2——实现xv6操作系统信号量机制

本章实验接着第三章实验继续进行下去,关于第三章的实验内容回顾,可以参考前面的链接。在xv6操作系统源码中,提供了自旋锁用于内核程序代码的并发同步,但是,对于我们自己编写的用户程序代码,并没有提供进程同步机制,这次实验我们来动手来实现一个简单的xv6操作系统的信号量机制,从而达到用户程序代码的进程同步,当然,本次实验也是建立在xv6源码的自旋锁实现上,在本次实验实现信号量机制的过程中,还可以很好的了解xv6操作系统自旋锁是怎么实现的。为了实现信号量,除了创建、撤销、P、V操作外,还需要。

fantasticHQ的博客 1万+

【Nginx学习】5步揭秘Nginx邮件代理模块:邮件代理服务器的功能与实现

Nginx的邮件代理模块(Mail Proxy Module)允许Nginx作为邮件代理服务器,支持SMTP、POP3和IMAP协议。这使得Nginx可以作为一个高性能的邮件网关,用于过滤垃圾邮件、病毒扫描、负载均衡等任务。简单来说,Nginx在这里就像是一个邮递员,负责将邮件从发件人手中安全、快速地送到收件人手中。通过上述的解析,我们可以看到Nginx在邮件代理模块中的设计和实现。从配置解析、连接处理,到协议处理、SSL/TLS加密和日志记录,每一步都至关重要。

java专栏 1314

【SpringBoot 4.x 第2节】夯爆了,学习 Spring Boot 4.x 前,需要具备哪些 Java 基础?

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 4570

【UCOSIII操作系统】信号量与互斥量篇(1)信号量

UCOSIII操作系统UCOSIII操作系统——信号量与互斥量篇(1)信号量二进制信号量计数型信号量信号量的API函数创建信号量->OSSemCreate()删除信号量-> OSSemDel()释放一个信号量->OSSemPost()等待一个信号量->OSSemPend() UCOSIII其他内容导航不迷路 UCOSIII操作系统-简介 UCOSIII操作系统——任务篇(1......

不知道在干嘛每天 2729

javascript 酷炫时钟

javascript 酷炫时钟

liuhao9999的博客 631

RT-Thread学习笔记——信号量

前言 本文讲RT-Thread的线程间同步之信号量,包括为什么要进行线程间同步、信号量创建与删除、信号量获取与释放以及基于STM32的二值信号量示例和计算型信号量示例,采用RTT&正点原子联合出品潘多拉开发板进行实验。 一、线程间同步 1、什么是线程间同步? 同步是指按预定的先后次序进行运行,线程同步是指多个线程通过特定的机制来控制线程之间的执行顺序,也可以说是在线程之间通过...

Sanjay_Wu的博客 1万+

Modelsim:LPDDR5仿真(含美光仿真模型官方sv&vcs代码)

虽然,三星在设计跟量产上,早于其他家存储产商,但是镁光后来居上了,是业界首家支持全速 LPDDR5 的供应商,并且开发者在做开发的时候,也是用美光颗粒比较多,所以这里就先以美光的仿真模型为主进行仿真。 本工程为美光官方工程,支持Modelsim、VCS、ncverilog三种仿真器仿真。模型破解过,为完整system-verilog代码。

千歌叹尽执夏的博客 1284

9、工业数据管理:Historian、ERP、MES与资产模型解析

本文深入解析了工业数据管理中的核心概念与技术,包括Historian数据库、ERP和MES系统以及资产模型。文章详细介绍了Historian数据库的特性、架构分类、数据采集方式及时间序列处理能力,同时探讨了ERP和MES系统的功能与优势,特别是MES在生产执行中的重要作用。资产模型部分结合ISA-95和ISA-88标准,阐述了工业资产的层次化建模方法。此外,文章还分析了各系统之间的协同关系、面临的挑战及应对策略,并展望了未来工业数据管理的发展趋势,如云原生技术、人工智能融合和工业物联网的应用。

pz89012345的博客 144

【UCOSIII操作系统】信号量与互斥量篇(3)任务信号量

UCOSIII操作系统UCOSIII操作系统——信号量与互斥量篇(1)任务信号量信号量的API函数等待任务信号量->OSTaskSemPend()发布任务信号量->OSTaskSemPost() UCOSIII其他内容导航不迷路 UCOSIII操作系统-简介 UCOSIII操作系统——任务篇(1)创建任务 UCOSIII操作系统——任务篇(2)相关API函数 UCOSIII操作系统——...

不知道在干嘛每天 2623

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

FreeRTOS信号量

——————(正点原子FreeRTOS学习笔记) 开始学习FreeRTOS,学习参考书籍和视频来自正点原子FreeRTOS源码详解与应用开发,北京航空航天大学出版社 1  二值信号量 1.1  二值信号量简介         二值信号量通常用于互斥访问或同步,二值信号量和互斥信号量非常类似,但是还是有一些细微的差别,互斥信号量拥有优先级继承机制,二值信号量没有优先级

nippon1218的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

FreeRTOS操作系统学习——信号量

信号量是操作系统中重要的一部分,信号量一般用来进行资源管理和任务同步,FreeRTOS中信号量又分为二值信号量、计数型信号量、互斥信号量和递归互斥信号量。不同的信号量其应用场景不同,但有些应用场景是可以互换着使用的。

纵行山河万里~ 577

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

FreeRTOS操作系统——互斥信号量(十四)

FreeRTOS操作系统学习 文章目录FreeRTOS操作系统学习前言一、互斥信号量简介二、API函数1.创建互斥信号量2. 释放互斥信号量3. 获取互斥信号量三、互斥信号量实验四、递归互斥信号量1.递归互斥信号量简介2.创建递归互斥信号量3、释放递归互斥信号量4.获取递归互斥信号量总结5.递归互斥信号量实例总结 前言 前面了解了优先级翻转在FreeRTOS中是绝对不允许优先级翻转的,而互斥信号量可以完美的解决这个问题。 一、互斥信号量简介 互斥信号量其实就是一个拥有优先级继承的二值信号量,在同步的应用

戚晨夕的博客 1322

6.FreeRtos之-信号量学习笔记

什么叫做优先级反转,简单来说就是低优先级的任务霸占CPU资源,导致高优先级任务无法运行的情况:低优先级的任务持有一个被高优先级任务所需要的共享资源(低优先级给共享资源上锁,高优先级需要等待低优先级解锁共享资源,而在这期间正好一个中等优先级的任务打断低优先级任务去执行,则低优先级任务迟迟不能运行则不能给共享资源解锁,导致高优先级要一直等待(阻塞),而中等优先级的任务正在运行(逍遥法外))。优先级继承发生在高优先级任务在获取互斥锁进入阻塞的时候,而优先级继承解除发生在继承高优先级的任务在释放互斥锁的时候。

sycc512的博客 1067
上一篇: LeetCode-119. Pascal's Triangle II
下一篇: 操作系统学习-7. 经典的进程同步问题
zy2317878
博客等级 码龄11年 228粉丝 363原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值