【操作系统】同步互斥机制(一):同步互斥机制及信号量的深入理解

深入理解互斥信号量(Mutex)在 FreeRTOS 中的使用与实现 阅读详情

1 进程的并发执行

1.1 问题的提出

并发是所有问题产生的原因, 也是操作系统设计的基础。

1.2 进程的特征

表1-1 进程的特征

进程的特征说明
并发进程的执行是间断性的,相对执行速度不可预测
共享进程/线程之间的制约性,并发环境下多个进程/线程会共享资源
不确定性进程的执行结果与其执行的相对速度有关,都是不确定的
1.3 并发执行过程分析

本节用一个小例子演示并发执行过程以及可能出现的错误。
场景:假设有四个消息队列:f,s,t,g。定义三个进程:get, 从f获取一个元素到s;copy, 从s复制元素到t;put, 从t获取元素推到g。不同的执行过程将会产生不同的结果,假设g,c,p是get,copy,put的一次循环。那么执行结果如下表所示:
表1-2 进程执行过程分析

状态f队列s队列t队列g队列结果说明
当前状态(3,4,5…,m)22(1,2)初始值
g,c,p(4,5,…,m)33(1,2,3)正确数据
g,p,c(4,5,…,m)33(1,2,2)异常数据
c,g,p(4,5,…,m)32(1,2,2)异常数据
c,p,g(4,5,…,m)32(1,2,2)异常数据

由上表可发现,在没有限制条件时候,进程并发执行很可能出错,导致脏数据的产生,那么应该怎么解决呢?这就需要进程前趋图——即并发环境下进程间的制约关系。

2 进程互斥

2.1 竞态条件(Race Condition)

两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,由于不恰当的执行顺序而出现不正确的结果,这种情况叫做竞态条件。

2.2 进程互斥(Mutual Exclusive)

由于各进程要求使用共享资源(变量、文件等),而这些资源需要排他使用,各进程之间竞争使用这些资源,这种关系成为进程互斥。

2.2.1 临界资源:critical resource

共享资源又称为临界资源、互斥资源,是指系统中一次只允许一个进程使用的资源。

2.2.2 临界区(互斥区):critical section

每个进程中对某个临界资源进行操作的程序片段,这些程序片段互为临界区。如下图所示:
在这里插入图片描述

2.2.3 临界区的使用原则
  • 没有进程在临界区时,想进入临界区的进程可进入
  • 不允许两个进程同时处于其临界区中
  • 临界区外运行的进程不得阻塞其他进程进入临界区
  • 不得使进程无限期等待进入临界区

3 进程互斥的解决方案

3.1 进程互斥的软件解决方案
3.1.1 After you问题

假设有两个进程P和Q,两个进程是否想进入临界区的标识分别为pFlag和qFlag(true表示想进入),初始值都为false,P进程进入临界区的条件是pFlag=true且qFlag=false,当Q进程获取到CPU时间片,开始执行,想进入临界区,则把qFlag修改成true,但此时时间片到了,Q进程下了CPU,接着P进程获取到CPU,P进程也想进入临界区,于是修改pFlag=true,但此时qFlag也等于true,导致P进程也进入不了临界区,造成了虽然临界区空闲但是两个进程都无法进入临界区。这就是After you问题。

3.1.2 Dekker算法

是第一个解决了进程互斥问题的算法。核心思想在于维护了一个turn变量,当两个进程P、Q都想进入临界区时,根据turn变量的值决定由谁进入临界区,并且未进入临界区的进程不断循环turn变量的值以检测是否可以进入临界区。这个算法可能会引发忙等待(busy waiting)问题。

3.1.3 Peterson算法

相较Dekker算法而言是一种更良好的算法。核心思想在于每个进程i在想进入临界区之前都会调用enter_region(i),离开临界区都会调用leave_region(i)方法。相关方法的逻辑见如下代码。
程序清单3-1 Peterson算法核心逻辑

#define FALSE 0
#define TRUE 1
// 进程的个数
#define N 2  
// 轮到谁
int turn;  
//感兴趣数组,初始值都为FALSE,为TRUE表示对应的进程想进入临界区
int interested[N];

