线程产量向操作系统表明该进程暂时不需要CPU,并且调度程序应该抢先切换到另一个进程。例如,在C ++ 11中,调用是std::this_thread::yield()
。
Bash有这样的命令吗?如果是这样,它是什么?
答案 0 :(得分:2)
Yielding不是要向系统提供有关流程/线程期望的建议。操作系统不需要这样的帮助,因为它可以在任何给定时间看到过程实际需要什么。相反,即使该线程 还有更多的工作要做,但是屈服是一个主动让其他人有机会运行的线程。即使没有这些帮助,调度程序也非常擅长分配CPU资源。
在任何情况下,不,bash
没有这样的内容,您可以通过阅读手册的list of internal commands及其list of built-ins来查看。
然而,人们似乎对bash
本身(或任何其他shell)和外部命令之间的混淆感到困惑。外部命令绝不是shell的一部分,但有些是shell编程的备用(grep
,awk
和sed
是第一个想到的。您可以获取或编写的任何程序,但是,您可以通过bash
运行。特别是,您可以为该作业构建此C程序:
#include <sched.h>
int main() {
sched_yield();
return 0;
}
如果从shell启动它,那么当父shell等待它完成时它确实会产生CPU。 shell本身不会产生,但由于它将在子项完成时被阻塞,因此效果仍然是主动允许其他进程运行。但涉及到令人难以置信的开销!
最后,@ CharlesDuffy的评论非常简洁地阐述了这一情况:
合理编写的bash代码将花费时间阻塞(在IO [或]上等待子进程退出),其中任何一个都会隐式产生CPU。
如果您的bash
脚本似乎真正用于明确的yield
,那么您做错了。
答案 1 :(得分:0)
在bash(或任何程序中),你可以通过调用sleep 0
来屈服。在大多数情况下,这将调用内核的调度程序来重新评估下一个应该运行的进程。在一些常见的扩展版本中,您甚至可以使用浮点数调用sleep
以获得常规的亚秒级睡眠时间。