DAY10-进程优先级与调度策略

一、基础知识

1.Linux内核当中有3中调度策略:

  • SCHED_OTHER 分时调度策略
  • SCHED_FIFO 实时调度策略,先到先服务
  • SCHED_RR 实时调度策略,时间片轮转

备注:如果有相同优先级的实时进程(根据优先级计算调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃之后才可以运行这个优先级相同的任务。而RR每个任务都执行一段时间。

2. 获取线程设置的最高和最低优先级函数

int sched_get_priority_max(int policy); //获取实时优先级的最大值

int sched_get_priority_min(int policy); //获取实时优先级的最小值

SCHED_OTHER: 不支持优先级使用,而SCHED_RR/SCHED_FIFO支持优先级使用,他们分别为1-99, 数值越大,优先级越高。

实时调度策略(SCHED_FIFO/SCHED_RR)优先级最大值为99

普通调度策略(SCHED_NORMAL/SCHED_BATCH/SCHED_IDLE),始终返回0,即普通任务调度的函数

3.设置和获取优先级2个主要核心函数:

int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param); //创建线程优先级

int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param); //获取线程优先级

struct sched_param

{

int __sched_priority;//所有设定的线程优先级

};

param.sched_priority=11; //设置优先级

当操作系统创建线程时,默认线程是SCHED_OTHER,我们也可以通过改变调度策略,使用如下函数:

int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy); //设置线程调度策略

二、基础案例分析

1.操作系统所支持的优先级测试程序分析

#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_RR. \n");
        break;
    case SCHED_OTHER:
        printf("Policy is --> SCHED_OTHER. \n");
        break;
    default:
    printf("Policy is -> Unknow.\n");
        break;
    }
    return iPolicy;      
}

static void PrintThreadPriorityFunc(pthread_attr_t *pAttr,int iPolicy)
{
    int iPriority=sched_get_priority_max(iPolicy);
    assert(iPriority!=-1);
    printf("Max_priority is : %d\n", iPriority);
    iPriority=sched_get_priority_min(iPolicy);
    assert(iPriority!=-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);
    printf("\n Export current configration of priority.\n");
    PrintThreadPriorityFunc(&pAttr,iPolicy);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值