下面的函数是否在其运行内核上阻塞?
wait(Sec) -> receive after (1000 * Sec) -> ok end.
一个很好的答案将详细说明Erlang和/或CPU的内部工作。
ldxq2e6h1#
执行该代码的进程 * 将 * 阻塞,当前运行该进程的调度程序 * 将不会 * 阻塞。您发布的代码等于一个yield,但有一个超时。该内核的ErlangVM调度程序将继续执行其他进程,直到超时触发,并且该进程将被调度再次执行。
djmepvbi2#
简短回答:这将只阻塞当前(轻量级)进程,而不会阻塞所有VM。2要了解更多细节,你必须阅读关于Erlang调度程序的文章。3很好的描述来自Francesco Cesarini和Simon Thompson的书“并发编程”。... snip ...当一个进程被分派时,它被分配了一个允许执行的归约数†,这个数随着每一个操作的执行而减少。一旦进程进入一个接收子句,其中没有一个消息匹配,或者它的归约计数达到零,它就被抢占。只要BIF没有被执行,这种策略导致在进程之间公平(但不相等)分配执行时间。
yc0p9oo03#
没有Erlang特有的,非常经典的问题:超时只能在系统时钟中断时发生。2答案同上:该进程被阻塞,等待时钟中断,其他一切都工作得很好。还有一个关于进程等待的实际时间的讨论,这个时间并不精确,因为它取决于时钟周期(这取决于系统),但这是另一个主题。
3条答案
按热度按时间ldxq2e6h1#
执行该代码的进程 * 将 * 阻塞,当前运行该进程的调度程序 * 将不会 * 阻塞。您发布的代码等于一个yield,但有一个超时。
该内核的ErlangVM调度程序将继续执行其他进程,直到超时触发,并且该进程将被调度再次执行。
djmepvbi2#
简短回答:这将只阻塞当前(轻量级)进程,而不会阻塞所有VM。2要了解更多细节,你必须阅读关于Erlang调度程序的文章。3很好的描述来自Francesco Cesarini和Simon Thompson的书“并发编程”。
... snip ...当一个进程被分派时,它被分配了一个允许执行的归约数†,这个数随着每一个操作的执行而减少。一旦进程进入一个接收子句,其中没有一个消息匹配,或者它的归约计数达到零,它就被抢占。只要BIF没有被执行,这种策略导致在进程之间公平(但不相等)分配执行时间。
yc0p9oo03#
没有Erlang特有的,非常经典的问题:超时只能在系统时钟中断时发生。2答案同上:该进程被阻塞,等待时钟中断,其他一切都工作得很好。
还有一个关于进程等待的实际时间的讨论,这个时间并不精确,因为它取决于时钟周期(这取决于系统),但这是另一个主题。