鸿蒙LiteOs读源码教程+向LiteOS中添加一个简单的基于线程运行时的短作业优先调度策略

本文主要是介绍鸿蒙LiteOs读源码教程+向LiteOS中添加一个简单的基于线程运行时的短作业优先调度策略,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 鸿蒙Liteos读源码教程:

鸿蒙的源码是放在openharmony文件夹下,openharmony下的kernel文件夹存放操作系统内核的相关代码和实现。

内核是操作系统的核心部分,所以像负责:资源管理、任务调度、内存管理、设备驱动、进程通信的源码都可以在kernel文件夹里看到。

进入到kernel文件夹下后会看到liteos_a和liteos_m,我们只需要知道liteos_a是针对嵌入式设备的,所以像我们实验用的开发板就是看liteos_a下的代码,而liteos_m是针对物联网设备设计的,所以我们暂时先不去看这个。

进入liteos_a后真正的核心代码同样是存储在kernel下的:

主要介绍3个比较重要的:

base:该文件夹包含操作系统内核的基础部分,如调度器,同步机制,内存管理等基础功能的实现。

include:该文件夹包含内核需要的所有头文件。

user:该文件夹包含一些用户级别的功能,如用户任务,用户接口等。

所以如果想查看有关内核的代码就进入base文件夹,想查看或者修改头文件就进入include文件夹。

假设我们现在进入到base文件夹:

接下来我逐一向大家简要介绍:

core:包含了内核的核心代码,比如初始化代码,启动代码等。

include:包含了base部分所有的头文件。

ipc:是inter-process communication的缩写,和进程相关,包含了实现进程间通信的代码。

mem:是内存缩写,包含了实现内存管理的代码,如内存分配、内存释放等。

misc:包含杂项代码,如工具函数,调试功能。

mp:包含多处理器相关的代码,如多核心调度,同步等。

om:包含LiteOS的运维相关代码。

sched:是调度缩写,包含了LiteOS的任务调度代码,包括任务的创建,删除,切换等。

vm:是虚拟内存的缩写,包含了实现虚拟内存管理的代码,如页表管理,地址转换等。

实验名称:

Project2:向LiteOS中添加一个简单的基于线程运行时间的短作业优先调度策略

实验要求:

短作业优先调度策略为优化LiteOS的吞吐量。该策略在将线程TCB插入就绪队列时,按照线程执行的时间长短进行排序。运行时间短的线程先运行,运行时间长的线程后运行。该Proj要完成以下内容:

第1步:修改LiteOS内核的PriQueInsert函数,在其中添加相关代码,实现按照任务运行时间的长短将任务的TCB插入就绪队列。

解析:liteos里似乎并没有PriQueInsert这个函数,初步思路是可以自己创建一个,或者在原有的函数基础上进行修改。

在Home/openharmony/kernel/liteos_a/kernel/base/sched/sched_sq目录下的los_priqueue.c文件里有OsPriQueueEnqueueHead和OsPriQueueEnqueue函数。

第2步:在短作业优先调度策略中,采用LiteOS中定义的SchedParam结构体中的timeSlice成员作为该作业的运行时间。

解析:在liteos_a/kernelbase/include下有los_task_pri.h里面定义了任务调度模块(TaskCB)的数据结构,LosTaskCB;

第3步:在用户层生成至少3个线程,通过pthread_attr_getschedparam函数pthread_attr_setschedparam函数,修改所生成线程的调度策略为“短作业优先“调度策略,并对timeSlice进行赋值,表示该线程的运行时间。验证你所编写的调度策略是正确的。线程内部可以用while语句循环timeSlice规定的时间,然后打印自己的TID后退出。例如,对这3个线程的timeSlice分别赋予1、5、9。那么这3个线程也按照这个顺序完成,即第一个线程1秒后退出,第二个线程5秒后退出,第三个线程9秒后退出。用户层采用pthread库实现,相关代码参考下面博客:

Linux线程调度策略以及优先级实验(图文)

解析:

1、包含头文件:在用户层代码中包含 LiteOS 的相关头文件。通常包括 "los_task.h" 和 "los_config.h"。

2、定义任务函数:定义至少3个任务函数,作为线程的入口点。例如,可以定义三个函数,分别为 task1、task2 和 task3。

3、配置任务参数:通过pthread_attr_getschedparam函数和pthread_attr_setschedparam函数,修改所生成线程的调度策略为“短作业优先“调度策略,并对timeSlice进行赋值,表示该线程的运行时间。

4、创建线程:使用Los_TaskCreate来创建线程。最后LOS_Start()来启动调度。

通过下面的while循环来控制退出的时间:

while (count < timeSlice){// 线程2的代码count++;
}

通过下面语句打印TID: 

 printf("Thread 2, TID: %d\n", LOS_CurTaskID());

最后删除: 

LOS_TaskDelete(LOS_CurTaskID());

实验准备:

pthread_after_getschedparam函数:

pthread_attr_setschedparam函数:

OsPriQueueInit初始化优先级队列,创建一个优先级队列数组,并将每个队列初始化为空。

OsPriQueueTop获取指定优先级队列中的头节点。

OsPriQueueEnqueueHead将节点插入指定优先级队列的头部。

OsPriQueueEnqueue将节点插入指定优先级队列的尾部。

OsPriQueueDequeue从指定优先级队列中删除节点。

OsPriQueueProcessDequeue从进程优先级队列中删除节点。

OsPriQueueProcessSize获取进程优先级队列中指定优先级的节点数量。

OsPriQueueSize获取指定优先级队列中的节点数量。

OsSchedSwitchProcess在进程切换时,将当前运行的进程切换到新的进程。这个函数会处理进程的状态、运行任务数量以及虚拟内存的切换等操作。

OsSchedResched触发调度器重新调度任务。根据当前运行的任务和获取的最高优先级任务,进行任务切换。

OsSchedPreempt在满足抢占条件时,触发任务的抢占。将当前运行的任务添加回就绪队列,然后进行调度切换。

这篇关于鸿蒙LiteOs读源码教程+向LiteOS中添加一个简单的基于线程运行时的短作业优先调度策略的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步

Java -jar命令如何运行外部依赖JAR包

《Java-jar命令如何运行外部依赖JAR包》在Java应用部署中,java-jar命令是启动可执行JAR包的标准方式,但当应用需要依赖外部JAR文件时,直接使用java-jar会面临类加载困... 目录引言:外部依赖JAR的必要性一、问题本质:类加载机制的限制1. Java -jar的默认行为2. 类加