描述:
cpu在类似于播放视频读取文件是否在一直计算(占用)?
例如我在播放电影同时做别的操作,那么我在播放电影时CPU是否一致在占用,如果没有占用,那么播放电影的功能是播放器自己读取视频文件?如果cpu被播放程序占用,那么其他线程用CPU时(时间片?)是不是要抢占cpu的控制权,但是这样交替执行,实际CPU的执行总时间是一定的,怎么会提高性能?
多线程我知道可以使多次提交不堵塞,但是对于CPU的“空闲时间”“效率”以及“读取文件时不占用cpu”这些方面还不甚了解,
我觉得只有了解这些CPU的运行原理才能准确把握什么时候用多线程等以提高cpu的使用效率
请帮解答一下如果利用多线程充分利用CPU
解决方案1:
前面的回答已经说的比较详细了,我再补充一些,具体到这个场景:
“cpu在类似于播放视频读取文件是否在一直计算(占用)?”
答案是:不是。
在视频播放和音频播放这样的场景中,大量的时间其实是花在IO操作和DMA传输上了,所以CPU占用率并不是太高。
你可以简单验证下,PC机中,你播放一个视频,然后监视CPU占用率,你会发现其实没多少。基于ARM的构架也是类似的情况。
因为播放视频时,主要流程是 :从存储器中读取视频文件,通过DMA操作将文件数据传输到内存,解码,通过DMA将数据传输到显示控制器显示。大家知道DMA过程是不需要CPU参与的,而解码过程,如果是硬件解码的话,CPU也很少参与,(所以软件解码的话CPU占用率就会比较高),所以说整个过程其实IO占用的时间是比较多的(不管是读取文件IO,还是把数据送到显示控制器的IO),但由于IO过程是用DMA方式操作的,所以CPU不用管,所以CPU大部分时间空闲,可以去执行别的任务。这就是为什么播放视频音频时CPU占用率其实并不高。
这个问题不能从软件入手,需要知道芯片里面干了什么,得从硬件入手。以手机举例:
放视频,视频控制器是从内存数据块链读取内容,解码,送到显示控制器。
图形界面,GPU是从内存数据块链读取内容,合成,送到显示控制器。
显示控制器把从GPU和视频控制器送来的数据混合,输出,或者继续送给GPU做旋转等操作,然后GPU重新送给显示控制器。所有的步骤都是从内存数据块链读取或者写入内容。内存是中介。
CPU上驱动的工作是把数据分块,组成链,把基地址告诉各个控制器,并让他们处理。GPU复杂些,CPU先要动态解释命令,然后送给GPU。整个过程内存也是中介。
如果数据的源头来自文件,进过CPU驱动层层解析,闪存控制器读取数据块,送到内存供视频控制器读取。
上面这些事,你可以写一个单线程做完,也可以多线程做,分布到不同的CPU。既可以中断触发也可以轮询,不过一般是中断。
手机上把握使用率,那不是手工干的,是有ITS/IPA/EAS或者调度软件根据大小核的热模型来推导出哪个核或者那几个核干最省电。
不知是否解释了你的疑惑。
“cpu在类似于播放视频读取文件是否在一直计算(占用)?”
答案是:从宏观来说是的,但实际肯定不是一直占用。打开音频/视频文件就一直没有关,只是会读一部分到内存中做缓冲。
去测试 CPU 使用会发现,CPU 使用率会一直有,但不高(这是宏观的表现);但从源代码分析,肯定其中存在 CPU 轮转,如:Sleep、或者其它。