1. 程式人生 > >執行緒排程與優先順序

執行緒排程與優先順序

linux核心排程三種策略:

1,SCHED_OTHER 分時排程策略,

2,SCHED_FIFO實時排程策略,先到先服務

3,SCHED_RR實時排程策略,時間片輪轉

分時程序則通過nice和counter值決定權值,nice越小,counter越大,被排程的概率越大,也就是曾經使用了cpu最少的程序將會得到優先排程。所以分時排程與優先順序是無關的,在這種排程下,優先順序是無法修改的,預設情況下建立的執行緒採用的分時排程策略。要修改執行緒優先順序需要首先修改核心排程策略。

   SCHED_FIFO和SCHED_RR屬於實時排程策略,在RTOS中基本用的也都是這兩種策略。SCHED_RR是時間片輪轉,同一優先順序的執行緒分配相同的時間片進行執行,時間片到了之後,將當前執行緒放到隊尾,執行下一個執行緒。

    SCHED_FIFO 情況下,一旦佔有了CPU後,知道執行緒執行完或者主動釋放CPU,才會結束對CPU的佔有。

 

函式的使用

獲取執行緒可支援的最高和最低優先順序,SCHED_FIFO和SCHED_RR是1-99,數值越大優先順序越高。SCHED_OTHER不支援優先順序。

  int sched_get_priority_max(int policy);

  int sched_get_priority_min(int policy);

 系統建立執行緒時,預設的執行緒是SCHED_OTHER。所以如果我們要改變執行緒的排程策略的話,可以通過下面的這個函式實現。

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);

policy引數就是我們的排程策略。

獲取和設定優先順序,一般是獲取當前優先順序,再去設定一下優先順序。


int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);

sched_param結構體如下,只有一個元素,就是優先順序

struct sched_param
{
    int __sched_priority; 
};

修改優先順序程式碼

#include <stdio.h>
#include <pthread.h>
#include <sched.h>
#include <assert.h>

static void show_thread_priority(pthread_attr_t *attr,int policy)
{
  int priority = sched_get_priority_max(policy);
  assert(priority!=-1);
  printf("max_priority=%d\n",priority);
  priority= sched_get_priority_min(policy);
  assert(priority!=-1);
  printf("min_priority=%d\n",priority);
}

static int get_thread_policy(pthread_attr_t *attr)
{
  int policy;
  int rs = pthread_attr_getschedpolicy(attr,&policy);
  //assert(rs==0);
  switch(policy)
  {
  case SCHED_FIFO:
    printf("policy= SCHED_FIFO\n");
    break;
  case SCHED_RR:
    printf("policy= SCHED_RR");
    break;
  case SCHED_OTHER:
    printf("policy=SCHED_OTHER\n");
    break;
  default:
    printf("policy=UNKNOWN\n");
    break;
  }
  return policy;
}
static void set_thread_policy(pthread_attr_t *attr,int policy)
{
  int rs = pthread_attr_setschedpolicy(attr,policy);
  assert(rs==0);
  get_thread_policy(attr);
}


int main()
{
	pthread_t pid;
	pthread_attr_t attr;
	
	struct sched_param param1;
	int new_pri = 20;
	int i,ret;
	pthread_attr_init(&attr);
	int policy = get_thread_policy(&attr);
	printf("show current configuration of priority\n");
	show_thread_priority(&attr,policy);

	printf("show SCHED_FIFO of priority\n");
	show_thread_priority(&attr,SCHED_FIFO);

	printf("show SCHED_FIFO of priority\n");
	show_thread_priority(&attr,SCHED_RR);	

	set_thread_policy(&attr, SCHED_FIFO);
	pthread_attr_getschedparam(&attr,&param1);
	printf("ori pri:%d\n",param1.sched_priority);
	param1.sched_priority = new_pri;
	pthread_attr_setschedparam(&attr,&param1);
	pthread_attr_getschedparam(&attr,&param1);
	printf("cur pri:%d\n",param1.sched_priority);

	return 0 ;
	
	
}

執行結果