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增长得慢,所以它可能得到更多的运行机会。
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux系统中,线程优先级可以通过设置线程的调度策略和优先级来实现。 1. 调度策略:Linux系统提供了多种线程调度策略,包括SCHED_FIFO、SCHED_RR、SCHED_OTHER等。其中,SCHED_FIFO和SCHED_RR是实时调度策略,而SCHED_OTHER是非实时调度策略。一般情况下,我们可以使用SCHED_OTHER策略来进行线程的调度。 2. 优先级Linux系统中,线程优先级是一个整数值,范围为0~99,数值越大,优先级越高。默认情况下,线程优先级为0。 线程优先级可以通过以下两个函数来设置: - int pthread_setschedparam(pthread_t thread, int policy, const struct sched_param *param) 该函数用于设置线程的调度策略和优先级。其中,thread参数指定要设置线程,policy参数指定线程的调度策略,param参数指定线程的调度参数,包括优先级等。 - int pthread_getschedparam(pthread_t thread, int *policy, struct sched_param *param) 该函数用于获取线程的调度策略和优先级。其中,thread参数指定要获取的线程,policy参数用于返回线程的调度策略,param参数用于返回线程的调度参数,包括优先级等。 下面是一个简单的示例代码,用于设置线程优先级: ```c #include <pthread.h> void *thread_func(void *arg) { // 线程执行的代码 return NULL; } int main() { pthread_t thread; struct sched_param param; int policy; // 创建线程 pthread_create(&thread, NULL, thread_func, NULL); // 设置线程优先级 param.sched_priority = 80; pthread_setschedparam(thread, SCHED_OTHER, &param); // 获取线程优先级 pthread_getschedparam(thread, &policy, &param); printf("Thread priority is %d\n", param.sched_priority); // 等待线程结束 pthread_join(thread, NULL); return 0; } ``` 在上面的代码中,我们首先创建了一个线程,然后使用pthread_setschedparam函数设置线程优先级为80,最后使用pthread_getschedparam函数获取线程优先级并打印输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值