|
系统建立线程时,默认的线程是SCHED_OTHER。因此若是咱们要改变线程的调度策略的话,能够经过下面的这个函数实现。
|
|
|
|
这里测试一下其中的两种特性,SCHED_OTHER和SCHED_RR,还有就是优先级的问题,是否是可以保证,高优先级的线程,就能够保证先运行。
下面的这个测试程序,建立了三个线程,默认建立的线程的调度策略是SCHED_OTHER,其他的两个线程的调度策略设置成SCHED_RR。个人Linux的内核版本是2.6.31。SCHED_RR是根据时间片来肯定线程的调度。时间片用完了,无论这个线程的优先级有多高都不会在运行,而是进入就绪队列中,等待下一个时间片的到了,那这个时间片到底要持续多长时间?在《深刻理解Linux内核》中的第七章进程调度中,是这样描诉的,Linux采起单凭经验的方法,即选择尽量长、同时能保持良好相应时间的一个时间片。这里也没有给出一个具体的时间来,可能会根据不一样的CPU 来定,还有就是多CPU 的状况。ui
|
下面是该程序的其中之一的运行结果:.net
|
这里咱们能够看到,因为线程3的调度策略是SCHED_OTHER,而线程2的调度策略是SCHED_RR,因此,在Thread3中,线程3被线程1,线程2给抢占了。因为线程1的优先级大于线程2的优先级,因此,在线程1以先于线程2运行,不过,这里线程2有一部分代码仍是先于线程1运行了。
我原觉得,只要线程的优先级高,就会必定先运行,其实,这样的理解是片面的,特别是在SMP的PC机上更会增长其不肯定性。
其实,普通进程的调度,是CPU根据进程优先级算出时间片,这样并不能必定保证高优先级的进程必定先运行,只不过和优先级低的进程相比,一般优先级较高的进程得到的CPU时间片会更长而已。其实,若是要想保证一个线程运行完在运行另外一个线程的话,就要使用多线程的同步技术,信号量,条件变量等方法。而不是绝对依靠优先级的高低,来保证。
不过,从运行的结果上,咱们能够看到,调度策略为SCHED_RR的线程1,线程2确实抢占了调度策略为SCHED_OTHER的线程3。这个是能够理解的,因为SCHER_RR是实时调度策略。
只有在下述事件之一发生时,实时进程才会被另一个进程取代。
(1) 进程被另一个具备更高实时优先级的实时进程抢占。
(2) 进程执行了阻塞操做并进入睡眠
(3)进程中止(处于TASK_STOPPED 或TASK_TRACED状态)或被杀死。
(4)进程经过调用系统调用sched_yield(),自愿放弃CPU 。
(5)进程基于时间片轮转的实时进程(SCHED_RR),并且用完了它的时间片。
基于时间片轮转的实时进程是,不是真正的改变进程的优先级,而是改变进程的基本时间片的长度。因此基于时间片轮转的进程调度,并不能保证高优先级的进程先运行。
下面是另外一种运行结果:
unix
|
能够看出并无每一次都保证高优先级的线程先运行。