我有点困惑,当我创建一个脏NIF(例如,通过在其ErlNifFunc条目中为脏NIF设置适当的标志值)时,这会创建一个在脏线程上运行的脏调度程序。我知道我只能有N个cpu-bond脏线程作为N个cpu内核的数量。但是,还有enif_thread_create函数。它们之间的区别是什么?使用enif_thread_create创建的线程有限制吗?它们也会是脏线程吗?我希望通过enif_thread_create提供一个简单的使用脏线程的代码示例。
vatpfxk51#
当你定义一个NIF为脏的,你是告诉虚拟机只通过一个脏的调度程序来执行它。只有虚拟机会执行此操作。默认情况下,VM为您提供N个脏CPU调度程序,其中N是正常调度程序的数量。正常调度程序的数量默认为系统上配置的逻辑处理器的数量。如erl man page中所述,正常调度程序和脏调度程序的数量可以通过各种命令行选项进行控制。enif_thread_create函数提供了对底层操作系统的线程创建功能的访问。该函数在脏NIF和调度程序之前就存在了,而且本质上也在普通NIF之前就存在了,因为它只是erl_drv_thread_create函数的 Package 器。这些线程独立于调度程序线程,因此与NIF调度无关。换句话说,Erlang运行时使用调度器线程来运行Erlang作业,包括通过脏调度器运行的脏作业,而内部NIF或驱动程序代码可以使用它通过enif_thread_create或erl_drv_thread_create为正在运行的作业创建的线程通过这些函数可以创建的线程的最大数量受到底层操作系统的限制。
erl
enif_thread_create
erl_drv_thread_create
1条答案
按热度按时间vatpfxk51#
当你定义一个NIF为脏的,你是告诉虚拟机只通过一个脏的调度程序来执行它。只有虚拟机会执行此操作。
默认情况下,VM为您提供N个脏CPU调度程序,其中N是正常调度程序的数量。正常调度程序的数量默认为系统上配置的逻辑处理器的数量。如
erl
man page中所述,正常调度程序和脏调度程序的数量可以通过各种命令行选项进行控制。enif_thread_create
函数提供了对底层操作系统的线程创建功能的访问。该函数在脏NIF和调度程序之前就存在了,而且本质上也在普通NIF之前就存在了,因为它只是erl_drv_thread_create
函数的 Package 器。这些线程独立于调度程序线程,因此与NIF调度无关。换句话说,Erlang运行时使用调度器线程来运行Erlang作业,包括通过脏调度器运行的脏作业,而内部NIF或驱动程序代码可以使用它通过enif_thread_create
或erl_drv_thread_create
为正在运行的作业创建的线程通过这些函数可以创建的线程的最大数量受到底层操作系统的限制。