在linux下,pthread优先级与lwp优先级有什么关系?
问题描述:
我有一个应用程序在Linux上使用SCHED_FIFO通过pthread_attr_setschedpolicy运行。在linux下,pthread优先级与lwp优先级有什么关系?
我的理解是,pthread_attr_setschedparam()应该允许在线程启动之前设置线程属性结构上的线程优先级,并且Posix要求至少支持32个级别。
实际上在运行:
sched_get_priority_max(SCHED_FIFO) = 99
sched_get_priority_min(SCHED_FIFO) = 1
线程的优先级是在pthread_create使用前设置:
pthread_attr_setinheritsched(&thread_attr,PTHREAD_EXPLICIT_SCHED))
pthread_attr_setschedparam(&thread_attr)
如果我询问它
pthread_attr_t thread_attr;
struct sched_param s_param;
int res = pthread_getattr_np(channel_data_p->thread, &thread_attr);
assert(res == 0);
res = pthread_attr_getschedparam (&thread_attr, &s_param);
assert(res == 0);
log_write("thread %d, priority = %d",threadId,s_param.sched_priority);
我看到预期的优先级。 但是,我不清楚如何使用ps -o,top -H显示pthreads优先级,或者查看/ proc 或如何将PR值和NI等Linux值相关联(如果它们是正确的字段, H)回到posix优先权。
我不打算动态地优先考虑优先级,所以这更受学术界的关注。
答
pthreads优先级直接映射到Linux线程/进程优先级。
本文介绍了调度相当不错(从书Linux Kernel Development):
http://www.informit.com/articles/article.aspx?p=101760&seqNum=2
当我问这个问题时,我忘记使用“pthread_attr_setinheritsched(&thread_attr,PTHREAD_EXPLICIT_SCHED))”的代码中存在一个错误,这意味着优先级没有效果。 –