高薪秘诀,跟着AliOS Things轻松入门操作系统:互斥信号量

1、概述

本文将分析互斥信号量的源码。

互斥信号量与信号量有相似之处,却又有很大的不同。主要的几个不同点为:

(1)任意时刻互斥信号量最多只能被一个线程获得,它不像信号量那样可以有多个。

(2)只有获得互斥信号量的任务才能释放互斥信号量,所以中断上下文中不能释放互斥信号量。

(3)支持嵌套请求,即获得互斥信号量的任务可再次请求该互斥信号量。若嵌套请求信号量,则每请求一次将消耗一个信号量。

(4)支持解决优先级反转问题。优先级反转问题是操作系统设计的一个经典问题,曾导致过重大软件事故,有兴趣的读者可以了解一下。由于互斥信号量源码中有不少代码是为了解决这个问题,因此有必要先解释一下。

 

假设有三个任务taskhigh、taskmid、tasklow,其中taskhigh优先级最高,taskmid其次,tasklow优先级最低。假设tasklow已经获得了互斥信号量Mutex,那么当taskhigh请求Mutex时将被阻塞,它要一直等到tasklow释放Mutex后才能继续运行。然而若taskmid就绪,它将抢占tasklow运行,tasklow释放互斥信号量要等taskmid让出CPU。若系统中还有taskmid2、taskmid3等任务,那么taskhigh还得等他们先执行。也就是说,高优先级任务因等待被低优先级任务占用的互斥信号量而得不到调度。这便是优先级反转问题。

 

AliOS Things采用优先级继承策略解决优先级反转问题:当高优先级任务请求互斥信号量阻塞时,将提升占用互斥信号量的任务的优先级。在上述例子中,当taskhigh请求Mutex阻塞时,将把tasklow的优先级提升到与taskhigh相同,这样就可以避免因为taskmid抢占tasklow而导致taskhigh得不到调度。

 

下面我们来解读互斥信号量源码,分析上述不同点是如何实现的。

互斥信号量源码位置:core/rhino/k_mutex.c

互斥信号量头文件位置:core/rhino/include/k_mutex.h

 

2、互斥信号量结构体kmutex_t

头文件k_mutex.h定义了互斥信号量结构体kmutex_t。互斥信号量相关的函数都基于该结构体,所以我们首先分析一下该结构体,其具体定义如下:

typedef struct mutex_s {

   /**<

    *  Manage blocked tasks

    *  List head is this mutex, list node is task, which are blocked in this mutex

    */

   blk_obj_t       blk_obj;

  ktask_t        *mutex_task; /**< Pointer to the owner task */

   /**<

    *  Manage mutexs owned by the task

    *  List head is task, list node is mutex, which are own
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值