SylixOS里的资源调度操作

2023-11-03 06:18
文章标签 操作 资源 调度 sylixos

本文主要是介绍SylixOS里的资源调度操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

SylixOS里有许多动态资源,这些系统资源如下:

名称类型
Tcb线程控制块
Event事件
EventSet事件集
ThreadVar线程私有数据
Heap
MsgQueue消息队列
Timer软件定时器
Partition定长分区内存管理
Rms精度单调调度器

这些资源的调度,即资源的分配及回收操作,是通过单向资源分配表来实现的,为O(1)时间复杂度,这样就保证了资源分配或回收操作的实时性。

这些操作位于libsylixos\SylixOS\kernel\list文件夹中,单向资源分配表的实现和用法见《SylixOS里的单向资源分配表实现》

接口

这些资源和接口如下:

/*********************************************************************************************************THREAD ID RESOURCE
*********************************************************************************************************/
PLW_CLASS_TCB        _Allocate_Tcb_Object(VOID);
VOID                 _Free_Tcb_Object(PLW_CLASS_TCB    ptcbFree);
/*********************************************************************************************************EVENT RESOURCE (Semaphore & MsgQueue)
*********************************************************************************************************/
PLW_CLASS_EVENT      _Allocate_Event_Object(VOID);
VOID                 _Free_Event_Object(PLW_CLASS_EVENT  pevent);
/*********************************************************************************************************THREAD PRIVATE VAR RESOURCE
*********************************************************************************************************/
PLW_CLASS_THREADVAR  _Allocate_ThreadVar_Object(VOID);
VOID                 _Free_ThreadVar_Object(PLW_CLASS_THREADVAR    pthreadvarFree);
/*********************************************************************************************************EVENT SET RESOURCE
*********************************************************************************************************/
PLW_CLASS_EVENTSET   _Allocate_EventSet_Object(VOID);
VOID                 _Free_EventSet_Object(PLW_CLASS_EVENTSET  pesFree);
/*********************************************************************************************************HEAP RESOURCE
*********************************************************************************************************/
PLW_CLASS_HEAP       _Allocate_Heap_Object(VOID);
VOID                 _Free_Heap_Object(PLW_CLASS_HEAP    pheapFree);
/*********************************************************************************************************MESSAGE QUEUE RESOURCE
*********************************************************************************************************/
PLW_CLASS_MSGQUEUE   _Allocate_MsgQueue_Object(VOID);
VOID                 _Free_MsgQueue_Object(PLW_CLASS_MSGQUEUE    pmsgqueueFree);
/*********************************************************************************************************TIMER RESOURCE
*********************************************************************************************************/
PLW_CLASS_TIMER      _Allocate_Timer_Object(VOID);
VOID                 _Free_Timer_Object(PLW_CLASS_TIMER  ptmrFree);
/*********************************************************************************************************PARTITION RESOURCE
*********************************************************************************************************/
PLW_CLASS_PARTITION  _Allocate_Partition_Object(VOID);
VOID                 _Free_Partition_Object(PLW_CLASS_PARTITION    p_partFree);
/*********************************************************************************************************RMS RESOURCE
*********************************************************************************************************/
PLW_CLASS_RMS        _Allocate_Rms_Object(VOID);
VOID                 _Free_Rms_Object(PLW_CLASS_RMS    prmsFree);

实现

这些系统资源调度的接口和实现都是类似的,都需要定义一个资源管理对象,资源类型。其中资源管理对象一定包含表头表尾指针和一些统计计数,资源类型则一定要包含一个节点对象。下面以事件资源为例讲解调度操作。

  1. 资源管理对象类型定义
    必须包含单向资源分配表的表头指针和表尾指针,并且增加了当前使用计数和最大使用计数。
/*********************************************************************************************************系统对象资源结构
*********************************************************************************************************/typedef struct {LW_LIST_MONO_HEADER   RESRC_pmonoFreeHeader;                        /*  空闲链表头                  */LW_LIST_MONO_HEADER   RESRC_pmonoFreeTail;                          /*  空闲链表尾                  */UINT                  RESRC_uiUsed;                                 /*  当前使用量                  */UINT                  RESRC_uiMaxUsed;                              /*  最大使用量                  */
} LW_CLASS_OBJECT_RESRC;
  1. 事件对象类型定义
    必须有一项为单向资源分配表节点,其他成员则是事件对象特有的。如果单向资源分配表节点成员为第一项则可以强转为单向资源分配表节点使用;不是第一项的话,则通过宏_LIST_ENTRY也可以进行对象转换,SylixOS用的是第二种方法。
