【问题标题】:What does sched_yield do in this case?在这种情况下 sched_yield 做了什么?
【发布时间】:2013-04-25 13:55:16
【问题描述】:

如果我有一个进程,其所有线程都在不同的内核上运行,那么sched_yield 在这种情况下会做什么?放弃并立即再次发行?因为我看到的是sched_yield不会导致线程调用它,根本等待任何循环,似乎调用甚至没有进入内核。

【问题讨论】:

    标签: c linux gcc x86-64


    【解决方案1】:

    就linux内核而言,一个核心就是一个CPU,所以sched_yield会导致调用线程放弃CPU,但如果线程是队列中唯一的一个,它不会等待任何循环.

    所以在你的情况下sched_yield会立即返回如果当前核心上没有线程等待。

    请注意,sched_yield并非旨在控制线程在多个 CPU 上的运行方式。

    【讨论】:

    • sched_yield 一个系统调用,C 实现只不过是类似_syscall0(int, sched_yield)
    【解决方案2】:

    手册页说:

    如果调用线程是最高优先级的唯一线程 列表,它会在调用 sched_yield() 后继续运行。

    所以如果没有更重要的事情要运行,这个函数基本上什么都不做。

    【讨论】:

    • "所以如果没有什么更重要的东西要运行,这个函数基本上什么都不做。"但是它仍然会进行系统调用(并从用户空间切换到内核),或者甚至不会?
    • 是的,它仍然会进行系统调用,检查CPU调度程序的等待列表,如果没有其他等待线程,则不等待返回。
    • 好吧,我现在没有要测试的 Linux,所以也许您可以编写一个只在循环中调用 sched_yield 的程序并对其进行分析?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多