![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 77
theanarkh
这个作者很懒,什么都没留下…
展开
-
利用多线程和 C++ 实现一个简单的 HTTP 服务器
无原创 2022-09-07 23:43:25 · 1142 阅读 · 0 评论 -
Node.js 的 trace events 架构
前言: trace 系统用于收集内核的数据,本文介绍在 Node.js 中 trace 系统的架构和实现,因为 Node.js 的 trace 系统是基于 V8 的,所以也会介绍 V8 部分。Node.js 中 trace 数据通过两种方式产生,第一种方式是在 JS 层通过 V8 提供的 trace C++ API,第二种方式是通过 Node.js C++ 层。下面首先看一下第一种。// binding.trace(phase, category, name, id, data) SimpleIns原创 2022-03-26 16:18:06 · 1426 阅读 · 0 评论 -
No.js 中 V8 堆外内存管理和字符编码解码的实现
前言:对于基于 V8 的 JS 运行时来说,堆外内存的管理是非常重要的一部分,因为 gc 的原因,V8 自己管理堆内存大小是有限制的,我们不能什么数据都往 V8 的堆里存储,比如我们想一下读取一个 1G 的文件,如果存到 V8 的堆,一下子就满了,所以我们需要定义堆外内存并进行管理。本文介绍 No.js 里目前支持的简单堆内存管理机制和字符编码解码的实现。1 字符串的使用数据的读写,在底层都是一个个字节,那么我们在 JS 层定义的字符串,C++ 层是怎么获取的呢?比如我们在 JS 里调用自定义 log原创 2021-10-05 19:14:01 · 386 阅读 · 0 评论 -
JS运行时Just源码解读
前言:本文介绍一下新的JS运行时Just的一些设计和实现。1 模块的设计像Node.js一样,Just也分为内置JS和C++模块,同样是在运行时初始化时会处理相关的逻辑。1.1 C++模块Node.js在初始化时,会把C++模块组织成一个链表,然后加载的时候通过模块名找到对应的模块配置,然后执行对应的钩子函数。Just则是用C++的map来管理C++模块。目前只有五个C++模块。 just::modules["sys"] = &_register_sys; just::modules原创 2021-08-26 23:52:42 · 524 阅读 · 0 评论 -
智能指针和所有权
在语言中,对堆对象的内存管理是一个麻烦又复杂的问题。一不小心就会带来问题,比如JS里一直引用一个已经不使用的对象导致gc无法回收,或者C++里多个变量指向同一块内存导致重复释放。本文简单探讨一下关于对象所有权的问题。对象的所有权意味着当我们分配一个对象的时候,谁持有这个对象的所有权,比如下面代码。Object *obj = new Object();那么obj就持有了对象的所有权。但是现实往往比较复杂,比如我们看看下面代码。#include<stdio.h>using namespa原创 2021-07-30 01:32:23 · 260 阅读 · 0 评论 -
RAII机制和智能指针
1 RAII介绍RAII全称是Resource Acquisition Is Initialization,翻译过来是资源获取即初始化,RAII机制用于管理资源的申请和释放。对于资源,我们通常经历三个过程,申请,使用,释放,这里的资源不仅仅是内存,也可以是文件、socket、锁等等。但是我们往往只关注资源的申请和使用,而忘了释放,这不仅会导致内存泄漏,可能还会导致业务逻辑的错误,RAII就用来解决此类问题。2 C++中的RAII使用我们看以下例子。std::mutex m;void fn()原创 2021-07-28 22:47:18 · 468 阅读 · 0 评论 -
从No.js看Node.js原理
前言:越来越多同学在使用Node.js,大家也不同程度地理解Node.js是什么。比如Node.js是由V8、Libuv、JS组成的,Node.js底层是C\C++,Node.js不是语言是运行时。本文通过实现一个类Node.js的JS运行时No.js,去理解Node.js的本质。No.js是我之前写的一个JS运行时,概念上是这么说,但是它算不上真正的运行时,它只是个demo,但是它让你看到如果你有兴趣,你也可以写个Node.js。首先我们看看V8的基本用法。#include <stdio.h&g原创 2021-07-09 00:11:03 · 201 阅读 · 1 评论 -
N-API之Promise篇
本文介绍N-API中的Promise功能的使用。Promise相关的API一共有四个。napi_create_promise // 创建一个Promise,类似new Promisenapi_resolve_deferred // resolve一个Promisenapi_reject_deferred // reject一个Promisenapi_is_promise // 判断变量是否是一个Promise我们首先看一下napi_is_promise。测试代码如下const { isProm原创 2021-06-06 01:24:11 · 695 阅读 · 4 评论 -
通过N-API使用Libuv线程池
Node.js不适合处理耗时操作是一直存在的问题,为此Node.js提供了三种解决方案。1 子进程2 子线程3 Libuv线程池前两种是开发效率比较高的,因为我们只需要写js。但是也有些缺点1 执行js的成本2 虽然可以间接使用Libuv线程池,但是受限于Node.js提供的API。3 无法利用c/c++层提供的解决方案(内置或业界的)。这时候我们可以尝试第三种解决方案。直接通过N-API使用Libuv线程池。下面我们看看这么做。N-API提供了几个API。napi_create_asyn原创 2021-06-05 05:41:29 · 1410 阅读 · 0 评论 -
格物致知-记一次nodejs源码分析的经历
昨天分析http模块相关的代码时,遇到了一个晦涩的逻辑,看了想,想了看还是没看懂。百度、谷歌了很多帖子也没看到合适的答案。突然看到一个题目有点相识的搜索结果,点进去是Stack Overflow上的帖子,但是已经404,最后还是通过快照功能成功看到内容。这个帖子和我的疑惑不相关,但是突然给了我一些灵感。沿着这个灵感去看了代码,最后下载nodejs源码,加了一些log,编译了一夜(太久了,等不及编译完成,得睡觉了)。上午起来验证,终于揭开了疑惑。这个问题源于下面这段代码。function connecti原创 2020-11-22 16:42:48 · 314 阅读 · 0 评论 -
nodejs创建线程问题
我们知道在nodejs中可以使用new Worker创建线程。今天有个同学恰好问到,怎么判断创建线程成功,这也是最近开发线程池的时候遇到的问题。nodejs文档里也没有提到如何捕获创建失败这种情况。所以只能通过源码去找答案。不过坏消息是,我们无法捕获这个这个错误。下面看一下源码。我们直接从c++层开始分析。当我们调用new Worker的时候,最后会调用c++的StartThread函数(node_worker.cc)创建一个线程。CHECK_EQ(uv_thread_create_ex(&w-原创 2020-08-12 23:14:10 · 859 阅读 · 0 评论 -
理解nodejs中js和c++的通信原理
本文分享一下nodejs中js调用c++模块的一些内容。js调用c++模块是v8提供的能力,nodejs是使用了这个能力。这样我们只需要面对js,剩下的事情交给nodejs就行。本文首先讲一下利用v8如何实现js调用c++,然后再讲一下nodejs是怎么做的。1 js调用c++首先介绍一下v8中两个非常核心的类FunctionTemplate和ObjectTemplate。顾名思义,这两个类是定义模板的,好比建房子时的设计图一样,通过设计图,我们就可以造出对应的房子。v8也是,定义某种模板,就可以通过这原创 2020-07-19 03:40:36 · 1654 阅读 · 0 评论 -
webkit源码解读-FileList
FileList是文件组件的表示形式,是一个包装了系列File对象的对象。里面通过vector保持多个文件对象。class FileList : public ScriptWrappable, public RefCounted<FileList> {public: // 需要用create创建该类对象 static Ref<FileList> create() { /原创 2017-07-22 05:01:49 · 571 阅读 · 0 评论