/*********************************************************************************************************事件控制块 (可用于计数及二进制信号量、互斥信号量量、消息队列、PART内存池)
*********************************************************************************************************/typedef struct {LW_LIST_MONO          EVENT_monoResrcList;                          /*  空闲资源表                  */UINT8                 EVENT_ucType;                                 /*  事件类型                    */PVOID                 EVENT_pvTcbOwn;                               /*  占有资源的TCB指针           */                                                                    /*  可以在加入死锁检测机制      */ULONG                 EVENT_ulCounter;                              /*  计数器值                    */ULONG                 EVENT_ulMaxCounter;                           /*  最大技术值                  */INT                   EVENT_iStatus;ULONG                 EVENT_ulOption;                               /*  事件选项                    */UINT8                 EVENT_ucCeilingPriority;                      /*  天花板优先级                */PVOID                 EVENT_pvPtr;                                  /*  多用途指针                  */LW_CLASS_WAITQUEUE    EVENT_wqWaitQ[2];                             /*  双等待队列                  */UINT16                EVENT_usIndex;                                /*  缓冲区中的下标              */CHAR                  EVENT_cEventName[LW_CFG_OBJECT_NAME_SIZE];    /*  事件名                      */
} LW_CLASS_EVENT;
typedef LW_CLASS_EVENT   *PLW_CLASS_EVENT;
  1. 资源初始化
    将静态分配的资源数组初始化为空闲单链表。同时初始化资源块的其他成员。
/*********************************************************************************************************
** 函数名称: _EventInit
** 功能描述: 初始化事件缓冲池
** 输 入  : 
** 输 出  : 
*********************************************************************************************************/
VOID  _EventInit (VOID)
{
#if  (LW_CFG_EVENT_EN > 0) && (LW_CFG_MAX_EVENTS > 0)REGISTER ULONG                 ulI;REGISTER PLW_CLASS_EVENT       peventTemp1;REGISTER PLW_LIST_MONO         pmonoTemp1;#if  LW_CFG_MAX_EVENTS == 1_K_resrcEvent.RESRC_pmonoFreeHeader = &_K_eventBuffer[0].EVENT_monoResrcList;/*  设置资源表头            */peventTemp1 = &_K_eventBuffer[0];                                       /*  指向缓冲池首地址        */pmonoTemp1  = &peventTemp1->EVENT_monoResrcList;                        /*  获得资源表              */peventTemp1->EVENT_ucType  = LW_TYPE_EVENT_UNUSED;                      /*  事件类型                */peventTemp1->EVENT_usIndex = 0;                                         /*  事件缓冲区下标          */_INIT_LIST_MONO_HEAD(pmonoTemp1);                                       /*  初始化最后节点          */_K_resrcEvent.RESRC_pmonoFreeTail = pmonoTemp1;#elseREGISTER PLW_CLASS_EVENT    peventTemp2;REGISTER PLW_LIST_MONO      pmonoTemp2;_K_resrcEvent.RESRC_pmonoFreeHeader = &_K_eventBuffer[0].EVENT_monoResrcList;/*  设置资源表头            */peventTemp1 = &_K_eventBuffer[0];                                       /*  指向缓冲池首地址        */peventTemp2 = &_K_eventBuffer[1];                                       /*  指向缓冲池首地址        */for (ulI = 0; ulI < ((LW_CFG_MAX_EVENTS) - 1); ulI++) {pmonoTemp1 = &peventTemp1->EVENT_monoResrcList;                     /*  获得资源表              */pmonoTemp2 = &peventTemp2->EVENT_monoResrcList;                     /*  获得资源表              */peventTemp1->EVENT_ucType  = LW_TYPE_EVENT_UNUSED;                  /*  事件类型                */peventTemp1->EVENT_usIndex = (UINT16)ulI;                           /*  事件缓冲区下标          */_LIST_MONO_LINK(pmonoTemp1, pmonoTemp2);                            /*  建立资源连接            */peventTemp1++;peventTemp2++;}/*  初始化最后一个节点      */pmonoTemp1 = &peventTemp1->EVENT_monoResrcList;                         /*  获得资源表              */peventTemp1->EVENT_ucType  = LW_TYPE_EVENT_UNUSED;                      /*  事件类型                */peventTemp1->EVENT_usIndex = (UINT16)ulI;                               /*  事件缓冲区下标          */_INIT_LIST_MONO_HEAD(pmonoTemp1);                                       /*  初始化最后节点          */_K_resrcEvent.RESRC_pmonoFreeTail = pmonoTemp1;
#endif                                                                      /*  LW_CFG_MAX_EVENTS == 1  */_K_resrcEvent.RESRC_uiUsed    = 0;_K_resrcEvent.RESRC_uiMaxUsed = 0;#endif                                                                      /*  (LW_CFG_EVENT_EN > 0)   *//*  (LW_CFG_MAX_EVENTS > 0) */
}
  1. 资源分配
    从空闲单链表头部拆下一个资源块。后面就可以对该资源块进行操作了,开启 了它的生命周期。