// process=0或1
void enter_region(int process){
    int other;
    // 另外一个进程的进程号
    other=1-process;
    // 表明本进程感兴趣
    interested[process]=TRUE;
    // 设置标志位
    turn=process;
    // 如果标识变量turn和本进程相等且另外一个进程也想进入临界区,则进入while循环,当另外一个进程不想进入临界区时,则本进程进入临界区
    while(turn==process && interested[other]==TRUE);
}

void leave_region(int process){
    // 本进程已经离开临界区
    interested[process]=FALSE;
}
3.2 进程互斥的硬件解决方案
3.2.1 中断屏蔽的方法

简单来说就是通过开关中断的指令实现。执行“关闭中断”指令—>进程进入临界区操作—>执行“开启中断”的指令。事实上**原语(原子操作)**就是基于这个思想实现的。
该方法的优点在于简单、高效,但是缺点也很明显,代价高,限制了CPU的并发能力,不适用于多处理器。

3.2.2 测试并加锁(TSL)指令

Test and Set Lock, 是指进程每次要进入临界区之前,都要调用enter_region方法,方法的主要实现是:复制锁到寄存器并将锁置1,判断寄存器是否为0,如果不是,重新进入enter_region;如果是0,则调用者进程进入临界区(该方法也是一个忙等待的过程)。当进程离开临界区时,将锁置0。

3.2.3 交换指令(Exchange)

进程每次要进入临界区之前调用enter_region方法时,给寄存器中置1,交换寄存器与锁变量的内容,判断寄存器内容是否为0,若不是0则跳转到enter_region重新执行,若是0则返回调用者进程,且进程进入临界区。

3.3 小结

通过软件的解决方案对编程技巧要求较高。在用硬件的解决方案时,注入TSL指令和Exchange指令会造成忙等待问题。

Busy waiting:进程在得到临界区访问权之前,占用着CPU持续测试而不做其他事情。

在单处理器的系统下,如果唯一的CPU被占用着进行忙等待的操作就对整个系统的运行都不利,但是在多处理器的情况下让一个进程利用自旋锁(Spin lock)占用其中一个处理器进行不断的自旋请求以获取临界区的操作则是比较明智的选择(因为进程切下CPU引起的上下文开销一般要高于自旋锁占用CPU的消耗)。

4 进程同步(synchronization)

进程同步是指多个进程中发生的事件存在某种时序关系,需要相互合作共同完成一项任务。

具体地说,一个进程运行到某一点时,要求另一个伙伴进程为它提供消息,在未获得消息之前,该进程进入阻塞态,获得消息之后被唤醒进入就绪态。

4.1 信号量及P、V操作
4.1.1 概念

信号量是一个特殊的变量,用户进程间传递信息的一个整数值,定义如下:
程序清单4-1 信号量的数据结构

struc semaphore{
	int count;
	queueType queue;
}

对信号量可进行的操作:初始化(非负数)、P和V(P和V分别是荷兰语的test和increment的首字母)。

4.1.2 P、V操作的定义

程序清单4-2 P/V操作的底层实现原理

// s是一个信号量
P(s){
	s.count--;
	if(s.count<0){
		//该进程状态设置为阻塞状态;
		//同时将该进程插入相应的等待队列s.queue末尾;
		//最后重新调度
	}
}
V(s){
	s.count++;
	if(s.count<=0){
		//唤醒相应等待队列s.queue中等待的一个进程;
		//改变其状态为就绪态,并将其插入到就绪队列;
	}
}

P、V操作均为原语操作(atomic action),最初提出的二元信号量(只有值0和1)为了解决互斥的问题,后来推广到计数信号量可以用来解决同步问题。

4.1.3 用P、V操作解决进程间的互斥问题
  • 设置信号量mutex初值为1
  • 在进入临界区前实施P(mutex)
  • 在退出临界区后实施V(mutex)

假设有P1、P2、P3这三个进程,用P、V操作解决互斥问题的逻辑示意图如下。当P1进程想进入临界区时,先进行P操作,此时mutex.count=0,此时P1进程进入临界区,然后下了CPU,P2进程此时获得CPU的执行权,想进入临界区之前同样调用P操作,首先是count自减少,此时由于mutex.count=-1<0,P2进程进入阻塞态,同时将进程加入到mutex.queue的队尾;如果此时P2的时间片也到了,下了CPU后由进程P3紧接着获得CPU的执行权,依然是P操作,此时mutex.count=-2,依然进入不了临界区,P3进程也被加入mutex.queue的队尾。此时P3释放了CPU,接着由P1获取CPU的执行权,注意,此时P1还是在临界区的,P1执行完相关操作退出临界区,此时调用V操作,count自增,结果是mutex.count=-1<0,所以操作系统会唤醒等待队列mutex.queue中的一个进程(此时P2、P3进程都在队列中)并将其插入到就绪队列等待CPU调度。当P2接着获取到CPU执行权时候,此时由于P2进程已经执行过P操作,所以进入临界区。
在这里插入图片描述

