如何为node.js设计和实现非阻塞内存映射模块
node.js存在mmap模块: 正如作者Ben Noordhuis所指出的那样,访问映射内存可能会阻塞,这就是为什么他不再推荐它并停止使用它的原因 所以我想知道如何为node.js设计一个非阻塞内存映射模块?穿线,纤维如何为node.js设计和实现非阻塞内存映射模块,node.js,mmap,memory-mapped-files,memory-mapping,Node.js,Mmap,Memory Mapped Files,Memory Mapping,node.js存在mmap模块: 正如作者Ben Noordhuis所指出的那样,访问映射内存可能会阻塞,这就是为什么他不再推荐它并停止使用它的原因 所以我想知道如何为node.js设计一个非阻塞内存映射模块?穿线,纤维 显然,这就提出了这样一个问题:node.js中的线程是否只会发生在其他地方而不是请求处理程序中。当谈到以非阻塞方式实现某些本机功能时,首先要考虑的是。这是节点的核心模块与底层平台的接口方式。特别令人感兴趣的是API 如果我们快速看一下,我们会发现它实际上非常简单。它调用mmap
显然,这就提出了这样一个问题:node.js中的线程是否只会发生在其他地方而不是请求处理程序中。当谈到以非阻塞方式实现某些本机功能时,首先要考虑的是。这是节点的核心模块与底层平台的接口方式。特别令人感兴趣的是API 如果我们快速看一下,我们会发现它实际上非常简单。它调用
mmap
并返回一个节点Buffer
,该节点封装映射的内存区域
从这个缓冲区读取
是导致操作系统执行I/O的原因。因为这必然会发生在JS线程上,我们最终会用磁盘I/O阻塞JS线程
<> >而不是返回一个<>代码>缓冲区< /> >允许JS直接访问映射内存,您应该编写C++中的包装类,通过工作队列来封送读写。这样,磁盘I/O将发生在单独的线程上
在JS中,您可以这样使用它:
fs.open('/path/to/file', 'r', function(err, fd) {
fs.fstat(fd, function(err, stats) {
var mapped = mmap.map(stats.size, mmap.PROT_READ, mmap.MAP_SHARED, fd, 0);
mapped.read(start, len, function(err, data) {
// ...
});
});
});
在C中,read
函数将创建一个libuv工作请求,并将其排入工作队列。然后,C worker函数将读取映射的内存范围(基于调用方的规范),这可能会导致磁盘I/O,但这是安全的,因为它发生在单独的线程上
接下来发生的事情很有趣。安全的方法是工作人员从映射的内存中alloc
一个新的内存块和memcpy
。然后,worker传递一个指向该副本的指针,C回调将其打包在缓冲区中
以返回到jsland
您还可以尝试读取范围(以便在工作线程上发生任何必要的I/O),但不实际处理数据,然后让C回调将映射的内存范围简单地包装在缓冲区中。理论上,工作程序读取的文件部分将保留在RAM中,因此对映射内存部分的访问不会阻塞。然而,老实说,我对映射内存的了解还不足以说明这是否会最终咬到你
最后,我怀疑这是否会比节点的常规fs
方法提供额外的性能。我只会沿着这条路走,如果我正在做的话