Linux上的SetPriorityClass等价物
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux上的SetPriorityClass等价物,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1756字,纯文字阅读大概需要3分钟。
内容图文
![Linux上的SetPriorityClass等价物](/upload/InfoBanner/zyjiaocheng/961/406db7cb4d634fecb382c72a191e278e.jpg)
我有一个类似守护进程的应用程序,它在初始化时执行一些磁盘密集型处理.为了避免减慢其他任务,我在Windows上做了类似的事情:
SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN);
// initialization tasks
SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_END);
// daemon is ready and running at normal priority
AFAIK,在Unices上我可以调用nice或setpriority并降低进程优先级但我无法将其恢复到创建进程时的状态(即没有相当于第二个SetPriorityClass调用),除非我拥有超级用户权限.难道有另外一种方法可以让我失踪吗? (我知道我可以创建一个以低优先级运行的初始化线程并等待它在主线程上完成,但我宁愿避免它)
edit:等效的SetThreadPriority(GetCurrentThread(),THREAD_MODE_BACKGROUND_BEGIN)的加分点;和SetThreadPriority(GetCurrentThread(),THREAD_MODE_BACKGROUND_END);
解决方法:
您已经说过您的处理是磁盘密集型的,因此使用nice的解决方案将无效. nice处理CPU访问的优先级,而不是I / O访问. PROCESS_MODE_BACKGROUND_BEGIN降低了I / O优先级以及CPU优先级,并且需要XP和更早版本中不存在的内核功能.
控制I / O优先级不能在Unices中移植,但现代Linux内核上有一个解决方案.您需要CAP_SYS_ADMIN来降低IO_PRIO_CLASS_IDLE的I / O优先级,但是如果没有这个,可以在尽力而为的类中降低和提高优先级.
关键函数调用是ioprio_set,您必须通过系统调用包装器调用它:
static int ioprio_set(int which, int who, int ioprio)
{
return syscall(SYS_ioprio_set, which, who, ioprio);
}
完整示例源,see here.
根据权限,您进入后台模式的是IOPRIO_PRIO_VALUE(IO_PRIO_CLASS_IDLE,0)或IOPRIO_PRIO_VALUE(IO_PRIO_CLASS_BE,7).顺序应该是:
#define IOPRIO_PRIO_VALUE(class, data) (((class) << IOPRIO_CLASS_SHIFT) | data)
ioprio_set(IOPRIO_WHO_PROCESS, 0, IOPRIO_PRIO_VALUE(IO_PRIO_CLASS_BE,7));
// Do work
ioprio_set(IOPRIO_WHO_PROCESS, 0, IOPRIO_PRIO_VALUE(IO_PRIO_CLASS_BE,4));
请注意,您许多人无权返回原始io优先级,因此您需要返回另一个尽力而为值.
内容总结
以上是互联网集市为您收集整理的Linux上的SetPriorityClass等价物全部内容,希望文章能够帮你解决Linux上的SetPriorityClass等价物所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。