/*********************************************************************************************************
** 函数名称: _Allocate_Event_Object
** 功能描述: 从空闲Event控件池中取出一个空闲Event
** 输 入  : 
** 输 出  : 获得的Object地址,失败返回 NULL
*********************************************************************************************************/
PLW_CLASS_EVENT  _Allocate_Event_Object (VOID)
{REGISTER PLW_LIST_MONO    pmonoFree;REGISTER PLW_CLASS_EVENT  peventFree;if (_LIST_MONO_IS_EMPTY(_K_resrcEvent.RESRC_pmonoFreeHeader)) {     /*  检查缓冲区是否为空          */return  (LW_NULL);}pmonoFree  = _list_mono_allocate_seq(&_K_resrcEvent.RESRC_pmonoFreeHeader, &_K_resrcEvent.RESRC_pmonoFreeTail);/*  获得资源                    */peventFree = _LIST_ENTRY(pmonoFree, LW_CLASS_EVENT, EVENT_monoResrcList);                      /*  获得资源表容器地址          */_K_resrcEvent.RESRC_uiUsed++;if (_K_resrcEvent.RESRC_uiUsed > _K_resrcEvent.RESRC_uiMaxUsed) {_K_resrcEvent.RESRC_uiMaxUsed = _K_resrcEvent.RESRC_uiUsed;}return  (peventFree);
}
  1. 资源回收
    资源块使用完毕后需要回收,即将一个资源块插入空闲链表头部,这样就可以等待被再次使用了。
/*********************************************************************************************************
** 函数名称: _Free_Event_Object
** 功能描述: 将Event控制块交还缓冲池
** 输 入  : 
** 输 出  : 
*********************************************************************************************************/
VOID  _Free_Event_Object (PLW_CLASS_EVENT  pevent)
{REGISTER PLW_LIST_MONO    pmonoFree;pmonoFree = &pevent->EVENT_monoResrcList;_list_mono_free_seq(&_K_resrcEvent.RESRC_pmonoFreeHeader, &_K_resrcEvent.RESRC_pmonoFreeTail, pmonoFree);_K_resrcEvent.RESRC_uiUsed--;
}

这篇关于SylixOS里的资源调度操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/336173

相关文章

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

MySQL——表操作

目录 一、创建表 二、查看表 2.1 查看表中某成员的数据 2.2 查看整个表中的表成员 2.3 查看创建表时的句柄 三、修改表 alter 3.1 重命名 rename 3.2 新增一列 add 3.3 更改列属性 modify 3.4 更改列名称 change 3.5 删除某列 上一篇博客介绍了库的操作,接下来来看一下表的相关操作。 一、创建表 create

一种改进的red5集群方案的应用、基于Red5服务器集群负载均衡调度算法研究

转自: 一种改进的red5集群方案的应用: http://wenku.baidu.com/link?url=jYQ1wNwHVBqJ-5XCYq0PRligp6Y5q6BYXyISUsF56My8DP8dc9CZ4pZvpPz1abxJn8fojMrL0IyfmMHStpvkotqC1RWlRMGnzVL1X4IPOa_  基于Red5服务器集群负载均衡调度算法研究 http://ww

49个权威的网上学习资源网站

艺术与音乐 Dave Conservatoire — 一个完全免费的音乐学习网站,口号是“让每一个人都可以接受世界级的音乐教育”,有视频,有练习。 Drawspace — 如果你想学习绘画,或者提高自己的绘画技能,就来Drawspace吧。 Justin Guitar — 超过800节免费的吉他课程,有自己的app,还有电子书、DVD等实用内容。 数学,数据科学与工程 Codecad

封装MySQL操作时Where条件语句的组织

在对数据库进行封装的过程中,条件语句应该是相对难以处理的,毕竟条件语句太过于多样性。 条件语句大致分为以下几种: 1、单一条件,比如:where id = 1; 2、多个条件,相互间关系统一。比如:where id > 10 and age > 20 and score < 60; 3、多个条件,相互间关系不统一。比如:where (id > 10 OR age > 20) AND sco

PHP7扩展开发之流操作

前言 啥是流操作?简单来讲就是对一些文件,网络的IO操作。PHP已经把这些IO操作,封装成流操作。这节,我们将使用PHP扩展实现一个目录遍历的功能。PHP示例代码如下: <?phpfunction list_dir($dir) {if (is_dir($dir) === false) {return;} $dh = opendir($dir);if ($dh == false) {ret

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p