1. 程式人生 > >linux執行緒排程方式測試總結

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,&param);
  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,&param);
 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,&param);
 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,&param);
    pthread_attr_setinheritsched(&attr1,PTHREAD_EXPLICIT_SCHED);

    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr2,SCHED_RR);
    pthread_attr_setschedparam(&attr2,&param);
    pthread_attr_setinheritsched(&attr2,PTHREAD_EXPLICIT_SCHED);//要使優先順序其作用必須要有這句話

    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr3,SCHED_RR);
    pthread_attr_setschedparam(&attr3,&param);
    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,&param);
    pthread_attr_setinheritsched(&attr1,PTHREAD_EXPLICIT_SCHED);

    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr2,SCHED_FIFO);
    pthread_attr_setschedparam(&attr2,&param);
    pthread_attr_setinheritsched(&attr2,PTHREAD_EXPLICIT_SCHED);//要使優先順序其作用必須要有這句話

    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr3,SCHED_FIFO);
    pthread_attr_setschedparam(&attr3,&param);
    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,&param);
    pthread_attr_setinheritsched(&attr1,PTHREAD_EXPLICIT_SCHED);

    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr2,SCHED_RR);
    pthread_attr_setschedparam(&attr2,&param);
    pthread_attr_setinheritsched(&attr2,PTHREAD_EXPLICIT_SCHED);//要使優先順序其作用必須要有這句話

    param.sched_priority = 10;
    pthread_attr_setschedpolicy(&attr3,SCHED_RR);
    pthread_attr_setschedparam(&attr3,&param);
    pthread_attr_setinheritsched(&attr3,PTHREAD_EXPLICIT_SCHED);//要使優先順序其作用必須要有這句話
#endif