HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核基础-信号量semaphore

news/2024/7/21 9:22:15 标签: harmonyos, 华为, OpenHarmony, 鸿蒙, LiteOS

在这里插入图片描述

目录

  • 一、信号量基本概念
  • 二、信号量运行机制
  • 三、信号量开发流程
  • 四、信号量接口
  • 五、代码分析(待续...)
  • 坚持就有收获

一、信号量基本概念

信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务间同步或共享资源的互斥访问。

一个信号量的数据结构中,通常有一个计数值,用于对有效资源数的计数,表示剩下的可被使用的共享资源数,其值的含义分两种情况:

  • 0,表示该信号量当前不可获取,因此可能存在正在等待该信号量的任务。
  • 正值,表示该信号量当前可被获取。

以同步为目的的信号量和以互斥为目的的信号量在使用上有如下不同:

  • 用作互斥时,初始信号量计数值不为 0,表示可用的共享资源个数。在需要使用共享资源前,先获取信号量,然后使用一个共享资源,使用完毕后释放信号量。这样在共享资源被取完,即信号量计数减至 0 时,其他需要获取信号量的任务将被阻塞,从而保证了共享资源的互斥访问。另外,当共享资源数为 1 时,建议使用二值信号量,一种类似于互斥锁的机制。
  • 用作同步时,初始信号量计数值为 0。任务 1 因获取不到信号量而阻塞,直到任务 2 或者某中断释放信号量,任务 1 才得以进入 Ready 或 Running 态,从而达到了任务间的同步。

二、信号量运行机制

  • 信号量初始化,为配置的 N 个信号量申请内存(N 值可以由用户自行配置,通过LOSCFG_BASE_IPC_SEM_LIMIT 宏实现),并把所有信号量初始化成未使用,加入到未使用链表中供系统使用。
  • 信号量创建,从未使用的信号量链表中获取一个信号量,并设定初值。
  • 信号量申请,若其计数器值大于 0,则直接减 1 返回成功。否则任务阻塞,等待其它任务释放该信号量,等待的超时时间可设定。当任务被一个信号量阻塞时,将该任务挂到信号量等待任务队列的队尾。
  • 信号量释放,若没有任务等待该信号量,则直接将计数器加 1 返回。否则唤醒该信号量等待任务队列上的第一个任务。
  • 信号量删除,将正在使用的信号量置为未使用信号量,并挂回到未使用链表。

信号量允许多个任务在同一时刻访问共享资源,但会限制同一时刻访问此资源的最大任务数目。当访问资源的任务数达到该资源允许的最大数量时,会阻塞其他试图获取该资源的任务,直到有任务释放该信号量。

请添加图片描述

三、信号量开发流程

  • 创建信号量 LOS_SemCreate,若要创建二值信号量则调用 LOS_BinarySemCreate。
  • 申请信号量 LOS_SemPend。
  • 释放信号量 LOS_SemPost。
  • 删除信号量 LOS_SemDelete。

四、信号量接口

功能类别接口函数描述
创建/删除信号量LOS_SemCreate创建信号量,返回信号量ID
LOS_BinarySemCreate创建二值信号量,其计数值最大为1
LOS_SemDelete删除指定的信号量
申请/释放信号量LOS_SemPend申请指定的信号量,并设置超时时间
LOS_SemPost释放指定的信号量

五、代码分析(待续…)

坚持就有收获

在这里插入图片描述


http://www.niftyadmin.cn/n/5380552.html

相关文章

黑马鸿蒙教程学习1:Helloworld

今年打算粗略学习下鸿蒙开发,当作兴趣爱好,通过下华为那个鸿蒙开发认证, 发现黑马的课程不错,有视频和完整的代码和课件下载,装个devstudio就行了,建议32G内存。 今年的确是鸿蒙大爆发的一年呀,…

Mybatis-Plus常用技巧

一、官网网站: https://baomidou.com/pages/24112f/#%E7%89%B9%E6%80%A7 技巧和常用方法在官网使用 二、离线安装MybatisX插件-free 1、在idea官网下载插件的zip压缩包,上链接(https://plugins.jetbrains.com/) 2、在搜索框搜…

3 处理机调度和死锁(下)

死锁 引起死锁:需要采用互斥访问的 不可以被抢占的资源(临界资源) 系统资源分类: 可重用性资源 可消耗性资源可抢占性资源 不可抢占性资源 计算机系统中的死锁 竞争不可抢占性资源引起死锁竞争可消耗资源引起死锁进程推进顺序不…

突破编程_C++_面试(基本数据类型)

面试题1:在32位和64位系统上,int、short、long、long long 和 char 类型通常分别占用多少字节 在 32 位和 64 位系统上,int、short、long、long long 和 char 类型的大小可能会有所不同,这取决于编译器和操作系统。但按照常见的约…

帮管家 CRM init 信息泄露漏洞复现 [附POC]

文章目录 帮管家 CRM init 信息泄露漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现帮管家 CRM init 信息泄露漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此…

二.自定义头文件

一.Worker.h 1.1概述 - 类名&#xff1a;Worker - 继承关系&#xff1a;所有其他类&#xff08;Employee、Manager、Boss&#xff09;都继承自该抽象类 - 头文件保护&#xff1a;使用 pragma once 防止头文件重复包含 - 引入标准库&#xff1a;包含 <iostream> 和 <st…

设计模式Python实现

过年在家瞎折腾&#xff0c;闲着无聊看到设计模式&#xff0c;于是就想着用Python实现一下。 简单工厂 根据传入的参数决定创建出哪一种产品类的实例。 class CashFactory:def createCashAdapter(self, type):if type "满100减20":return CashReturn(100, 20)elif…

Springboot之全局异常处理

1、定义异常类 import com.bhl.common.utils.MessageUtils; import com.bhl.common.utils.StringUtils;/*** 基础异常 */ public class BaseException extends RuntimeException {private static final long serialVersionUID 1L;/*** 所属模块*/private String module;/*** 错…