2011-05-24 35 views
6

通过另一个问题的讨论,参见Debugging strange error that depends on the selected scheduler,我遇到了我的线程的调度一些问题。我在Linux 2.6.x上,使用root权限运行,并使用pthreads在用C/C++编写的时序关键应用程序中执行并行操作。了解Linux的调度时并行线程参与

我会尽力给予一些短期的,归结,片段来解释我的问题:

在主我在某个地方开始做:

struct sched_param sp; 
memset(&sp, 0, sizeof(sched_param)); 
sp.sched_priority = 99; 
sched_setscheduler(getpid(), SCHED_RR, &sp); 

我明白这是代码将我的程序切换到使用RR-Scheduler,最大运行时间。优先。

当开始并行线程,我做的:

sched_param param; 
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); 
pthread_attr_getschedparam(&attr, &param); 
param.sched_priority = priority; 
pthread_attr_setschedpolicy(&attr, SCHED_RR); 
pthread_attr_setschedparam(&attr, &param); 

我明白这一点,是交换机,会是用“优先”给予优先开始RR-调度,线程的代码。 如果主要不是切换调度程序,那么这是否等同工作?

我不明白的是,如果有必要调用主代码? (主要功能不会做任何事情,除了开始一切,然后阻止键盘输入。) 我在哪里可以找到如何工作的精确文档。我认为manpages在解释背景方面做得不错。

在此先感谢。

+0

另一个问题是,会发生什么,如果单独的多线程进程并行运行?处理器时间如何在这些处理器之间分配? – user761451 2011-05-24 11:04:11

回答

3

Linux的默认状态下,使用实施ntpl (Native POSIX Thread Library)它参考一个线程作为光weigth过程,所以调度器调度的线程与其他进程。

在FreeBSD上,你有“原始” pthread实现,它允许你指定线程调度策略,但线程不被安排作为默认进程(除非PTHREAD_SCOPE_SYSTEM参数设置)

所以,在你的榜样,你的线程按照高优先级安排为标准进程,因此它将与优先级相同的所有其他进程竞争,也是您的主进程。

如果你的时间关键的东西在你的线程中,避免给予你的主要过程高优先级,它会减少与你的实时东西竞争的过程。

我发现并行线程和NTPL here之间的比较。

+0

因此,在Linux系统上将主任务切换到RR调度器没有任何意义,假设主任务没有做任何有用的事情,并且仅切换线程就足够了。甚至没有关于运行多个多线程程序? – user761451 2011-05-24 13:23:18

+0

在NTPL实现中,是的,你的线程被认为是系统中的任何其他进程,没有优先级继承;) – 2011-05-24 13:32:18

+1

'getconf GNU_LIBPTHREAD_VERSION'讲述了线程实现。 – user761451 2011-05-24 13:51:11

0

的NPTL实现是1:1模型;用户空间中的线程和内核空间中称为LWP的进程。 内核调度的LWP具有PTHREAD_SCOPE_SYSTEM的内容范围。