opencore内部调度

任务调度和开源软件opencron的使用经验          本文是我在一个技术分享群里面,对于任务调度和开源软件opencron的分享和使用体会,现在整理成文字,供大家参考。         大家好,下面我来分享一下 部署和使用 opencron 任务调度工具的一些经验和体会         我计划从五个方面来进行分享: 1 任务调度需求与要素分析         任务调度,平时在大家的工作中应该会遇到比较多 阅读详情

1 引言
多媒体框架是非常重要而又令人关心的模块,尤其在android的系统上,多媒体播放效果如何,对其框架了解是非常必要的。
多媒体中的调度问题,是个背后的故事,但却对性能影响至关重要,本文并非全面分析多媒体框架,旨在探讨媒体框架调度方面与传统的多线程应用间的差异。 
2 基本知识
1 多媒体框架
    宏观上看多媒体框架一般包含:engine、parser、codec、output,engine为控制部分,parser为文件解析及读取部分,codec就是音视频编解码,output包含音视频输出。针对不同文件类型及编解码器,会有多种parser及codec。
2 Linux线程
    一般来讲linux都会定义最大线程为1024,不过还没有看到哪个系统运行起来有如此之多的线程存在,也有网评说创建到382个线程时返回失败。最大线程数目会受到系统资源的影响。
    多线程在管理调度上也会影响系统性能,影响的是kernel部分。
    多线程应用设计中,数据共享是个问题,线程A和线程B间共享数据,为确保数据访问有效,会引入锁,比如信号量。多个线程中,信号量等待是很重要的,有时线程A的数据准备OK了,但线程B没有用完,那么接下来线程A只能死等或是空转。
    多线程中,还要避免线程死锁。 
3 调度对比
    在此我们拿传统while循环、多线程模式、opencore调度模式作对比,如下图示。
模式一:
    顺序执行,有新模块加入就挨着添加。
模式二:
    不论有限与否,ABCD四个模块都在独立运行,即使浪费也要空转。
模式三:
    由统一调度器调度,优先者优先调度,ABCD四个模块都注册到调度器上,通过状态机切换触发下一次调度,谁着急被再次调用谁就去触发调度器执行,相对公平。Opencore采用该模式,PlayerDriver创建后进入OSCL线程来处理消息,engine创建完各个node节点并将其连接起来,剩下的就是node间的通讯问题,各node状态变化会触发oscl对其下一次调度,参与到oscl调度中的模块都必须提供一个Run函数,oscl会去call这个函数。

4 opencore为何不用多线程
因为有人曾疑问,为什么opencore不去创建大量线程来调度,那样不是更快,事实上opencore是采用上述模式三来解决调度问题的。附上一张oscl调度相关的类图。

opencore中为何不大量去创建线程来完成各个模块,暂时没有看到opencore的官方设计文档来讲述其设计思路,只能通过代码去分析,下述也仅一家之言供参考。
1 从模块化去看,opencore有很多模块,包含engine、player、author、parser、omx、codec、output、audio、video等,并且opencore抽象出来个概念叫node,parser/codec/omx都被封装成node,engine负责把各个node节点创建并连接起来后,剩下的就是各个node节点之间的通讯,它们由统一调度器来调度。试想,如果每个node(或者说模块)都去创建一个线程去执行,如何管理是个问题,也有悖软件工程的模块化思想。
2 从模块化再看,假如把多媒体缩减到engine、parser、decoder三个模块,如果多线程去做,会有三个线程,这是其一,其二,文件类型识别及解码器识别需要事先完成,必然由engine去完成,从而决定用哪个parser和decoder。Opencore里分的很清楚,各个模块干各自的事情,一个线程统一调度完成。
3 从CS模型去看,android中多媒体采用服务器客户端架构来实现,客户端是jiava程序,仅用于一些API的封装、控制指令的下放等;核心的媒体播放控制都在服务器端实现,它们之间通过binder调用衔接。当有客户端发起媒体请求时,服务器就创建一个client去对应它,如果有第二个媒体请求,就会创建第二个client来对应。如此一来,服务器端可能会存在多个client,每个client都是一个媒体引擎的实例,假如opencore采用了多线程模式,又假如引擎总共涉及6个线程,倘若有五个客户端发起请求,系统就会增加30个线程,如此一来显然增加kernel的调度时间,影响系统性能。而采用opencore的统一调度,五个客户端也就呼起五个线程,这是可以接受的。
4 从多媒体的应用场景来看,视频播放、短信铃声、彩信铃声、电话铃声、闹钟铃声是会同时出现的,这样就触发了上述多种客户端的情况。
5 从可移植看,opencore采用的统一调度器叫oscl,它是一个抽象封装,基于oscl之上可以看做纯软件模块,如此一来opencore可以很容易的移植到各个平台,且保持一致性。
6 从扩展性看,opencore现有框架添加一个模块很容易,比如添加rmvb的支持,只要添加一个rmvb的parser-node即可,对系统框架没有任何影响。如果采用多线程,rmvb的parser肯定要实现,engine中要添加rmvb识别部分,也会添加创建rmvb-parser线程部分。
7 多线程肯定是最快的,但复杂系统考虑自身架构设计及可扩展性,势必在多线程的应用上采取谨慎态度。关键的问题,应该还是落在系统性能上,拿200M主频和1G主频作对比,在200M主频处理器上再怎么优化,也赶不上1G处理器,换句话说,1G处理器上即使框架再烂,系统运行的也不会太差。
8 DirectX中也有一个filter的概念(类似opencore中的node节点),应用directx开发中,只要把各个filter连接起来即可,剩下的是filter间的事情。 
5 附录
附录两张图,均来自网络。

