GHC运行时如何处理文件I/O?
一些关于GHC运行时内部的文章提到,它使用epoll/kqueue/poll来检测文件描述符是否已准备好读/写 我可以理解套接字I/O是如何实现的。但是磁盘文件访问呢?轮询系统调用不适用于普通文件,仅适用于套接字I/O;是吗GHC运行时如何处理文件I/O?,c,haskell,ghc,C,Haskell,Ghc,一些关于GHC运行时内部的文章提到,它使用epoll/kqueue/poll来检测文件描述符是否已准备好读/写 我可以理解套接字I/O是如何实现的。但是磁盘文件访问呢?轮询系统调用不适用于普通文件,仅适用于套接字I/O;是吗 这里我能想象的唯一选项是使用线程池来阻止系统调用,每个请求一个线程…在无线程RTS中,整个运行时都会被阻止。在线程化RTS中,它将通过线程池执行这样的安全外部调用,因此该功能不会阻塞。在POSIX平台(如Linux、OSX和BSD)上,描述符是一个小整数,可以是文件、管道、
这里我能想象的唯一选项是使用线程池来阻止系统调用,每个请求一个线程…在无线程RTS中,整个运行时都会被阻止。在线程化RTS中,它将通过线程池执行这样的安全外部调用,因此该功能不会阻塞。在POSIX平台(如Linux、OSX和BSD)上,描述符是一个小整数,可以是文件、管道、套接字或完全不同的内容。它们都支持几乎相同的支持功能,例如轮询。@JoachimPileborg poll on disk file fd将始终返回它已准备好进行IO,而实际上它将被阻止。@JoachimPileborg我很抱歉,但这是BS。不管您试图读取多少数据,它都可能会阻塞(即使使用O_NONBLOCK)。@JoachimPileborg:一个常规文件将始终在准备就绪时轮询,即使读取一个字节会阻塞。BSD的kqueue适用于套接字和文件。