Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance ARM9上Linux的线程性能较慢_Performance_Embedded_Pthreads_Arm9 - Fatal编程技术网

Performance ARM9上Linux的线程性能较慢

Performance ARM9上Linux的线程性能较慢,performance,embedded,pthreads,arm9,Performance,Embedded,Pthreads,Arm9,当我编写一个简单的应用程序,运行10分钟,启动10个线程一次(pthreads),每个线程在一个循环中休眠1毫秒(不做任何其他事情),CPU的使用率约为44%(top报告了这一点)。它是一个ARM9CPU,具有450MHz,Linux 2.6.37用作操作系统。没有其他程序在运行,它尝试了不同的内核配置(动态滴答声、软/硬IRQ、高分辨率计时器等),不同的优先级(高达99),但数字保持不变/usr/bin/time-v显示了大约5'200'000个自愿性上下文切换,大约在内核空间中花费了3分钟。

当我编写一个简单的应用程序,运行10分钟,启动10个线程一次(pthreads),每个线程在一个循环中休眠1毫秒(不做任何其他事情),CPU的使用率约为44%(
top
报告了这一点)。它是一个ARM9CPU,具有450MHz,Linux 2.6.37用作操作系统。没有其他程序在运行,它尝试了不同的内核配置(动态滴答声、软/硬IRQ、高分辨率计时器等),不同的优先级(高达99),但数字保持不变
/usr/bin/time-v
显示了大约5'200'000个自愿性上下文切换,大约在内核空间中花费了3分钟。在每个线程中休眠约5毫秒,CPU利用率下降到约9%,这在我看来仍然很疯狂(40'500'000个周期以保护某些寄存器)。clock_nanosleep用于睡眠(clock_REALTIME/clock_Monotic没有改变任何东西)


我知道在ARM9上使用全上下文切换代价很高,因为必须清除缓存。但是一个简单的线程切换,或者切换到操作系统,不应该像IMHO那样昂贵(地址空间保持不变,不需要缓存/TLB刷新)。这是常见的还是我应该试着在内核中找到瓶颈?

您正忙着以100uS的间隔醒来并返回睡眠状态--10个线程,1ms,即平均100uS。请记住,在这100uS的时间间隔中,每一个都有两个上下文切换,因此平均每50uS有一个上下文切换,或每秒20000次


也许这就是你要寻找的答案?

你正忙着醒来,然后每隔100秒再睡觉——10个线程,1毫秒,平均是100秒。请记住,在这100uS的时间间隔中,每一个都有两个上下文切换,因此平均每50uS有一个上下文切换,或每秒20000次


也许这就是你要寻找的答案?

你在
睡眠中使用的是什么原语?(我不知道你的问题,但似乎这可能很有意思。)@Mat忘了添加它,更改了它你在
睡眠中使用的是什么原语?(我不知道你的问题,但似乎可能对此感兴趣。)@Mat忘了补充一下,在1ms的时间范围内更改了它,应该运行10个线程,因此需要10个上下文切换。正如我所描述的,
/usr/bin/time
显示了我期望的许多上下文切换。100美等于45000次循环。44%为约20000次循环(如果采用9%和5 ms,结果几乎相同)。保存/还原寄存器的20000个周期,并选择另一个线程。我想这里缺少了一些东西。首先,调度线程需要两个上下文切换。第一个是线程1停止时,O/S获得控制权。第二个是在调度线程2时。上下文切换对处理器不“友好”,并导致处理器、其管道、缓存控制器等的大规模中断。在1毫秒的时间范围内,应运行10个线程,因此需要10个上下文切换。正如我所描述的,
/usr/bin/time
显示了我期望的许多上下文切换。100美等于45000次循环。44%为约20000次循环(如果采用9%和5 ms,结果几乎相同)。保存/还原寄存器的20000个周期,并选择另一个线程。我想这里缺少了一些东西。首先,调度线程需要两个上下文切换。第一个是线程1停止时,O/S获得控制权。第二个是在调度线程2时。上下文切换对处理器不“友好”,并导致处理器、其管道、缓存控制器等的大规模中断。