一张opencore的框架图。
下面是代码片段

http://blogold.chinaunix.net/u2/61880/showart_2330325.html

opencron一个功能完善真正通用的linux定时任务调度定系统 opencron一个功能完善真正通用的linux定时任务调度定系统,满足多种场景下各种复杂的定时任务调度,同时集成了linux实时监控,webssh,提供一个方便管理定时任务的平台. 立即下载

相关推荐

别再只接个放大器了!压电传感器测量电路(电压/电荷放大器)的5个实战配置要点

本文深入解析压电传感器测量电路中的5个关键实战配置要点,包括电缆长度选择、输入阻抗匹配、过载保护设计、低频噪声抑制及放大器选型策略。特别针对电压放大器和电荷放大器的应用场景差异提供工程实践建议,帮助工程师有效解决信号失真、噪声干扰等常见问题,提升测量精度和系统可靠性。

weixin_26869081的博客 302

1024

听说今天发帖能有1024勋章?

Talk is cheap,show me the code. 13万+

FPGA以太网开发实战:YT8511 PHY芯片MDIO接口配置全流程(附Verilog代码)

本文详细介绍了FPGA以太网开发中YT8511 PHY芯片MDIO接口的配置全流程,包括MDIO接口技术解析、Verilog状态机设计、核心代码实现细节及实战调试经验。通过提供经过验证的Verilog代码和优化策略,帮助开发者快速掌握以太网PHY芯片配置技术,提升通信系统性能。

weixin_29184371的博客 232

OpenCore内部调度

1引言 多媒体框架是非常重要而又令人关心的模块,尤其在android的系统上,多媒体播放效果如何,对其框架了解是非常必要的。 多媒体中的调度问题,是个背后的故事,但却对性能影响至关重要,本文并非全面分析多媒体框架,旨在探讨媒体框架调度方面与传统的多线程应用间的差异。

dssxk的专栏 849

SAP ABAP实战:如何用CVI_EI_INBOUND_MAIN批量更新BP邮箱(附完整代码)

本文深入解析了SAP ABAP中CVI_EI_INBOUND_MAIN函数在业务伙伴(BP)邮箱地址批量维护场景下的应用。通过详细讲解数据结构构建、关键参数(如任务参数'5')配置及完整代码示例,为开发者提供了一套高效、稳定的批量更新解决方案,并分享了性能优化与错误处理的最佳实践。

weixin_29228781的博客 77

EPSON RX8010SJ RTC实战:I2C寄存器配置避坑指南(附完整初始化代码)

本文详细解析了EPSON RX8010SJ RTC芯片在I2C寄存器配置中的常见问题与解决方案,包括TEST位、STOP位和中断控制等关键配置要点。通过实战经验分享和完整的初始化代码模板,帮助开发者避免常见陷阱,确保RTC模块的稳定运行。

weixin_28678831的博客 406

OpenCore介绍

From:http://blog.youkuaiyun.com/ponder008/article/details/6414103

MaximusKiang的专栏 1207

【华为OD机试真题 2025C卷新题】855、识文断句 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025C卷新题】855、识文断句 | 机试真题+思路参考+代码分析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为

KJ.JK 1850

Opencore介绍

一、OpenCore简介         OpenCore是Android的多媒体核心,采用C++实现,定义了全功能的操作系统移植层(OSCL),各种基本的功能均被封装成类的形式,各层次之间的接口多使用继承等方式。         从宏观上来看,它主要包含了两大方面的内容: PVPlayer:提供媒体播放器的功能,完成各种音频(Audio)、视频(Video)流的回放(Pla

yuyin86的专栏 1344

5大步骤!轻松玩转Dorisoy.Rigger:基于.NET Core 6、MAUI和Blazor的多数据库开发框架生成器

各位小伙伴,你们是否厌倦了每次项目启动都要从头配置数据库连接、编写重复的代码?今天,我们就来聊聊如何使用Dorisoy.Rigger这个强大的开发框架生成器,让你的.NET Core 6、MAUI和Blazor项目开发变得简单又高效!准备好迎接开发的新乐趣了吗?让我们一起开始吧!接下来,我们需要定义数据模型。假设我们有一个简单的用户表,包含ID、用户名和密码字段。在项目中创建一个新的类文件,命名为User.csset;set;set;这段代码定义了一个用户模型,其中包含了用户的ID、用户名和密码。

java专栏 1738

yolov7目标追踪:基于自定义数据集完成检测

目标追踪包含两个阶段:(1)基于自定义数据集,训练yolo目标检测模型;(2)基于检测模型,将实时检测结果传递到StrongSORT追踪算法中,该算法在OSNet基础上结合运动和外观信息,可以跟踪yolo模型检测到的任何物体。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2306

OpenCore学习笔记(1)

一、OPENCORE 之 SchedulerOsclSchedulerOsclExecSchedulerOsclExecSchedulerCommonBase  1. OsclScheduler::Init()→ int AuthorDriver::authorThread()→ OsclScheduler::Init("AndroidAuthorDriver"

- 没头的苍蝇 - 1625

机器学习(十九):梯度提升回归(GBR)

机器学习中的梯度提升回归算法原理与案例实战。

全栈川川 5156
上一篇: android 多媒体框架中mediaplay与opencore的衔接调用过程
下一篇: Android下的PVPlayer的实现
eustoma
博客等级 码龄18年 79粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值