Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Node学习之buffer类 #25

Open
mhfe123 opened this issue Apr 12, 2019 · 0 comments
Open

Node学习之buffer类 #25

mhfe123 opened this issue Apr 12, 2019 · 0 comments

Comments

@mhfe123
Copy link
Contributor

mhfe123 commented Apr 12, 2019

在引入TypedArray之前,JavaScript没有读取或操作二进制数据流的机制。Buffer类用于在TCP流或文件系统操作等场景中处理字节流。现在有了TypedArray,Buffer类以一种更优化、更适合Node.js的方式实现了Uint8Array。
Buffer类的实例类似于整数数组,但Buffer的大小是固定的、且在V8堆外分配物理内存。Buffer的大小在创建时确定,且无法改变。Buffer类是一个全局变量,使用时无需require('buffer).Buffer。

Buffer模块结构

buffer是一个典型的js和C++结合的模块,它的性能部分是由C++实现的,非性能部分是由js实现。
image

Buffer对象

Buffer是一个类数组的对象,它的元素是16进制的两位数,即0-255,因为它是个类数组,所以可以通过数组的方法去操作它,也可以通过数组的方式取值赋值,当给其赋值的值不在0-255之间时,遵循以下原则:

给元素赋值如果小于0,将该值依次加256,知道符合要求,如果值大于255,则依次减256,直到符合要求,如果是小数,则舍弃小数部分,只取整数部分。

Buffer内存分配

Buffer对象的内存不是在V8的堆内存中,而是在Node的C++层面申请的。为了更高效的使用内存,Node采用了slab动态内存管理机制。

简单说,slab是一块申请好的固定的内存区,它有3种状态:

  • Full:完全分配状态
  • Partial:部分分配状态
  • Empty:没有被分配状态

当我们要使用buffer时,可以通过以下的方式来指定Buffer对象的大小:

const buf = Buffer.alloc(10);

Node是以8KB来区分Buffer对象是大对象还是小对象。

Buffer.poolSize = 8 * 1024;

从这里可以看出buffer类数组的一位对应的就是1byte。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant