菜单

Process API 和环境

相关源文件

本文档涵盖了 Bun 的进程管理 API、环境变量处理和系统交互功能。它详细介绍了全局 process 对象的实现、环境变量管理、平台检测以及使 JavaScript 应用程序能够与底层系统交互的操作系统级集成。

有关核心 JavaScript 运行时和事件循环的信息,请参阅 ZigGlobalObject 和事件循环。有关模块加载和解析,请参阅 模块系统和加载

进程对象架构

在 Bun 中,Process 类是进程相关功能的核心接口。它继承自 JSEventEmitter,并提供对进程状态、环境变量和系统信息的访问。

Process 类维护多个惰性属性和写屏障,以实现高效的内存管理。

属性类型目的
m_cpuUsageStructureLazyProperty<Process, Structure>CPU 使用统计结构
m_resourceUsageStructureLazyProperty<Process, Structure>资源使用数据结构
m_memoryUsageStructureLazyProperty<Process, Structure>内存使用信息
m_cachedCwdWriteBarrier<JSString>缓存的当前工作目录
m_argvWriteBarrier<Unknown>进程参数数组
m_execArgvWriteBarrier<Unknown>执行参数数组

来源:src/bun.js/bindings/BunProcess.h18-75 src/bun.js/bindings/BunProcess.cpp1-50

环境变量实现

环境变量访问由 JSEnvironmentVariableMap 类处理,该类提供了对系统环境变量的 JavaScript 可访问接口,并具备正确的 UTF-8 编码处理。

环境变量实现支持:

  • UTF-8 编码:正确处理环境变量名称和值中的 Unicode 字符。
  • 动态更新:对 process.env 的更改会立即影响系统环境变量。
  • 枚举:支持 Object.keys()JSON.stringify() 和迭代。
  • 跨平台兼容性:在 Unix 和 Windows 系统上保持一致的行为。

来源:src/bun.js/bindings/BunProcess.cpp28 test/js/node/process/process.test.js150-173

平台和系统信息

Bun 通过跨多个模块实现的各种 API,提供全面的平台检测和系统信息。

平台检测函数

系统信息 API

API实现平台支持
process.platformconstructPlatform()darwin, linux, win32
process.archconstructArch()x64,arm64
os.cpus()cpusImpl{Linux,Darwin,Windows}()所有平台
os.freemem()Bun__Os__getFreeMemory()所有平台
os.totalmem()特定于平台的 API所有平台
os.uptime()系统运行时间调用所有平台

来源:src/bun.js/bindings/BunProcess.cpp158-180 src/bun.js/node/node_os.zig12-62 src/bun.js/bindings/OsBinding.cpp1-45

进程控制和生命周期

进程控制包括退出处理、信号管理和进程状态转换。

退出码管理

信号和事件处理

进程对象会发出各种生命周期事件:

事件触发器实现
exit进程终止dispatchExitInternal()
beforeExit在进程结束之前事件循环空闲检查
uncaughtException未捕获的错误异常处理器
unhandledRejection未处理的 Promise 拒绝Promise 拒绝跟踪

来源:src/bun.js/bindings/BunProcess.cpp261-282 test/js/node/process/process.test.js375-430

资源监控

Bun 实现了与 Node.js 兼容的全面资源监控 API。

资源使用结构

资源指标

资源使用 API 提供对以下内容的访问:

  • CPU 时间:用户和系统 CPU 时间消耗。
  • 内存统计:RSS、堆使用、外部内存。
  • I/O 计数器:文件系统读/写操作。
  • 上下文切换:自愿和非自愿上下文切换。
  • 页面错误:次要和主要页面错误计数。

来源:test/js/node/test/parallel/test-resource-usage.js1-31 src/bun.js/bindings/BunProcess.h21-23

特定于操作系统的实现

不同的操作系统需要专门的实现来收集系统信息。

CPU 信息收集

平台特定功能

平台特殊功能实现细节
Linux解析 /proc 文件系统直接文件系统访问以获取 CPU 和内存信息。
macOSsysctl 系统调用Mach 内核 API 用于系统统计。
WindowsWin32 API控制台模式管理、UTF-16 处理。

内存管理

每个平台在内存信息收集方面都有不同的实现方式:

  • Linux:使用 sysinfo() 系统调用和 /proc/meminfo 解析。
  • macOS:通过 host_statistics() 使用 Mach VM 统计 API。
  • Windows:使用 libuv 的 uv_get_available_memory()

来源:src/bun.js/node/node_os.zig64-148 src/bun.js/bindings/OsBinding.cpp12-44 src/output.zig144-274