返回顶部
首页 > 资讯 > 前端开发 > VUE >如何使用Node.js+COW技术进行进程创建和文件复制
  • 338
分享到

如何使用Node.js+COW技术进行进程创建和文件复制

2024-04-02 19:04:59 338人浏览 八月长安
摘要

如何使用node.js+COW技术进行进程创建和文件复制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。COW 不是奶牛,是 Copy-On-W

如何使用node.js+COW技术进行进程创建和文件复制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

如何使用Node.js+COW技术进行进程创建和文件复制

COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。

一般来说复制就是创建出完全相同的两份,两份是独立的:

如何使用Node.js+COW技术进行进程创建和文件复制

但是,有的时候复制这件事没多大必要,完全可以复用之前的,这时候可以只是引用之前的那份,在写内容的时候才去复制对应的一部分内容。这样如果内容用于读的话,就免去了复制,而如果需要写,才会真正复制部分内容来做修改。

如何使用Node.js+COW技术进行进程创建和文件复制

这就叫做“写时复制”,也就是 Copy-On-Write。

原理很简单,但是在操作系统的内存管理和文件系统中却很常见,node.js 里面也因为这种技术变“懒”了。

本文我们来探究下 Copy-On-Write 在 Node.js 的进程创建和文件复制的应用。【推荐学习:《nodejs 教程》】

文件复制

文件复制这件事最常见的思路就是完全写一份相同的文件内容到另一个位置,但是这样有两个问题:

  • 完全写一份相同的内容,如果同样的文件复制了几百次,那么也创建相同的内容几百次么?太浪费硬盘空间了

  • 如果写到一半断电了怎么办?覆盖的内容如何恢复?

怎么办呢?这时候操作系统设计者就想到了 COW 技术。

用 COW 技术实现文件复制以后完美解决了上面两个问题:

  • 复制只是添加一个引用到之前的内容,如果不修改并不会真正复制,只有到第一次修改内容的时候才去真正复制对应的数据块,这样就避免了大量硬盘空间的浪费。

  • 写文件时会先在另一个空闲磁盘块做修改,等修改完之后才会复制到目标位置,这样就不会有断电无法回滚的问题

在 Node.js 的 fs.copyFile 的 api  就可以使用 Copy-On-Write 模式:

默认情况下,copyFile 会写入目标文件,覆盖原内容

const fsPromises = require('fs').promises;

(async function() {
  try {
    await fsPromises.copyFile('source.txt', 'destination.txt');
  } catch(e) {
    console.log(e.message);
  }
})();

但是可以通过第三个参数指定复制的策略:

const fs = require('fs');
const fsPromises = fs.promises;
const { COPYFILE_EXCL, COPYFILE_FICLONE, COPYFILE_FICLONE_FORCE} = fs.constants;

(async function() {
  try {
    await fsPromises.copyFile('source.txt', 'destination.txt', COPYFILE_FICLONE);
  } catch(e) {
    console.log(e.message);
  }
})();

支持的 flag 有 3 个:

  • COPYFILE_EXCL: 如果目标文件已存在,会报错(默认是覆盖)

  • COPYFILE_FICLONE: 以 copy-on-write 模式复制,如果操作系统不支持就转为真正的复制(默认是直接复制)

  • COPYFILE_FICLONE_FORCE:以 copy-on-write 模式复制,如果操作系统不支持就报错

这3个常量分别是 1,2,4,可以通过按位或把它们合并之后传入:

const flags = COPYFILE_FICLONE | COPYFILE_EXCL;
fsPromises.copyFile('source.txt', 'destination.txt', flags);

Node.js 支持操作系统的 copy-on-write 技术,在一些场景下可以提升性能,建议使用 COPYFILE_FICLONE 的方式,会比默认的方式好一些。

进程创建

fork 是常见的创建进程的方式,而它的实现就是一种 copy-on-write 技术。

我们知道,进程在内存中分为代码段、数据段、堆栈段这 3 部分:

  • 代码段:存放要执行的代码

  • 数据段:存放一些全局数据

  • 堆栈段:存放执行的状态

如果基于该进程创建一个新的进程,那么要复制这 3 部分内存。而如果这三部分内存是一样的内容,那就浪费了内存空间。

