Closed luohaha66 closed 11 months ago
No, I'm debugging on a Mac, and it should be similar on Linux:
并不是吧 我在mac上调试是这样的,linux应该也类似:
TRANS_BY_GITHUB_AI_ASSISTANT
This code is actually copied from other projects.
这个代码其实我也是从其他项目扣得
TRANS_BY_GITHUB_AI_ASSISTANT
#include <stdio.h>
#include <sched.h>
int main(void)
{
int Min = sched_get_priority_min(SCHED_OTHER);
int Max = sched_get_priority_max(SCHED_OTHER);
// 输出为 0 0
printf("min %d, max %d\n", Min, Max);
Min = sched_get_priority_min(SCHED_IDLE);
Max = sched_get_priority_max(SCHED_IDLE);
// 输出为 0 0
printf("min %d, max %d\n", Min, Max);
Min = sched_get_priority_min(SCHED_BATCH);
Max = sched_get_priority_max(SCHED_BATCH);
// 输出为 0 0
printf("min %d, max %d\n", Min, Max);
Min = sched_get_priority_min(SCHED_FIFO);
Max = sched_get_priority_max(SCHED_FIFO);
// 输出为 1 99
printf("min %d, max %d\n", Min, Max);
Min = sched_get_priority_min(SCHED_RR);
Max = sched_get_priority_max(SCHED_RR);
// 输出为 1 99
printf("min %d, max %d\n", Min, Max);
return 0;
}
uname -a Output | cpu | gcc Version |
---|---|---|
Linux 5.15.0-86-generic Ubuntu x86_64 GNU/Linux | AMD Ryzen 7 3800X | 11.3 |
Linux 5.10.160 SMP aarch64 GNU/Linux | RK3588 | 10.3 |
Linux 4.19.111 SMP PREEMPT armv7l GNU/Linux | RV1126 | 8.3 |
man sched 对 SCHED_OTHER 的解释
- SCHED_OTHER: Default Linux time-sharing scheduling SCHED_OTHER can be used at only static priority 0 (i.e., threads under real-time policies always have priority over SCHED_OTHER processes). SCHED_OTHER is the standard Linux time-sharing scheduler that is intended for all threads that do not require the special real-time mechanisms
#include <stdio.h>
#include <sched.h>
int main(void)
{
int Min = sched_get_priority_min(SCHED_OTHER);
int Max = sched_get_priority_max(SCHED_OTHER);
// 输出为 0 0
printf("min %d, max %d\n", Min, Max);
Min = sched_get_priority_min(SCHED_IDLE);
Max = sched_get_priority_max(SCHED_IDLE);
// 输出为 0 0
printf("min %d, max %d\n", Min, Max);
Min = sched_get_priority_min(SCHED_BATCH);
Max = sched_get_priority_max(SCHED_BATCH);
// 输出为 0 0
printf("min %d, max %d\n", Min, Max);
Min = sched_get_priority_min(SCHED_FIFO);
Max = sched_get_priority_max(SCHED_FIFO);
// 输出为 1 99
printf("min %d, max %d\n", Min, Max);
Min = sched_get_priority_min(SCHED_RR);
Max = sched_get_priority_max(SCHED_RR);
// 输出为 1 99
printf("min %d, max %d\n", Min, Max);
return 0;
}
uname -a 输出 | cpu | gcc 版本 |
---|---|---|
Linux 5.15.0-86-generic Ubuntu x86_64 GNU/Linux | AMD Ryzen 7 3800X | 11.3 |
Linux 5.10.160 SMP aarch64 GNU/Linux | RK3588 | 10.3 |
Linux 4.19.111 SMP PREEMPT armv7l GNU/Linux | RV1126 | 8.3 |
TRANS_BY_GITHUB_AI_ASSISTANT
@luohaha66 What is your suggestion for modification? Should we switch to SCHED_RR or SCHED_FIFO?
@luohaha66 那您的建议是怎么修改?换SCHED_RR还是SCHED_FIFO?
TRANS_BY_GITHUB_AI_ASSISTANT
@luohaha66 那您的建议是怎么修改?换SCHED_RR还是SCHED_FIFO?
I will reply to you during work hours tomorrow.
@luohaha66 那您的建议是怎么修改?换SCHED_RR还是SCHED_FIFO?
我明天工作时间回复您。
TRANS_BY_GITHUB_AI_ASSISTANT
Assume that there are the following 3 threads on cpu0:
Thread Name | Priority | Scheduling Policy |
---|---|---|
t0 | high | FIFO or RR |
t1 | mid | FIFO or RR |
t3 | 0 | OTHER |
Assuming that t0 and t1 use the FIFO policy, as long as the t0 thread is ready, it will immediately preempt t1 and t3 until t0 voluntarily relinquishes the cpu. Only then will t1 or t3 be run.
Assuming that t0 and t1 use the RR policy, the difference from FIFO is that after the t0 thread uses up its time slice, a scheduling event will occur. At this time, t0 is still the highest priority thread on cpu0, and it will get to run again. In other words, as long as t0 does not voluntarily relinquish the cpu, it will continue to run. This is consistent with FIFO, but with additional overhead.
Assuming that t0 and t1 have the same priority, if t0 runs first under the FIFO policy, then t1 will only get to run after t0 voluntarily relinquishes the cpu. Under the RR policy, if t0 runs first, t1 will get to run after t0's time slice is consumed.
SCHED_RR SCHED_FIFO 如何选择
假设在 cpu0 上存在以下3个线程:
线程名 | 优先级 | 调度策略 |
---|---|---|
t0 | high | FIFO 或 RR |
t1 | mid | FIFO 或 RR |
t3 | 0 | OTHER |
假设 t0 和 t1 使用 FIFO 策略,则只要 t0 线程就绪,就会立刻抢占 t1 和 t3,直到 t0 主动放弃 cpu 为止,t1 或者 t3 才会被运行。
假设 t0 和 t1 使用 RR 策略,与 FIFO 的区别就是,t0 线程在使用完时间片以后,会发生一次调度, 此时 t0 仍然是 cpu0 上优先级最高的线程,其会再次获得运行。也就是说,只要 t0 不主动放弃 cpu,其会一直运行。和 FIFO 一致,但是多了额外的开销。
假设 t0 和 t1 优先级一致,在使用 FIFO 策略的情况下,如果 t0 先运行,那么 t1 只有等到 t0 主动放弃 cpu,才会得到运行。在使用 RR 策略的情况下,如果 t0 先运行,t1 在 t0 时间片消耗完之后便可得到运行。
TRANS_BY_GITHUB_AI_ASSISTANT
Good! Let's modify it like this:
Index: src/Thread/ThreadPool.h
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/Thread/ThreadPool.h b/src/Thread/ThreadPool.h
--- a/src/Thread/ThreadPool.h (revision 3fd2b856b6856dd679a32c673431561c0affdd0c)
+++ b/src/Thread/ThreadPool.h (date 1698292460548)
@@ -86,11 +86,11 @@
}
return true;
#else
- static int Min = sched_get_priority_min(SCHED_OTHER);
+ static int Min = sched_get_priority_min(SCHED_FIFO);
if (Min == -1) {
return false;
}
- static int Max = sched_get_priority_max(SCHED_OTHER);
+ static int Max = sched_get_priority_max(SCHED_FIFO);
if (Max == -1) {
return false;
}
@@ -101,7 +101,7 @@
}
struct sched_param params;
params.sched_priority = Priorities[priority];
- return pthread_setschedparam(threadId, SCHED_OTHER, ¶ms) == 0;
+ return pthread_setschedparam(threadId, SCHED_FIFO, ¶ms) == 0;
#endif
}
善哉!那这样修改吧:
Index: src/Thread/ThreadPool.h IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/src/Thread/ThreadPool.h b/src/Thread/ThreadPool.h --- a/src/Thread/ThreadPool.h (revision 3fd2b856b6856dd679a32c673431561c0affdd0c) +++ b/src/Thread/ThreadPool.h (date 1698292460548) @@ -86,11 +86,11 @@ } return true; #else - static int Min = sched_get_priority_min(SCHED_OTHER); + static int Min = sched_get_priority_min(SCHED_FIFO); if (Min == -1) { return false; } - static int Max = sched_get_priority_max(SCHED_OTHER); + static int Max = sched_get_priority_max(SCHED_FIFO); if (Max == -1) { return false; } @@ -101,7 +101,7 @@ } struct sched_param params; params.sched_priority = Priorities[priority]; - return pthread_setschedparam(threadId, SCHED_OTHER, ¶ms) == 0; + return pthread_setschedparam(threadId, SCHED_FIFO, ¶ms) == 0; #endif }
`TRANS_BY_GITHUB_AI_ASSISTANT`
Thank you, the above modifications are sufficient.
谢谢,按照上述修改即可。
TRANS_BY_GITHUB_AI_ASSISTANT
Submitted. Thanks!
已提交 感谢!
TRANS_BY_GITHUB_AI_ASSISTANT
Thread Priority Setting Issue in ThreadPool.h
Code Related to Setting Thread Pool Priority
Existing Issues
设置线程池优先级相关代码
存在问题
TRANS_BY_GITHUB_AI_ASSISTANT