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