Linux内核进程优先级的调度策略测试代码

39 阅读1分钟
// one.c
#include <stdio.h>
#include <pthread.h>
#include <sched.h>
#include <assert.h>

// 获取线程策略
static int GetThreadPolicyFunc(pthread_attr_t *pAttr) {
  int iPolicy;
  int igp = pthread_attr_getschedpolicy(pAttr, &iPolicy); 
  assert(igp == 0);

  switch (iPolicy)
  {
  case SCHED_FIFO:
    printf("Policy is SCHED_FIFO\n");
    break;
  case SCHED_RR:
    printf("Policy is SCHED_FIFO\n");
    break;
  case SCHED_OTHER:
    // 普通进程
    printf("Policy is SCHED_OTHER\n");
    break;
  
  default:
    printf("Policy is unknown\n");
    break;
  }

  return iPolicy;

}

// 输出线程的优先级
static void PrintThreadPriorityFunc(pthread_attr_t *pAttr, int iPolicy) {
  // 获取线程实时优先级的最大值 ,
  // 普通进程的最大值和最小值均为0
  // SCHED_FIFO模式,最大值是99,最小值是1
  // SCHED_RR模式,最大值是99,最小值是1
  int iPriority = sched_get_priority_max(iPolicy);
  assert(iPolicy != -1);

  printf("Max Priority is %d\n", iPriority);

    // 获取线程实时优先级的最小值
  iPriority = sched_get_priority_min(iPolicy);
  assert(iPolicy != -1);

  printf("Min Priority is %d\n", iPriority);
}

// 获取线程优先级函数
static int GetThreadPriorityFunc(pthread_attr_t *pAttr) {
  struct sched_param sParam;
  int irs = pthread_attr_getschedparam(pAttr, &sParam);

  assert(irs == 0);
  printf("Priority = %d\n", sParam.sched_priority);

  return sParam.sched_priority;
}

// 设置线程策略函数
static void SetThreadPolicyFunc(pthread_attr_t *pAttr, int iPolicy) {
  int irs = pthread_attr_setschedpolicy(pAttr, iPolicy);

  assert(irs == 0);

  GetThreadPolicyFunc(pAttr);
}


int main(int argc, char* argv[]) {
  pthread_attr_t pAttr;

  struct sched_param sched;

  // 初始化
  int irs = pthread_attr_init(&pAttr);

  assert(irs == 0);

  int iPolicy = GetThreadPolicyFunc(&pAttr);  // 获取线程策略


  // 获取当前配置的优先级
  PrintThreadPriorityFunc(&pAttr, iPolicy);

  // 输出SCHED_FIFO模式优先级
  PrintThreadPriorityFunc(&pAttr, SCHED_FIFO);

  // 输出SCHED_FIFO模式优先级
  PrintThreadPriorityFunc(&pAttr, SCHED_RR);

  // 输出当前线程优先级
  int iPriority = GetThreadPriorityFunc(&pAttr);

  // 设置当前线程调度策略为SCHED_FIFO
  SetThreadPolicyFunc(&pAttr, SCHED_FIFO);

  // 恢复当前线程的调度策略
  SetThreadPolicyFunc(&pAttr, iPolicy);

  // 销毁线程结构
  irs = pthread_attr_destroy(&pAttr);
  assert(irs == 0);

  return 0;
}

测试

gcc one.c -o one -lpthread
➜  ./one                     
Policy is SCHED_OTHER
Max Priority is 0
Min Priority is 0
Max Priority is 99
Min Priority is 1
Max Priority is 99
Min Priority is 1
Priority = 0
Policy is SCHED_FIFO
Policy is SCHED_OTHER