linux-kernel - 通过 prio-preempt 在 Linux RT LTS4.4 上测试优先级抢占
问题描述
我的系统使用 Arm cortexa7@1GHz 和来自 CIP 社区的实时补丁集 Linux 4.4.138-rt19:v4.4.138-cip25-rt19
我已经运行了一个 prio-preempt.c 来验证我系统上的优先级抢占。但是我遇到了一个问题:系统可能只运行了少于 27 个创建线程的线程。
关于理论方面,ltp app prio-preempt 创建了 27 个具有不同优先级的 worker_threads,N 个 busy_threads(N:取决于 CPU 的数量,在我的情况下 N = 2)具有高优先级,以及 master_thread(最高优先级)。
将应用程序部署到板上时,threads_running始终低于 27,而create_fifo_thread(worker_thread,i,...)成功创建了 27 个 worker_thread(s)。我在 cortexa15@1.5GHz 上运行了上面相同的程序,问题没有发生。
为了进一步了解,我认为问题可能来自 Linux RT 调度程序在bmutex锁被释放后无法唤醒睡眠线程。
有人对我有同样的问题吗?请分享你的想法。
解决方案
基本上,在 Linux FULL Preemptive RT 系统中,较高优先级的线程总是抢占较低优先级的线程来控制 CPU。就我而言,问题实际上发生在速度更高的处理器上,我在双 cortexa15@1.5 GHz 或四核 cortexa15@1.4GHz 上进行了测试。但是,失败率要低得多。
因为问题是随机发生的,所以在发生故障的情况下,所有 CPU 都会同时执行优先级较高的线程,而忘记优先级较低的线程。
因此,我分配了某个 CPU 来执行特定线程(高优先级)。
#define CPU_0 0x01 /* Bind CPU 0 */
#define CPU_1 0x02 /* Bind CPU 1 */
#define CPU_2 0x04 /* Bind CPU 2 */
#define CPU_3 0x08 /* Bind CPU 3 */
...
{
unsigned long cpuset = CPU_0;
if (pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset) < 0) {
printf("failed to pthread_setaffinity_np\n");
}
}
并让出其他 CPU 来完成其他工作(低优先级)。我的系统不再挂起,可能会运行所有 27 个 worker_thread(低优先级线程)
推荐阅读
- scala - 来自 Join 的嵌套对象
- javascript - 如何在表数据中通过 javaScript 使用“按日期排序”?
- node.js - 无法将数据从角度发布到节点 api
- jekyll - 待办事项列表在 GitHub 页面上呈现不同
- python - 为什么 numpy 没有出现在我的 virtualenv 中的 pip3 列表中,即使我在两秒前安装了 pip3 install numpy ?
- reactjs - Reactjs 网络应用程序谷歌地图在 PC 本地主机上工作但在移动设备上不工作
- amazon-web-services - 请求私有证书被禁用:怎么会?
- laravel - 如何在 laravel 的单个控制器中传递多条路由
- google-apps-script - 如何每次在 Google Apps 脚本中正确使用 LockService?
- python - Python ZeroDivisonError 我该如何解决这个问题?