代码之家  ›  专栏  ›  技术社区  ›  TCSGrad

在系统调用内核的过程中,线程是否可以被预先清空?

  •  7
  • TCSGrad  · 技术社区  · 16 年前

    我正在运行2个线程(假设它们目前是pthreads)。线程_1()进行用户定义的API调用,最终在内核中完成一些工作。线程_2()完全在用户空间中。

    我的问题是:当API调用正在进行时,线程_2()是否可以通过先发制人线程_1()开始执行?控件是否在内核中?如果没有,为什么,如果我想发生这种情况(出于任何原因),我该怎么做?

    3 回复  |  直到 16 年前
        1
  •  5
  •   Artelius    16 年前

    如果您询问阻塞内核调用是否像 fread() 这要求磁盘IO可以先清空,然后是。

    更具体地说,一个阻塞调用基本上会让线程“1”在等待等待它所等待的任何东西时进入睡眠状态。如果线程_1处于休眠状态,那么线程_2将被安排运行(除非有更高优先级的东西等待运行)。

    编辑: 如果你想要一种“相当自信”的方式来确定线程_1正在执行阻塞调用,那么让线程_2的优先级低于线程_1(因此通常 运行,除非线程_1被阻塞)并且当它运行时,它将其优先级提升到比线程_1更高的级别,直到硬件中断被传递,此时它将降低其优先级并调用 sched_yield() .

        2
  •  8
  •   Greg Hewgill    16 年前

    对内核的调用被认为是 舞台调度 非阻塞 .阻塞调用(例如等待从网络套接字中读取数据)当然可以被抢先,而不需要您执行任何操作。其他线程将继续运行。非阻塞内核调用可以被认为是非常快的,实际上,不管您是否可以抢占它们,这都无关紧要。

    一般来说,在编写多线程代码时,您将重点放在这些线程之间如何交互,并将它们与内核的交互交由内核来管理。它设计得很好。

        3
  •  7
  •   R Samuel Klatchko    16 年前

    这取决于内核。经典的内核不允许抢占(除非在特定的点上它将休眠线程)。但较新的内核已经开始在内核内部启用抢占。

    Linux在使用config_preempt构建时支持可抢占内核。从内核文档中:

    此选项通过使 所有内核代码(不在关键部分执行的代码) 可先占的这允许对交互事件的反应 允许非自愿抢占低优先级进程 即使它在内核模式下执行系统调用,并且 否则就不会达到自然抢占点。 这允许应用程序在 系统处于负载状态,吞吐量稍低 以及对内核代码的少量运行时开销。

    如果要为桌面或 以毫秒为单位具有延迟要求的嵌入式系统 范围。