linux執行緒排程方式測試總結
總結:對三種執行緒排程方式進行測試。
1.SCHED_OTHER:分時排程策略,為預設方式,凡是採用本模式的執行緒,執行緒優先順序會強制為0,通俗點將,工作在本模式下的執行緒,都在同一優先順序下。所謂的“分時排程策略”,可以理解為執行緒執行一次後主動放棄CPU,執行緒排程一次,執行下一個執行緒。測試程式碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <sched.h>
#include <assert.h>
void *Thread1(void* pp)
{
sleep(1);
int i,j;
int policy;
struct sched_param param;
pthread_getschedparam(pthread_self(),&policy,¶m);
if(policy == SCHED_OTHER) printf("SCHED_OTHER 1\n");
if(policy == SCHED_RR) printf("SCHED_RR 1 \n");
if(policy==SCHED_FIFO) printf("SCHED_FIFO 1\n");
//for(i=1;i<1000;i++)
while(1)
{
i++;
for(j=1;j<5000000;j++)
{
}
//printf("t1-%d", i);
printf("1");
if(i%100 == 0) printf("\n");
}
printf("Pthread 1 exit\n");
}
void *Thread2(void* pp)
{
sleep(1);
int i,j,m;
int policy;
struct sched_param param;
pthread_getschedparam(pthread_self(),&policy,¶m);
if(policy == SCHED_OTHER) printf("SCHED_OTHER 2\n");
if(policy == SCHED_RR) printf("SCHED_RR 2\n");
if(policy==SCHED_FIFO) printf("SCHED_FIFO 2\n");
//for(i=1;i<1000;i++)
while(1)
{
i++;
for(j=1;j<5000000;j++)
{
}
//printf("t2-%d", i);
printf("2");
if(i%100 == 0) printf("\n");
}
printf("Pthread 2 exit\n");
}
void *Thread3(void* pp)
{
sleep(1);
int i,j;
int policy;
struct sched_param param;
pthread_getschedparam(pthread_self(),&policy,¶m);
if(policy == SCHED_OTHER) printf("SCHED_OTHER 3\n");
if(policy == SCHED_RR) printf("SCHED_RR 3\n");
if(policy==SCHED_FIFO) printf("SCHED_FIFO 3\n");
//for(i=1;i<1000;i++)
while(1)
{
i++;
for(j=1;j<5000000;j++)
{
}
//printf("t3-%d", i);
printf("3");
if(i%100 == 0) printf("\n");
}
printf("Pthread 3 exit\n");
}
int main()
{
int i;
i = getuid();
if(i==0)
printf("The current user is root\n");
else
printf("The current user is not root\n");
pthread_t ppid1,ppid2,ppid3;
struct sched_param param;
pthread_attr_t attr1,attr2,attr3;
pthread_attr_init(&attr1);
pthread_attr_init(&attr2);
pthread_attr_init(&attr3);
#if 0
param.sched_priority = 10;
pthread_attr_setschedpolicy(&attr1,SCHED_RR);
pthread_attr_setschedparam(&attr1,¶m);
pthread_attr_setinheritsched(&attr1,PTHREAD_EXPLICIT_SCHED);
param.sched_priority = 10;
pthread_attr_setschedpolicy(&attr2,SCHED_RR);
pthread_attr_setschedparam(&attr2,¶m);
pthread_attr_setinheritsched(&attr2,PTHREAD_EXPLICIT_SCHED);//要使優先順序其作用必須要有這句話
param.sched_priority = 10;
pthread_attr_setschedpolicy(&attr3,SCHED_RR);
pthread_attr_setschedparam(&attr3,¶m);
pthread_attr_setinheritsched(&attr3,PTHREAD_EXPLICIT_SCHED);//要使優先順序其作用必須要有這句話
#endif
pthread_create(&ppid1,&attr1,Thread1,NULL);
pthread_create(&ppid2,&attr2,Thread2,NULL);
pthread_create(&ppid3,&attr3,Thread3,NULL);
pthread_join(ppid1,NULL);
pthread_join(ppid2,NULL);
pthread_join(ppid3,NULL);
while(1) {
sleep(100);
printf("main loop\n");
}
pthread_attr_destroy(&attr1);
pthread_attr_destroy(&attr2);
pthread_attr_destroy(&attr3);
return 0;
}
測試結果如下,每個執行緒執行一次就進行一次執行緒排程。
2.SCHED_FIFO:實時排程策略,先到先服務(優先順序和啟動順序,優先順序高的先到,同一優先順序下,先建立的執行緒先到)。
執行緒優先順序不同:優先順序高的執行緒永遠佔據CPU,不進行排程。除非主動放棄CPU(執行緒掛起、休眠等);
執行緒優先順序相同:最先啟動的執行緒永遠佔據CPU,不進行排程。除非主動放棄CPU(執行緒掛起、休眠等);
#if 1
param.sched_priority = 10;
pthread_attr_setschedpolicy(&attr1,SCHED_FIFO);
pthread_attr_setschedparam(&attr1,¶m);
pthread_attr_setinheritsched(&attr1,PTHREAD_EXPLICIT_SCHED);
param.sched_priority = 10;
pthread_attr_setschedpolicy(&attr2,SCHED_FIFO);
pthread_attr_setschedparam(&attr2,¶m);
pthread_attr_setinheritsched(&attr2,PTHREAD_EXPLICIT_SCHED);//要使優先順序其作用必須要有這句話
param.sched_priority = 10;
pthread_attr_setschedpolicy(&attr3,SCHED_FIFO);
pthread_attr_setschedparam(&attr3,¶m);
pthread_attr_setinheritsched(&attr3,PTHREAD_EXPLICIT_SCHED);//要使優先順序其作用必須要有這句話
#endif
3.SCHED_RR:實實時排程策略,時間片輪轉。當執行緒的時間片用完,系統將重新分配時間片,並置於就緒佇列尾。放在佇列尾保證了所有具有相同優先順序的RR任務的排程公平;
執行緒優先順序不同:優先順序高的執行緒永遠佔據CPU,不進行排程。除非主動放棄CPU(執行緒掛起、休眠等);
執行緒優先順序相同:每個執行緒執行一段時間(時間片),時間到了之後。執行緒排程,執行一下個排隊執行緒;
#if 1
param.sched_priority = 10;
pthread_attr_setschedpolicy(&attr1,SCHED_RR);
pthread_attr_setschedparam(&attr1,¶m);
pthread_attr_setinheritsched(&attr1,PTHREAD_EXPLICIT_SCHED);
param.sched_priority = 10;
pthread_attr_setschedpolicy(&attr2,SCHED_RR);
pthread_attr_setschedparam(&attr2,¶m);
pthread_attr_setinheritsched(&attr2,PTHREAD_EXPLICIT_SCHED);//要使優先順序其作用必須要有這句話
param.sched_priority = 10;
pthread_attr_setschedpolicy(&attr3,SCHED_RR);
pthread_attr_setschedparam(&attr3,¶m);
pthread_attr_setinheritsched(&attr3,PTHREAD_EXPLICIT_SCHED);//要使優先順序其作用必須要有這句話
#endif