位置: 编程技术 - 正文

深入理解Node中的buffer模块(node的理解)

编辑:rootadmin

推荐整理分享深入理解Node中的buffer模块(node的理解),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nodejs深入浅出笔记,了解nodejs,node基础知识,深入浅出的node.js,深入浅出的node.js,深入node.js技术栈,node的理解,深入浅出的node.js,内容如对您有帮助,希望把文章链接给更多的朋友!

在Node、ES出现之前,前端工程师只需要进行一些简单的字符串或DOM操作就可以满足业务需要,所以对二进制数据是比较陌生。node出现以后,前端面对的技术场景发生了变化,可以深入到网络传输、文件操作、图片处理等领域,而这些操作都与二进制数据紧密相关。

Node里面的buffer,是一个二进制数据容器,数据结构类似与数组,数组里面的方法在buffer都存在(slice操作的结果不一样)。下面就从源码(v6.0版本)层面分析,揭开buffer操作的面纱。

1. buffer的基本使用

在Node 6.0以前,直接使用new Buffer,但是这种方式存在两个问题:

参数复杂: 内存分配,还是内存分配+内容写入,需要根据参数来确定 安全隐患: 分配到的内存可能还存储着旧数据,这样就存在安全隐患

为了解决上述问题,Buffer提供了Buffer.from、Buffer.alloc、Buffer.allocUnsafe、Buffer.allocUnsafeSlow四个方法来申请内存。

2. buffer的结构

buffer是一个典型的javascript与c++结合的模块,其性能部分用c++实现,非性能部分用javascript来实现。

下面看看buffer模块的内部结构:

buffer模块提供了4个接口:

Buffer: 二进制数据容器类,node启动时默认加载 SlowBuffer: 同样也是二进制数据容器类,不过直接进行内存申请 INSPECT_MAX_BYTES: 限制bufObject.inspect()输出的长度 kMaxLength: 一次性内存分配的上限,大小为(2^ - 1)

其中,由于Buffer经常使用,所以node在启动的时候,就已经加载了Buffer,而其他三个,仍然需要使用require('buffer').***。

关于buffer的内存申请、填充、修改等涉及性能问题的操作,均通过c++里面的node_buffer.cc来实现:

3. 内存分配的策略

Node中Buffer内存分配太过常见,从系统性能考虑出发,Buffer采用了如下的管理策略。

3.1 Buffer.from

Buffer.from(value, ...)用于申请内存,并将内容写入刚刚申请的内存中,value值是多样的,Buffer是如何处理的呢?让我们一起看看源码:

value可以分成三类:

ArrayBuffer的实例: ArrayBuffer是ES里面引入的,用于在浏览器端直接操作二进制数据,这样Node就与ES关联起来,同时,新创建的Buffer与ArrayBuffer内存是共享的 string: 该方法实现了将字符串转变为Buffer Buffer/TypeArray/Array: 会进行值的copy

3.1.1 ArrayBuffer的实例

Node v6与时俱进,将浏览器、node中对二进制数据的操作关联起来,同时二者会进行内存的共享。

在上述操作中,对ArrayBuffer的操作,引起Buffer值的修改,说明二者在内存上是同享的,再从源码层面了解下这个过程:

3.1.2 string

深入理解Node中的buffer模块(node的理解)

可以实现字符串与Buffer之间的转换,同时考虑到操作的性能,采用了一些优化策略避免频繁进行内存分配:

a. 直接内存分配

当字符串所需要的字节大于4KB时,如何还从8KB的buffer pool中进行申请,那么就可能存在内存浪费,例如:

poolSize - poolOffset < 4KB: 这样就要重新申请一个8KB的pool,刚才那个pool剩余空间就会被浪费掉

看看c++是如何进行内存分配的:

b. 借助于pool管理

用一个pool来管理频繁的行为,在计算机中是非常常见的行为,例如http模块中,关于tcp连接的建立,就设置了一个tcp pool。

3.1.3 Buffer/TypeArray/Array

可用从一个现有的Buffer、TypeArray或Array中创建Buffer,内存不会共享,仅仅进行值的copy。

上述示例就证明了buf1、buf2没有进行内存的共享,仅仅是值的copy,再从源码层面进行分析:

3.2 Buffer.alloc

Buffer.alloc用于内存的分配,同时会对内存的旧数据进行覆盖,避免安全隐患的产生。

上述代码有几个需要注意的点:

3.2.1 先申请后填充

alloc先通过createBuffer申请一块内存,然后再进行填充,保证申请的内存全部用fill进行填充。

3.2.2 flags标示