4.1.4 用P、V操作解决生产者消费者问题

程序清单4-3 用P、V操作解决生产者消费者问题

/* 缓冲区默认个数 */
#define N 100
/* 信号量是一种特殊的整型数据 */
typedef int semaphore;
/* 互斥信号量:控制对临界区的访问 */
semaphore mutex=1;
/* 空缓冲区的个数 */
semaphore empty=N;
/* 满缓冲区的个数 */
semaphore full=0;

void producer(void){                         
    int item;
    while(TRUE){
        item=produce_item();
        P(&empty);
        P(&mutex);
        insert_item(item);
        V(&mutex);
        V(&full);
    }
}

void consumer(void){
    int item;
    while(TRUE){
        P(&full);
        P(&mutex);
        insert_item(item);
        V(&mutex);
        V(&empty);
        consume_item(item);
    }
}

用信号量解决的过程如下图:
在这里插入图片描述

思考:如果把代码里的 P(&empty);P&(mutex);顺序换成P&(mutex); P(&empty);可以吗?
答:不可以,会发生死锁问题,至于原因读者可以结合前面说明的P、V操作的特点思考一下。

4.1.5 用P、V操作解决读者写者问题

1 问题描述:多个进程共享一个数据区,这些进程分为两组:
读者进程:只读数据区中的数据
写者进程:只往数据区写数据
需要满足条件:

  • 只允许多个读者同时进行读操作
  • 不允许多个写者同时操作
  • 不允许读者、写者同时操作

本节主要针对读者优先的问题,什么是读者优先呢:
如果读者执行:

  • 无其他读者、写者,则该读者可以读
  • 若已有写者等,但有其他读者正在读,则该读者也可以读
  • 若有写者正在写,该读者必须等
    如果写者执行:
  • 无其他读者、写者,该写者可以写
  • 若有读者正在读,该写者等待
  • 若有其他写者正在写,该写者等待

2 读者优先问题的解决方案
读者优先问题的关键在于只对第一个读者进程执行P操作,使其能够进入临界区,并且第二个、第三个……进程不需要再进行P操作就可以进入临界区,当最后一个读者进程离开临界区的时候执行V操作。在临界区有读者进程时,由于临界资源被占用,所以任何的写者进程都无法进来。

需要判断某个进程是否是第一个进程或者最后一个进程,需要注意的是readCount++不是原子操作,并且if(readCount==1)是先检查再执行操作,可能也有线程安全性问题。所以还需要对这两个操作加入P、V操作。
程序清单4-4 用P、V操作解决读者写者问题

void reader(void){                         
    while(TRUE){
        P(mutex);
        /* 读者进程数 */
        readCount++;
        if(readCount==1){
            /* 第一个读者 */
            P(w);
        }
        V(mutex);

        读操作

        P(mutex);
        readCount--;
        if(readCount==0){
            /* 最后一个读者 */
            V(w);
        }
        V(mutex);
        // 其他操作
    }
}

void writer(void){
    while(TRUE){
        ……
        P(w);

        写操作

        V(w);
    }
}

3 实例:Linux中的读-写锁
Linux的IPX路由代码中就使用了读-写锁,保护了路由表的并发访问。

要通过查找路由表实现包转发的程序需要请求读锁;需要添加和删除路由表中入口的程序必须获取写锁(由于通过读路由表的情况比更新路由表的情况多得多,使用读-写锁提高了性能)

5 小结

本篇主要对进程同步互斥概念进行了讲解,介绍了竞态条件、临界区、自旋锁等重要概念。重点分析了信号量和PV操作的原理以及在经典问题模型中的应用。

操作系统学习笔记:进程同步与通信 进程间的相互作用、进程通信、死锁等相关延伸知识进行了详细的解说!操作系统学习复习之良品! 阅读详情

相关推荐

深大操作系统:xv6 综合实验一:copy on write,slab,信号量,调度与系统调用

