zoukankan      html  css  js  c++  java
  • Linux进程优先级系统——设置实时进程优先级

    前言

    最近研发的产品出了点小bug,最后查到根本原因是,其中一个进程A使用基于FIFO的实时进程优先级,而另一个进程B是使用普通调度的进程优先级,而A和B两个进程是互相通信的,进程B会被饿死,而进程A也不能正常工作。分析问题过程中查找了一些资料,以下记录一些特别注意的点。

    Linux进程调度的三种策略

    (1)SCHED_OTHER,分时调度策略

    (2)SCHED_FIFO,实时调度策略,先到先服务

    (3)SCHED_RR,实时调度策略,时间片轮转 

    由于相关内容比较多,本人也末必比别人讲得更清楚,关于进程调度更详细的内容建议读《深入理解Linux内核》,网上的很多内容都是从此而来,也不一定比这本书讲得好。另可参考此链接

    https://blog.csdn.net/maximuszhou/article/details/42042161

    前面遇到bug的进程A就是使用SCHED_FIFO调度策略的,而进程B没有经过设置,默认是SCHED_OTHER。

    如何设置为实时进程

    查找资料的时候发现有个链接问,为什么设置FIFO策略,但和预想的不一致。链接在此 http://ask.csdn.net/questions/254095

    从代码看是因为设置的方法不对,直接上代码,可以设置进程和线程的调度策略

     1  #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <pthread.h>
     4 #include <sched.h>
     5 
     6 
     7 pid_t pid = getpid();
     8 struct sched_param param;
     9 param.sched_priority = sched_get_priority_max(SCHED_FIFO);   // 也可用SCHED_RR
    10 sched_setscheduler(pid, SCHED_RR, &param);                   // 设置当前进程
    11 pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);   // 设置当前线程

    可以通过top命令查看进程是否成功,如果为"rt"表示是实时进程了。如果不成功,可能是权限问题,需要roo权限。

    调整进程优先级

     如果不调整调度策略,也可以提升进程优先级,使得进程得到更多的CPU,特别是交互式程序,用户体检更好。代码很简单,只需要调用nice(int n)函数即可。n的有效范围是-20~19,数值越小表示优先级越高。具体内容不在此复制粘贴,还是看《深入理解Linux内核》比较靠谱。

  • 相关阅读:
    Oracle SQL语句大全—查看表空间
    Class to disable copy and assign constructor
    在moss上自己总结了点小经验。。高手可以飘过 转贴
    在MOSS中直接嵌入ASP.NET Page zt
    Project Web Access 2007自定义FORM验证登录实现 zt
    SharePoint Portal Server 2003 中的单一登录 zt
    vs2008 开发 MOSS 顺序工作流
    VS2008开发MOSS工作流几个需要注意的地方
    向MOSS页面中添加服务器端代码的另外一种方式 zt
    状态机工作流的 SpecialPermissions
  • 原文地址:https://www.cnblogs.com/qinwanlin/p/8631185.html
Copyright © 2011-2022 走看看