首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在短时间内降低自我优先级,然后再增加优先级

在短时间内降低自我优先级,然后再增加优先级
EN

Stack Overflow用户
提问于 2014-05-25 20:10:57
回答 1查看 944关注 0票数 2

在某些情况下,我希望降低正在运行的进程优先级,以执行一个草率操作,然后将其增加到原始值。该进程应该自己执行,而不需要根权限

我在Process.setpriority的红宝石应用程序中试过这样做。

这不是内核设计中的一个缺陷吗?

这里是shell中的一个例子:

代码语言:javascript
复制
$ nice
0

然后

代码语言:javascript
复制
$ renice -n 19 -p $$ 
5094 (process' ID) old priority 0, new priority 19

然后

代码语言:javascript
复制
$ renice -n 0 -p $$
renice: failed to set priority for 5094 (process' ID): Permission denied
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-25 22:00:17

通常只有根(或具有CAP_SYS_NICE特权的进程)可以将它们的“尼斯”更改为更高的优先级(较低的值)。但是自从2.6.12版本的内核(5.html)以来,linux引入了额外的方法来增加优先级(降低nice),RLIMIT_NICE限制(man )。您可以在bash中使用ulimit -e检查它,并在将(su)切换到普通用户或任何人(example)之前通过根用户进行更改。

那么,您能做些什么使您的流程暂时具有低优先级(更高的好值):

  1. 从根获取CAP_SYS_NICE特权
  2. 设置右RLIMIT_NICE (默认值为0,因此RLIMIT_NICE被禁用,这是linux发行版中的缺陷),无论是根ulimit -e VALUE还是系统范围的/etc/security/limits.conf,项目nice ( pam_limits.so PAM模块使用这个配置,所以检查,在启动进程之前是否调用它。通常由登录名、*dm管理器、crond和atd调用。不知道是否调用了由init.d脚本启动的进程)

两个来自brauliobo的第二个变体的例子,允许nice回到0,系统范围内。添加到/etc/security/limits.conf

代码语言:javascript
复制
*              soft    nice    0 # ranges from -20 to 19

或者使用sudo根目录来更改单个shell的RLIMIT_NICE:

代码语言:javascript
复制
sudo bash
ulimit -e 20 # equivalent to 0, as it ranges from 0 to 40
sudo -u youruser bash
# now you can renice back to 0

如果没有root用户的帮助,您可以:

  1. 叉子第二个进程做低优先级的工作,并且只重命名它。使用进程间通信发送工作项并获得结果.
  2. 在做低优先级的工作时,您可以经常调用sched_yield。这将使其他进程能够提前抢占您的程序。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23859522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档