所以 fork 并不会真正的复制内存,而是创建一个新的进程,引用父进程的内存,当做数据的修改的时候,才会真正复制该部分的内存。

如何使用Node.js+COW技术进行进程创建和文件复制

这也是为什么把进程创建叫做 fork,也就是分叉,因为不完全是独立的,只是某部分做了分叉,成了两份,但是大部分还是一样的。

但如果要执行的代码不一样怎么办呢,这时候就要用 exec 了,它会创建新的代码段、数据段、堆栈段、执行新的代码。

Node.js 里面同样可以用 fork 和 exec 的 api:

fork:

const cluster = require('cluster');

if (cluster.isMaster) {
  console.log('I am master');
  cluster.fork();
  cluster.fork();
} else if (cluster.isWorker) {
  console.log(`I am worker #${cluster.worker.id}`);
}

exec:

const { exec } = require('child_process');
exec('my.bat', (err, stdout, stderr) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(stdout);
});

fork 是 linux 进程创建的基础,由此可见 copy-on-write 技术多么重要了。

复制同样的内容多份无疑比较浪费空间,所以操作系统在做文件复制、进程创建时的内存复制的时候都采用了 Copy-On-Write 技术,只有真正修改的时候才会去做复制。

Node.js 支持了 fs.copyFile 的 flags 的设置,可以指定 COPYFILE_FICLONE 来使用 Copy-On-Write 的方式做文件复制,也建议大家使用这种方式来节省硬盘空间,提高文件复制的性能。

进程的 fork 也是 Copy-On-Write 的实现,并不会直接复制进程的代码段、数据段、堆栈段到新的内容,而是引用之前的,只有在修改的时候才会做真正的内存复制。

除此以外,Copy-On-Write 在 Immutable 的实现,在分布式的读写分离等领域都有很多应用。

COW 让 Node.js 变“懒”了,但性能却更高了。

看完上述内容,你们掌握如何使用Node.js+COW技术进行进程创建和文件复制的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网VUE频道,感谢各位的阅读!

--结束END--

本文标题: 如何使用Node.js+COW技术进行进程创建和文件复制