前三个题目 hello world,系统调用,调度,信号量,难度不是很大,抄老师的代码就完事了 后面两个题没有示例代码。他们分别是实现 slab,即 byte level 的内存分配。,注意页表的单独映射和页内偏移 最后一个题是 copy on write,通过只读页的中断来触发 copy,然后分配物理页帧,映射一下内存就搞定了。此外整个内核自旋锁来互斥地维护页引用计数器变量

AKGWSB 's blog 6832

操作系统选择题及答案解析(川大) 第五章 并发:互斥和同步

四川大学网安操作系统选择题答案及解析,本文以操作系统—精髓与设计原理(第九版中文翻译版)为参考,答案仅供参考,如有疑惑欢迎提出指正。转载请标明出处。

wion03的博客 2006

操作系统经典同步互斥问题详解与实战分析

在操作系统中,多个进程或线程并发执行时,往往需要访问共享资源(如内存、文件、设备等)。若不加以控制,将可能导致数据不一致、资源竞争甚至死锁等问题。同步与互斥机制正是为了解决这些问题而设计的核心机制。互斥(Mutual Exclusion):确保某一时刻只有一个线程能访问临界资源。同步(Synchronization):协调多个线程或进程的执行顺序,以实现有序协作。这些问题的产生源于并发执行的不确定性。

weixin_42573757的博客 1159

死锁避免

一、死锁避免讨论 在这个例子中,有进程P、进程Q。系统当中一共有M个资源,假设A为P进程对资源的需求的最大量,那么用系统中资源总数减去A就得到一个Y点,对于进程Q,一旦Q进程占有的资源数量超过了Y这一点,那就意味着P进程得不到它所需要的最大的需求量A 了。 同样的道理,如果B是Q进程对资源的最大需求量,那么M-B得到一个X点,也就是说,如果P进程对资源的占有量超过了X点,也就意味着Q进程得不到...

Monster丶ZF的博客 617

深入理解UCOSII中信号量同步机制与实践

本文还有配套的精品资源,点击获取 简介:UCOSII是一个嵌入式实时操作系统,其中信号量机制至关重要,用于任务同步和资源管理。本文介绍信号量的种类、任务同步、资源管理、优先级反转以及相关API函数的使用。二进制和计数信号量在资源访问控制、任务挂起与唤醒等方面发挥作用。开发者需掌握信号量的创建、删除、设置与获取等操作,以优化嵌入式系统的性能和稳定性。 1. UCOS...

weixin_35414484的博客 900

深入理解Linux信号量的同步机制

本文深入探讨了GNU/Linux环境下信号量的应用和API,以及信号量如何实现进程间的同步。通过具体的代码示例,展示了如何创建、获取、释放和配置信号量,以及信号量在进程同步中的重要性。

weixin_28487725的博客 428

交换指令XCHG(exchange)

交换指令XCHG(exchange) 把两个地方的数据进行互换 XCHG reg , reg / mem; 1.寄存器与寄存器之间对换数据 2.寄存器和存储空间之间对换数据 3.寄存器与段寄存器之间对换数据 4.不能在段寄存器与段寄存器之间对换数据 XCHG指令不允许的情况有以下四种: 1. 不能同时都为内存操作数 2. 任何一个操作数都不能为段寄存器 3. 任何一个操作数不能为立即数

autumn20080101的专栏 4287

Python语言在工业控制中的简单应用

在工业控制中,经常需要对采集到的数据进行分析和处理,Python的这些库可以简化这一过程。传统的工业控制系统多依赖于专用的控制硬件和软件,但随着技术的发展,开放性和灵活性成为了新的需求焦点。还有,Python社区活跃,提供了大量的开源代码和模块,这对于工业控制领域来说是一个巨大的资产。Python作为一种高级编程语言,因其简洁的语法、强大的库支持和广泛的社区资源而在工业界获得了快速的发展和广泛的应用。在工业控制领域,Python的应用日益增多,这得益于其跨平台性、脚本语言的灵活性以及与硬件设备交互的能力。

2303_78014702的博客 1721

