linux CPU隔离和进程调度优先级设置

CPU隔离和进程调度优先级设置的相关知识:

1.  uboot 启动参数中增加 ”isolcpus=1“  ,  计数从0开始

     表示隔离第2个CPU, 系统启动后,程序 不能在第2个CPU上运行。

     如果要使用隔离的CPU,需要在代码中添加如下代码。     

pid_t tid;

cpu_set_t set;

tid = gettid();

CPU_ZERO( &set );

CPU_SET( 1, &set );

sched_setaffinity( tid, sizeof(cpu_set_t), &set );

查看线程运行在那个CPU上:

 a . 执行top -H,    显示所有线程信息

 b.  按f键进入菜单向,使用方向键 移动到 “ P       = Last Used Cpu”,用 空格键选中

 c.   按q键回到上级菜单显示如下,多了一列P,

  PID USER      PR  NI    VIRT    RES %CPU %MEM     TIME+     P      S COMMAND           

    1   root          20   0        2.3m   0.7m  0.0     0.3          0:04.65    0       S  init              

   92  root          20   0        1.8m   0.6m  0.0     0.2          0:00.01    1       S  `- pvalue_valid+ 

2.  设置线程调度策略和优先级

pthread_attr_t attr;

 int policy, inher;

 struct sched_param param;      

                                                                                                   

 pthread_attr_init(&attr);

 // policy = SCHED_FIFO;

 policy = SCHED_RR;

      

  ret = pthread_attr_setschedpolicy(&attr, policy);

  if (ret != 0)    printf(" pthread_attr_setschedpolicy/n%s/n", strerror(ret));

  param.sched_priority = 99;

  ret = pthread_attr_setschedparam(&attr, &param);

   if (ret != 0)    printf(" pthread_attr_setschedparam/n%s/n", strerror(ret));

  pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED);   // 设置线程调度策略时,必须设置此参数,否则会继承父进程的属性。

  ret = pthread_create(&thread_la, &attr, threadTEST, NULL);

查看线程调度策略和优先级,可以用命令chrt

chrt -p pid 

设置为实时调度,优先级99,执行命令

chrt -r  -p  99  pid 

3. 补充,另外 PC(Ubuntu)机上有个taskset 命令  (默认已安装),可以设置程序运行在那个cpu上,但要隔离CPU,设置比较麻烦。 大家可以设置程序运行在那个CPU上。

   

 例: 程序启动时

     taskset   -c 0,5,7,9-11   ./app             

     app启动后可以在 0,5,7,9,10,11号cpu上运行;    cpuid 是从0 开始计数, cpuid可以10进制,也可以16进制0x00EA1, 1位代表一个cpu,最低位为cpu0

  例:程序运行后

     taskset   -cp 0    11111

     设置进程号为 11111的进程在 cpu 0上运行。

查看使用上面的提到的TOP命令。

4    可以使用Cgroup,配置比较复杂,可以查一下资料,这里指示做简单的介绍。

Cgroup(control group)是将任意进程进行分组化管理的Linux内核功能。Cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为Cgroup子系统或控制器。

Cgroup子系统有控制内存的Memory控制器、控制进程调度的CPU控制器等。运行中的内核可以使用的Cgroup子系统由/proc/cgroup来确认。

Cgroup提供了一个cgroup虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。要使用Cgroup,必须挂载cgroup文件系统。这时通过挂载选项指定使用哪个子系统。

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,进程的调度策略和实时优先级可以通过调整相关参数进行设定。 进程的调度策略由调度类别和调度策略两部分组成。调度类别包括实时进程和普通进程,而调度策略包括FIFO(先进先出)、RR(轮转)、以及其他一些非实时调度策略。 对于实时进程,可以通过设置调度策略和实时优先级,来决定进程的调度次序。调度策略包括SCHED_FIFO(先进先出)和SCHED_RR(轮转)两种。SCHED_FIFO策略下,实时进程的执行顺序按照进入等待队列的先后顺序,优先级越高的进程越先执行;而SCHED_RR策略下,实时进程以时间片为单位进行轮转调度,每个进程执行一个时间片后切换到下一个进程。实时进程的实时优先级范围为1-99,优先级越高的进程被调度的机会越多。 对于普通进程,可以选择使用其他非实时调度策略,如SCHED_NORMAL(普通进程默认调度策略)等。除了实时优先级外,普通进程还有一个静态优先级,范围从0-39,静态优先级越高的进程在竞争CPU资源时被CPU调度程序考虑的机会越多。 在Linux系统中,可以使用相关命令和API函数来设定进程的调度策略和实时优先级。例如,通过使用命令"chrt"可以更改进程的调度策略和实时优先级,而在编程时可以使用调度相关的函数如sched_setscheduler()和sched_setparam()来进行设定。 通过合理设置进程的调度策略和实时优先级,可以优化系统的性能,使得实时任务能够按照预定的要求运行。但需要注意的是,过高的实时优先级可能会导致系统其他进程被饿死,因此需要在设定时进行权衡和限制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值