Linux 하 스 레 드 의 스케줄 링 정책 과 우선 순위 (1)

Linux 커 널 의 세 가지 스 케 쥴 링 전략: 1, SCHEDOTHER 시간 대별 스케줄 링 전략, 2, SCHEDFIFO 실시 간 스케줄 링 전략, 선착순 서비스.cpu 를 점용 하면 계속 실 행 됩 니 다.더 높 은 우선 순위 작업 이 도착 하거나 스스로 포기 할 때 까지 계속 실행 합 니 다.   3,SCHED_RR 실시 간 스케줄 링 전략, 시간 편 윤전.프로 세 스 의 시간 편 이 다 떨 어 지면 시스템 은 시간 편 을 재배 치 하고 준 비 된 대기 열 끝 에 놓 습 니 다.같은 우선 순 위 를 가 진 RR 작업 의 공정 한 리 눅 스 스 스 레 드 우선 순위 설정 을 대기 열 끝 에 두 었 습 니 다.   우선, 다음 두 가지 함 수 를 통 해 스 레 드 가 설정 할 수 있 는 최고 와 최저 우선 순 위 를 얻 을 수 있 습 니 다. 함수 중의 전략 은 바로 상기 세 가지 전략의 매크로 정 의 를 얻 을 수 있 습 니 다. int schedget_priority_max(int policy);   int sched_get_priority_min(int policy);   SCHED_OTHER 는 우선 순위 사용 을 지원 하지 않 고 SCHEDFIFO 와 SCHEDRR 은 각각 1 과 99 로 수치 가 클 수록 우선 순위 가 높 은 우선 순위 사용 을 지원 한다.다음 두 함 수 를 통 해 우선 순 위 를 설정 하고 가 져 옵 니 다.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) ;
 param. sched_priority = 51; //
   , SCHED_OTHER。 , 。
int pthread_attr_setschedpolicy ( pthread_attr_t * attr, int policy) ;
위의 param 은 아래 의 이 데이터 구 조 를 사 용 했 습 니 다:struct sched_param
{
    int __sched_priority; //
} ;

우 리 는 아래 의 테스트 프로그램 을 통 해 우리 가 사용 하 는 시스템 지원 의 우선 순 위 를 설명 할 수 있다.# include < stdio. h>
# include < pthread. h>
# include < sched. h>
# include < assert . h>

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 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_priority( pthread_attr_t * attr)
{
  struct sched_param param;
  int rs = pthread_attr_getschedparam ( attr, & param) ;
  assert ( rs= = 0) ;
  printf ( "priority=%d" , param. __sched_priority) ;
  return param. __sched_priority;
}

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( void )
{
  pthread_attr_t attr;
  struct sched_param sched;
  int rs;
  rs = pthread_attr_init ( & attr) ;
  assert ( rs= = 0) ;

  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_RR of priority/n" ) ;
  show_thread_priority( & attr, SCHED_RR) ;
  printf ( "show priority of current thread/n" ) ;
  int priority = get_thread_priority( & attr) ;

  printf ( "Set thread policy/n" ) ;
  printf ( "set SCHED_FIFO policy/n" ) ;
  set_thread_policy( & attr, SCHED_FIFO) ;
  printf ( "set SCHED_RR policy/n" ) ;
  set_thread_policy( & attr, SCHED_RR) ;
  printf ( "Restore current policy/n" ) ;
  set_thread_policy( & attr, policy) ;

  rs = pthread_attr_destroy ( & attr) ;
  assert ( rs= = 0) ;
  return 0;
}

다음은 테스트 프로그램의 실행 결과 입 니 다.policy= SCHED_OTHER
Show current configuration of priority
max_priority= 0
min_priority= 0
show SCHED_FIFO of priority
max_priority= 99
min_priority= 1
show SCHED_RR of priority
max_priority= 99
min_priority= 1
show priority of current thread
priority= 0Set thread policy
set SCHED_FIFO policy
policy= SCHED_FIFO
set SCHED_RR policy
policy= SCHED_RRRestore current policy
policy= SCHED_OTHER

좋은 웹페이지 즐겨찾기