【操作系统-31】进程互斥的硬件实现-Swap指令(XCHG

swap。

m0_69378371的博客 1864

【Python】SUMO + Python 联合仿真平台

强化学习的核心思想是让智能体 (Agent) 通过与环境 (Environment) 的交互来学习如何做出最优决策,以最大化累积奖励 (Cumulative Reward)。在交通场景中,智能体可以是交通信号控制器、自动驾驶车辆或交通管理中心,环境则是 SUMO 模拟的交通路网,奖励则与交通效率、安全、环保等目标相关。交通系统本质上是动态的、随机的、高度复杂的系统,传统的基于规则或模型的优化方法在面对不断变化的需求和突发事件时,往往显得力不从心。强化学习的优势在于:在交通领域,强化学习已经被广泛应用于:为了

宅男很神经 1989

人工智能在高中教育中的应用现状剖析与挑战应对

人工智能在高中教育中的应用现状剖析与挑战应对

燕鹏 1338

理解互斥量和信号量

互斥量(Mutex)互斥量表现互斥现象的数据结构,也被当作二元信号灯。一个互斥基本上是一个多任务敏感的二元信号,它能用作同步多任务的行为,它常用作保护从中断来的临界段代码并且在共享同步使用的资源。Mutex本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥。Mutex对象的值,只有0和1两个值。这两个值也分别代表了Mutex的两种状态。值为0, 表示锁定状态,当前对象被锁定,用户进程/线程如果试图Lock临界资源,则进入排队等待;值为1,表示空闲状态,当前对象为空闲,用户进程/线程

小胖子吃辣肉面的专栏 4万+

UEC++ 虚幻5笔记(数字孪生示例) day13

文件读取与写入,数字孪生入门制作

qq_44924388的博客 3842

【操作系统-Day 21】从互斥锁到信号量:掌握更强大的并发同步工具Semaphore

本文将深入探讨一个更强大、更通用的同步工具——**信号量(Semaphore)**。我们将从其核心原理出发,详细解析其标志性的 **P 操作**和 **V 操作**,并通过具体的代码示例,展示信号量如何巧妙地解决**互斥(Mutual Exclusion)**和**同步(Synchronization)**这两大并发难题。读完本文,你将理解信号量为何是操作系统工具箱中不可或缺的一员,并能清晰地辨析它与互斥锁的本质区别。

吴师兄大模型的博客 1055

【Android面试八股文】Handler如果没有消息处理是阻塞的还是非阻塞的?Looper 为什么要使用死循环?Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

Handler如果没有消息处理是阻塞的还是非阻塞的? Looper 为什么要使用死循环? Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

字节卷动 760

【深度学习驱动流体力学】Python流体力学Ansys Fluent

PyFluent 是一个将 Python 编程语言与 Ansys Fluent 流体动力学 (CFD) 仿真软件集成的工具。它允许用户通过 Python 脚本来控制和自动化 Fluent 中的仿真任务,实现从预处理、求解到后处理的全流程控制。PyFluent 结合了 Python 的灵活性和 Fluent 的强大功能,提供了一种高效且灵活的 CFD 仿真方法。PyFluent 是一个强大而灵活的工具,使用户能够通过 Python 脚本全面利用 Ansys Fluent 的功能。

源代码杀手的博客 3123

【操作系统⑦】——信号量与PV操作(上)【互斥模板+同步模板+生产者消费者问题+典型的双缓冲问题+阅览室登记问题+读写问题+独木桥问题】

关键词:操作系统、信号量(semaphore)、PV操作机制、互斥与同步、生产者消费者经典问题、典型的双缓冲问题、经典读写问题、独木桥问题

Wang_Dou_Dou_的博客 5631

uniapp - H5网页打包运行报错Failed to load resource: net::ERR_FILE_NOT_FOUND(uniApp打包成H5部署到服务器,打包h5白屏并报错页面空白)

Failed to load resource: net::ERR_FILE_NOT_FOUND,uniapp 坑之打包之后白屏,uniapp打包h5,HBuilderX 打包H5后空白报错 Failed to load resource: net::ERR FILE NOT_FOUND,UNI-APP H5应用白屏(空白页)解决方案,白屏并报错Failed to load resource: net::ERR_FILE_NOT_FOUND,uniapp开发,打包成H5部署到服务器,uniapp打包之后首页

🏆 前端领域优质创作者 3578

操作系统PV操作实验报告:深入理解进程同步与互斥

操作系统PV操作实验报告:深入理解进程同步与互斥 【下载地址】操作系统PV操作实验报告 本资源提供了一份详尽的**操作系统课程中PV操作的实验报告**。对于学习操作系统原理特别是进程同步与互斥概念的学生而言,这是一份宝贵的参考材料。报告通过实际操作,深入浅出地展示了PV操作的应用,确保读者不仅理解理论知识,还能掌握如何在...

gitblog_06611的博客 1171

Hyperledger Fabric 网络搭建详解

写在前面:博主也是因为一些原因刚刚入坑区块链,我认为在我们入门新技术的时候,入门总是最困难的部分,只要入门了,后面学习起来就会越来越轻松,在网上找了很多文章,我觉得大多条理不是很清楚。本文章会详细介绍fabric(v1.0)环境部署,以及在搭建过程我遇到一些问题及解决方案,希望可以帮助到你们。 博主环境机器:VMware15 Ubuntu16.04 fabric(v1.0)环境部署一、必备软件安装1.ubuntu环境安装2.Go语言3.Docker安装4. Docker-Compose 安装二、Fa.

林中有神君 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【FreeRTOS】信号量、互斥锁、消息队列深度剖析

FreeRTOS通信与同步机制解析 本文深入探讨了FreeRTOS中的三种核心通信与同步机制:信号量、互斥锁和消息队列。信号量提供资源计数和任务同步功能,包括二值信号量(0/1状态)用于事件通知,计数信号量(0-N)用于资源池管理。互斥锁作为特殊二值信号量,通过优先级继承机制解决优先级反转问题,适用于共享资源保护。消息队列实现任务间数据传递,支持FIFO顺序和阻塞/超时等待机制。

大雨淅淅的博客 2101

VC中sqlite的使用

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

【操作系统-Day 23】经典同步问题之读者-写者问题:如何实现读写互斥,读者共享?

今天,我们将深入另一个经典的同步问题——**读者-写者问题 (Readers-Writers Problem)**。与生产者-消费者模型不同,读者-写者问题关注的是对共享数据进行不同类型访问(读 vs. 写)的并发控制。它完美地模拟了许多现实场景,如数据库访问、文件系统操作等,在这些场景中,允许多个用户同时读取数据,但写入操作必须是独占的。本文将从问题定义和现实隐喻入手,系统性地剖析读者-写者问题的核心约束,详细讲解“读者优先”与“写者优先”两种策略的区别,并最终通过高质量的伪代码,一步步带你用信号量构建一

吴师兄大模型的博客 2575

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

操作系统(4) 进程同步

本篇对操作系统进程同步的知识内容进行了整理与概述,便于复习与回顾。

Theodore_1022的博客 1290

FreeRTOS信号量vs互斥量:3个真实案例讲透优先级反转问题

本文通过三个真实嵌入式案例,深入解析FreeRTOS中信号量与互斥量的核心区别,重点剖析了使用二值信号量实现互斥时可能引发的优先级反转问题。文章阐述了互斥量独有的优先级继承机制如何有效解决该问题,并对比了二者在所有权、递归获取及适用场景上的差异,为构建稳定实时的嵌入式系统提供实践指导。

weixin_29230059的博客 550

ucore lab7 同步互斥 实验报告

实验目的 理解操作系统的同步互斥的设计实现; 理解底层支撑技术:禁用中断、定时器、等待队列; 在ucore中理解信号量(semaphore)机制的具体实现; 理解管程机制,在ucore内核中增加基于管程(monitor)的条件变量(condition variable)的支持; 了解经典进程同步问题,并能使用同步机制解决进程同步问题。 实验内容 实验六完成了用户进程的调度框架和具体的调度算法,可调度运行多个进程。如果多个进程需要协同操作或访问共享资源,则存在如何同步和有序竞争的问题。本次实验,主要是熟悉

jzb的博客 838

【FreeRTOS】信号量——简介、常用API函数、注意事项、项目实现

`SemaphoreHandle_t xSemaphoreCreateBinary( void );` - 作用:用于创建一个二值信号量,用于实现对共享资源的互斥访问。 - 参数:无参数。 - 返回值:返回一个 `SemaphoreHandle_t` 类型的句柄,表示创建的二值信号量。

Goforyouqp的博客 3589
上一篇: 【程序报错】Spring容器启动时报异常:Can not set field to com.sun.proxy.$Proxy
下一篇: 【操作系统】同步互斥机制(二):管程与进程间通信机制(IPC)
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值