本文链接: https://lsjlt.com/news/81581.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用Node.js+COW技术进行进程创建和文件复制
    如何使用Node.js+COW技术进行进程创建和文件复制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。COW 不是奶牛,是 Copy-On-W...
    99+
    2024-04-02
  • 如何使用Node.js对文件进行重命名
    这篇文章主要介绍如何使用Node.js对文件进行重命名,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言hexo的文章基本都是生成在_post文件夹下,若文章多了以后就不好管理,所就...
    99+
    2024-04-02
  • Web应用程序如何使用C#进行创建
    本篇文章为大家展示了Web应用程序如何使用C#进行创建,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。使用微软正在推行的.NET技术和C#语言可以快速建立Web应用程序,其安全性和可升级性都大大胜过普...
    99+
    2023-05-31
    c# web应用程序
  • 如何利用GitLab进行二进制文件管理和存档
    如何利用GitLab进行二进制文件管理和存档GitLab是一种开源的版本控制系统,它使用Git作为版本控制工具,并提供了一个可视化的Web界面。许多人使用GitLab来管理和存档源代码,但是对于二进制文件的管理和存档,一些人可能会感到困惑。...
    99+
    2023-10-22
    管理 gitlab 二进制文件 存档
  • 如何使用ASP文件和重定向技术来进行自然语言处理?
    在当今信息时代,自然语言处理技术越来越受到人们的关注。然而,要想进行自然语言处理,我们需要使用相应的工具和技术。本文将介绍如何使用ASP文件和重定向技术来进行自然语言处理。 ASP文件是一种动态网页技术,可以在网页上嵌入VBScript脚本...
    99+
    2023-07-29
    文件 重定向 自然语言处理
  • 如何利用K8S技术进行K8S资源控制
    如何利用K8S技术进行K8S资源控制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。私有云K8S资源控制原理基于前面系列文章的详细阐述,我们已经可以手工去K8S集群的命令行下将C...
    99+
    2023-06-19
  • 如何在PHP中使用Memcache缓存技术进行二进制数据存储
    随着互联网应用的不断发展,数据的访问速度越来越成为人们关注的焦点。为了提高数据的访问速度,缓存技术成为了解决方案之一。而在PHP中,Memcache缓存技术被广泛应用于实现数据的缓存,特别是二进制数据的缓存。本文将介绍如何在PHP中使用Me...
    99+
    2023-05-15
    PHP Memcache缓存技术 二进制数据存储
  • 如何使用ASP和Django进行分布式开发技术?
    随着互联网的发展,越来越多的企业开始使用分布式架构来构建他们的应用。分布式架构可以提供更高的可扩展性、更好的容错性和更好的性能。ASP和Django是两个流行的Web框架,都可以用于分布式开发,下面我们将讨论如何使用它们进行分布式开发。 什...
    99+
    2023-06-19
    django 分布式 开发技术
  • 如何使用MySQL进行主从复制
    1:MySQL主从复制介绍 (1)MySQL数据库默认是支持主从复制的,不需要借助于其他的技术,我们只需要在数据库中简单的配置即可。 (2)MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的 二进制日志 功能。就是一台...
    99+
    2023-10-24
    mysql 数据库 服务器
  • 如何使用Java API创建和编辑文件以及通过IDE进行调试?
    Java作为一种强大的编程语言,它提供了许多API来帮助开发人员更加方便地进行编程。其中,Java API中的文件操作API可以帮助我们在Java程序中创建、读取、编辑、删除文件等操作。在本文中,我们将介绍如何使用Java API创建和编...
    99+
    2023-10-12
    api 文件 ide
  • 使用Xcode创建第一个c语言项目和源文件进行编程(xcodes使用教程)
    一、Xcode简介 Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有统一的用户界面设计,编码、测试、调试都在...
    99+
    2023-10-08
    xcode ios macos
  • Node.js如何使用worker_threads多线程进行并行处理
    这篇文章给大家分享的是有关Node.js如何使用worker_threads多线程进行并行处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。很多人似乎都无法理解单线程 NodeJ...
    99+
    2024-04-02
  • Java API是什么?如何使用文件和IDE进行编程?
    Java API是Java语言的应用程序接口。这个接口提供了一套丰富的类和方法,可以让Java程序员快速地编写出高质量的Java程序。Java API是Java开发者最常使用的工具之一。本文将介绍Java API的基本概念以及如何使用文件...
    99+
    2023-10-12
    api 文件 ide
  • 如何进行CentOS复制文件以及上机操作
    如何进行CentOS复制文件以及上机操作,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。我本人认为CentOS复制文件在CentOS系列里很好使的文件系统,在此向大家推荐。C...
    99+
    2023-06-16
  • 如何使用netcat进行文件传输
    这篇文章将为大家详细讲解有关如何使用netcat进行文件传输,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先看一下帮助信息。$ nc -hOpenBSD netcat&nb...
    99+
    2023-06-09
  • 如何使用C++进行文件操作?
    如何使用C++进行文件操作文件操作是编程中非常重要的一部分。在C++中,我们可以利用文件操作来读取和写入文件,以对文件进行处理和管理。本文将介绍如何使用C++进行文件操作的基本知识和常用函数。C++提供了一个fstream库,它包含了各种用...
    99+
    2023-11-02
    C++ 文件操作 使用。
  • 如何使用node.js进行服务器端JavaScript编程
    本篇内容主要讲解“如何使用node.js进行服务器端JavaScript编程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用node.js进行服务器端Ja...
    99+
    2024-04-02
  • 如何使用python缓冲二进制文件
    这篇文章将为大家详细讲解有关如何使用python缓冲二进制文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前...
    99+
    2023-06-14
  • 如何使用 Golang 读写二进制文件?
    如何使用 Golang 读写二进制文件? 读二进制文件package main import ( "fmt" "os" ) func...
    99+
    2024-05-15
    golang 读写二进制文件
  • 如何使用openssl对文件进行加密和解密
    这篇文章主要介绍如何使用openssl对文件进行加密和解密,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!openssl是一个安全套接字层密码库,囊括主要的密码算法、常用密钥、证书封装管理功能及实现ssl协议。Open...
    99+
    2023-06-27
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作