Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为node.js设计和实现非阻塞内存映射模块_Node.js_Mmap_Memory Mapped Files_Memory Mapping - Fatal编程技术网

如何为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存在mmap模块:

正如作者Ben Noordhuis所指出的那样,访问映射内存可能会阻塞,这就是为什么他不再推荐它并停止使用它的原因

所以我想知道如何为node.js设计一个非阻塞内存映射模块?穿线,纤维


显然,这就提出了这样一个问题: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
方法提供额外的性能。我只会沿着这条路走,如果我正在做的话