最近我正在研究这个问题。我已经阅读了fs源代码,发现fs.readSync()和fs.read()之间的唯一区别是
// async vrsion
var req = new FSReqWrap();
req.oncomplete = cb;
binding.stat(pathModule._makeLong(path), req);
我读到一篇文章说阻塞和非阻塞fs api调用之间的差异是异步版本将在新的v8工作线程中运行。
当我在异步vs同步中读取此article - daveeddy written关于fs系统调用性能时。结论是异步和同步调用相同的系统调用。但是,在工作线程上运行异步并在主线程上运行同步。
我的问题是我注意到下面的评论
文件系统操作是Node.js中使用阻塞系统调用的最后一个操作(open,preadv,pwritev)
我在哪里可以找到真正的系统调用?这个评论是对还是错? 这是回答我的问题的关键点“为什么fs是在NodeJS中提供同步调用的唯一I / O库”
我真的很好奇。感谢您的耐心和进一步的建议。
答案 0 :(得分:0)
Node.js在设计时考虑了服务器。异步调用不会减少系统调用量,但允许您通过在I / O进行过程中继续计算或同时执行多个I / O来更好地利用CPU。
使用异步版本,如果排队,运行时将尝试执行其他作业(回调)(因此可以进行多路复用)。使用同步版本,因为您可以在不使用回调的情况下获得结果,因此更容易编码。
节点的IO由libuv包装,不鼓励进行直接系统调用。您可以使用ffi进行某种原始系统调用,但可能C是更好的工具。