linux 线程优先级设置

#include <sched.h>     

        pid_t pid = getpid();
      int curschdu = sched_getscheduler(pid);
      if (curschdu < 0)
      {
        printf ("getschedu err %s\n", strerror(errno));
      }
      printf("schedu befor %d\n", curschdu);

      struct sched_param s_param;
      s_param.sched_priority = sched_get_priority_max(SCHED_FIFO);
      printf("schedu max %d min %d\n", 
      sched_get_priority_max(SCHED_FIFO), 
      sched_get_priority_min(SCHED_FIFO));

      int ret = sched_setscheduler(pid, SCHED_FIFO, &s_param);
      if (ret < 0)
      {
        printf("setschedu err %s\n", strerror(errno));
      }

      curschdu = sched_getscheduler(pid);
      printf("schedu after %d\n", curschdu);   

SCHED_FIFO: 先进先出调度在先进先出的调度方式下,一个线程直到它被更高优先级的线程抢占或者运行结束,才会交出控制权。相同优先级的任务不能打断该线程。当线程完成后,内核会去寻找处于就绪状态相同优先级的线程,如果不存在, 则寻找低优先级线程。FIFO调度本身实现了数据的互斥, 在线程运行的时间内其他相同优先级线程无法进行资源抢占。

SCHED_RR: 时间片轮转调度在时间片轮转(RR: RoundRobin)调度下,一个线程放弃内核有三种情况:运行结束,被更高级优先级抢占或者消耗完自己的时间片。时间片是线程运行的最小时间单元,由操作系统预先设定。当时间片用完时,该线程自动交出控制权, 之后内核会按照和FIFO相同的方式搜索下一个工作线程。轮转调度可以防止某一个任务连续占用太多的资源,而导致其他线程信息得不到及时处理。缺点是轮转调度会增大由于任务切换而导致的开销。

SCHED_OTHER: 分时调度,一般采用CFS算法,CFS定义了一种新调度模型,它给cfs_rq(cfs的run queue)中的每一个进程都设置一个虚拟时钟-virtual runtime(vruntime)。如果一个进程得以执行,随着执行时间的不断增长,其vruntime也将不断增大,没有得到执行的进程vruntime将保持不变。
而调度器将会选择最小的vruntime那个进程来执行。这就是所谓的“完全公平”。不同优先级的进程其vruntime增长速度不同,优先级高的进程vruntime增长得慢,所以它可能得到更多的运行机会。
 

你可能感兴趣的:(java,servlet,jvm)