flags用于标识默认的填充值是否为0,该值在javascript中设置,在c++中进行读取。

3.2.3 Uint8Array

Uint8Array是ES TypeArray中的一种,可以在浏览器中创建二进制数据,这样就把浏览器、Node连接起来。

3.3 Buffer.allocUnSafe

Buffer.allocUnSafe与Buffer.alloc的区别在于,前者是从采用allocate的策略,尝试从buffer pool中申请内存,而buffer pool是不会进行默认值填充的,所以这种行为是不安全的。

3.4 Buffer.allocUnsafeSlow

Buffer.allocUnsafeSlow有两个大特点: 直接通过c++进行内存分配;不会进行旧值填充。

4. 结语

字符串与Buffer之间存在较大的差距,同时二者又存在编码关系。通过Node,前端工程师已经深入到网络操作、文件操作等领域,对二进制数据的操作就显得非常重要,因此理解Buffer的诸多细节十分必要。

标签: node的理解

本文链接地址:https://www.jiuchutong.com/biancheng/380828.html 转载请保留说明!

上一篇:全面解析Node.js 8 重要功能和修复(全面解析A型天秤座男)

下一篇:深入理解Nodejs Global 模块(深入理解计算机系统)

  • 账簿印花税的计税方法
  • 免征增值税和增值税区别
  • 经营成本是营业成本还是营业总成本
  • 固定资产清理期末余额在借方是什么意思
  • 房地产开发商需要缴纳什么税
  • 合作社需要办什么证件
  • 设计原始凭证所需内容及步骤
  • 挂失申请怎么写
  • 货币性短期薪酬影响损益的金额
  • 收到理财产品收益分录
  • 年底增值税专用发票入帐不勾选抵扣帐务处理
  • 所得税汇算有研发费用可以不享受加计扣除吗
  • 异地不动产租赁 深圳税务 所得税
  • 当月发的奖金怎么扣个税
  • 资产负债表在途物资属于存货吗
  • 子公司和母公司可以一起投标吗
  • 公司委托公司收款合法吗
  • 持续经营净利润和扣非净利润
  • win10玩红警卡顿怎么解决
  • 基建期增值税如何抵扣
  • 结转本月主营业务收入800000元,营业外收入2500元
  • mac电脑键盘进水,键盘不可以用了
  • Win11文件夹怎么加密设置密码
  • 启动电脑显示器不亮怎么回事
  • 没有取得发票的成本可以税前扣除吗
  • 公司交会费有什么用
  • 潘塔纳尔湿地的成因
  • uni-app list
  • php判断数组是否为空的函数
  • VUE-CLI/VUE-ROUTER
  • python字典删除键值对方法
  • 应交增值税为负数怎么处理
  • 研发费用资本化计入什么科目
  • 独立核算的分公司可以汇总纳税吗
  • 专利费用计入什么会计科目
  • 健身房注册公司能注册医疗吗?
  • 员工实际工资
  • 账龄划分中有借有贷怎么分析
  • 职工教育经费的扣除限额
  • 小规模收入怎么算
  • 长期待摊费用如何记账
  • 纳税申报相关操作有哪些
  • 注销时其他应付款怎么冲平
  • 库存商品怎么计提坏账
  • 固定资产怎么入费用
  • 冲减实收资本是什么意思
  • 建筑企业预缴增值税款
  • 缴纳文化事业建设费的单位应按照提供广告服务
  • 支付给其他公司的借款属于什么现金流
  • 计提的利息汇算清缴时要调整吗
  • 怎么查企业适用的会计准则
  • win10简单版
  • Vista 目前的窘境5大原因分析
  • ubuntu x
  • 怎么制作win7系统u盘装系统教程
  • ubuntu 20.04 服务器
  • mac支持的字体格式
  • linux如何拨号
  • win10打开或关闭功能在哪里
  • linux小技巧
  • windows8快速启动设置
  • windows8桌面设置
  • win8全屏快捷键
  • win10怎么转移文件到其他盘
  • Win10系统玩坦克世界不能打字怎么回事
  • 校园网升级套餐
  • win10系统如何设置锁屏壁纸图片
  • win10系统打开文件夹就不停的闪
  • jquery.ui
  • c#中抽象类的定义
  • unity shader lod
  • linux shell命令的返回值
  • python中的字典怎么用
  • js正则regexp
  • 河南省地方税务局电话
  • 工会经费少申报一个月可以下个月补上吗
  • 车辆购置税非本人可以代缴吗
  • 建筑类的发票
  • 工商年检报告书怎么打印
  • 诚信励志语录经典短句
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设