【翻译WINDOWS NT FILE SYSTEM INTERNAL】NT缓存管理器一(5)

本文深入探讨了NT操作系统中缓存管理器的工作原理,包括如何利用系统内存缓存文件数据,以及缓存管理器如何与其他进程共享内存资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在读写操作时缓存数据

NT操作系统中,在操作文件时候,用户进程被允许描述文件数据是否被缓存到内存。仅仅那些打开文件时没有IRP_NOCACHE标记(表示文件数据可以被缓存)才有数据被缓存到系统内存。为了理解上一章描述的NT缓存管理器提供的缓存功能 ,像考虑一个应用程序一样考虑缓存管理器,执行在系统上,他们被其他执行在相同系统上的应用程序打开的时候,很像打开一个文件。

为了缓存数据,缓存管理器不得不利用系统内存。像第五章(NT虚拟内存管理器)说明的一样,每个执行在NT环境上的进程都有4GB虚拟内存空间可用。低一半地址空间是进程描述,但高2GB用来保存操作系统,并且被共享给每个执行在系统中的进程。这个虚拟地址模型仅用于系统进程,这是一个创建于系统初始化阶段的特别进程。在系统初始化时,缓存管理器在高2GB系统进程虚拟地址空间中保留一个虚拟地址空间。因为被预留给缓存管理器专门使用的虚拟地址范围在高2GB虚拟地址空间中,每个执行在系统中的进程都可以访问NT缓存管理器预留的虚拟地址范围。图6-2显示了NT缓存管理器预留的虚拟地址空间范围位置。

尽管NT缓存管理器预留了自己专门使用的一个确认的虚拟地址范围,但是物理页内存不是必须分配给这个虚拟地址范围。被分配给缓存管理器的物理页内存的数量是确定的,NT虚拟内存管理器会不断的调整这个值。在其他用户进程或者系统组件所需要的物理内存减少时,虚拟内存管理器会给缓存管理器增加大量的物理内存。另一方面,当系统在有限的可用物理内存条件下被缓慢加载时,内存管理器会减少分配给缓存管理器(用来缓存文件数据)的物理内存数。

值得注意的是,NT虚拟内存管理器的唯一的权利是做一些关于物理内存分配的决定,这很重要。

缓存管理器使用文件映射来缓存文件数据。一个文件系统驱动通过调用缓存管理器来把缓存初始到一个文件流上。在接到一个请求时,缓存管理器调用虚拟内存管理器去创建一个段对象来表示一个文件映射,这是要对所有文件流做的事。然后,当一个进程企图访问属于一个流的数据的时候,缓存管理器动态的把文件流的视图映射为(系统虚拟内存空间中,他自己保留的)虚拟地址空间的一部分。值得注意的是,自动缓存管理器保留的虚拟地址范围被确定以后,缓存管理器可能不得不取消一个或多个之前被映射的视图,来摆正有能力创建新的视图。

为了更好地理解缓存管理器在I/O请求服务中扮演的角色,让我们来考察一下在用户发起的(user-initiated)读写操作时的典型步骤的顺序。



npm ERR! code 1 npm ERR! path D:\work\opscloud4\opscloud4-web-master\node_modules\deasync npm ERR! command failed npm ERR! command C:\WINDOWS\system32\cmd.exe /d /s /c node ./build.js npm ERR! gyp info it worked if it ends with ok npm ERR! gyp info using node-gyp@10.0.1 npm ERR! gyp info using node@18.19.0 | win32 | x64 npm ERR! gyp info find Python using Python version 3.12.3 found at "C:\Users\27145\AppData\Local\Programs\Python\Python312\python.exe" npm ERR! gyp ERR! find VS npm ERR! gyp ERR! find VS msvs_version not set from command line or npm config npm ERR! gyp ERR! find VS VCINSTALLDIR not set, not running in VS Command Prompt npm ERR! gyp ERR! find VS could not use PowerShell to find Visual Studio 2017 or newer, try re-running with '--loglevel silly' for more details npm ERR! gyp ERR! find VS looking for Visual Studio 2015 npm ERR! gyp ERR! find VS - not found npm ERR! gyp ERR! find VS not looking for VS2013 as it is only supported up to Node.js 8 npm ERR! gyp ERR! find VS npm ERR! gyp ERR! find VS ************************************************************** npm ERR! gyp ERR! find VS You need to install the latest version of Visual Studio npm ERR! gyp ERR! find VS including the "Desktop development with C++" workload. npm ERR! gyp ERR! find VS For more information consult the documentation at: npm ERR! gyp ERR! find VS https://github.com/nodejs/node-gyp#on-windows npm ERR! gyp ERR! find VS ************************************************************** npm ERR! gyp ERR! find VS npm ERR! gyp ERR! configure error npm ERR! gyp ERR! stack Error: Could not find any Visual Studio installation to use npm ERR! gyp ERR! stack at VisualStudioFinder.fail (D:\ProgramFile\developTool\nvm\nvm\v18.19.0\node_modules\npm\node_modules\node-gyp\lib\find-visualstudio.js:113:11) npm ERR! gyp ERR! stack at VisualStudioFinder.findVisualStudio (D:\ProgramFile\developTool\nvm\nvm\v18.19.0\node_modules\npm\node_modules\node-gyp\lib\find-visualstudio.js:69:17) npm ERR! gyp ERR! stack at process.processTicksAndRejections (node:internal/process/task_queues:95:5) npm ERR! gyp ERR! stack at async createBuildDir (D:\ProgramFile\developTool\nvm\nvm\v18.19.0\node_modules\npm\node_modules\node-gyp\lib\configure.js:69:26) npm ERR! gyp ERR! stack at async run (D:\ProgramFile\developTool\nvm\nvm\v18.19.0\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js:81:18) npm ERR! gyp ERR! System Windows_NT 10.0.26100 npm ERR! gyp ERR! command "D:\\ProgramFile\\developTool\\nvm_nodejs\\nodejs\\node.exe" "D:\\ProgramFile\\developTool\\nvm\\nvm\\v18.19.0\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" npm ERR! gyp ERR! cwd D:\work\opscloud4\opscloud4-web-master\node_modules\deasync npm ERR! gyp ERR! node -v v18.19.0 npm ERR! gyp ERR! node-gyp -v v10.0.1 npm ERR! gyp ERR! not ok npm ERR! Build failed
最新发布
06-10
<think>我们正在处理Windows10系统上安装`deasync`模块时出现的node-gyp配置错误。用户已经提供了node版本(v18.19.0)和node-gyp版本(v10.0.1),并指出错误是关于找不到VisualStudio(gypERRfindVS)。根据经验,这个错误通常是因为缺少编译所需的构建工具(在Windows上是VisualC++BuildTools)或者Python环境配置问题。虽然用户的问题中提到了VisualStudio,但注意node-gyp在Windows上需要的是构建工具,不定是完整的VisualStudio。同时,参考用户提供的引用内容,我们可以发现:-引用[1]提到node版本问题,但用户已经降级到18.19.0,这是LTS版本,应该没问题。-引用[2]提到了权限问题,但Windows上的权限错误通常表现为访问拒绝,用户的问题描述是找不到VS,所以暂时排除。-引用[3]提到了使用`--legacy-peer-deps`解决依赖冲突,但用户的问题是关于编译工具缺失,不是依赖冲突。因此,我们将重点放在解决Windows上构建工具的安装和配置上。###解决方案步骤:####1.安装构建工具在Windows上,node-gyp需要安装VisualStudioBuildTools,特别是其中的C++工具集。推荐安装方法:-使用Microsoft提供的`windows-build-tools`包(已不再维护,但对于老版本node-gyp可能有效)或者直接安装VisualStudioBuildTools2019或2022。但是,更推荐直接安装VisualStudio2022并选择“使用C++的桌面开发”工作负载,注意勾选:-MSVCv143-VS2022C++x64/x86生成工具(最新)-Windows10SDK(或最新版本)-如果没有安装Python,也需要安装Python,但node-gyp通常会使用自带的Python,不过有时需要指定。由于用户已经安装了node-gypv10.0.1,它可能要求Python版本(需要Python2.7或3.x),但注意最新版本的node-gyp支持Python3。在Windows上,如果没有安装Python,也会报错。####2.使用npm配置设置如果已经安装了构建工具,但仍然报错,可能是因为node-gyp没有找到安装路径。我们可以通过npm配置设置MSVS的版本。####3.通过命令行安装构建工具(可选)也可以尝试通过命令安装构建工具(需要管理员权限的PowerShell):```powershellnpminstall--globalwindows-build-tools```但注意这个包可能已经过时,而且安装过程可能很慢。####4.如果上述步骤无效,尝试手动设置环境变量###具体操作步骤:**步骤1:安装VisualStudioBuildTools2022**1.下载安装程序:访问[VisualStudio下载页面](https://visualstudio.microsoft.com/zh-hans/downloads/),下载“BuildToolsforVisualStudio2022”。2.运行安装程序,选择“使用C++的桌面开发”工作负载,并确保勾选了Windows10SDK(或11)和MSVCv143生成工具。3.安装完成后,重启电脑。**步骤2:设置npm配置(可选)**在终端中运行以下命令,指定使用的VisualStudio版本:```bashnpmconfigsetmsvs_version2022```**步骤3:检查Python环境**虽然node-gypv10支持Python3,但是确保系统有可用的Python环境(建议Python3.7以上),并且将其添加到环境变量。可以通过命令检查:```bashpython--version```如果没有,则安装Python并确保勾选“添加到PATH”。然后设置npm的Python路径(如果Python在非标准位置):```bashnpmconfigsetpython<path_to_python_executable>```**步骤4:重试安装deasync**在安装命令前添加`--global`选项以获取可能的更详细日志,或者使用:```bashnpminstalldeasync--save```如果之前失败,可能需要先删除`node_modules`再重试。**步骤5:如果遇到权限问题**尝试使用管理员权限打开终端(命令提示符或PowerShell)。###错误处理:如果仍然出现错误,请检查错误日志,常见的解决方向:1.确认构建工具安装正确:打开“VisualStudioInstaller”,确认已安装的构建工具。2.检查环境变量:确保VS的路径在环境变量中(安装后通常会自动添加)。3.更新node-gyp:虽然用户使用的是node-gypv10.0.1,但可以尝试更新到最新版本(注意,node附带的node-gyp版本是固定的,可以通过`npminstall-gnode-gyp`升级,但可能和node不兼容,所以通常不建议)。###补充说明:根据官方文档,Node.js18需要VS2019或VS2022,所以步骤1中安装VS2022构建工具应该可以解决问题。###相关命令总结```powershell#安装构建工具后设置msvs_versionnpmconfigsetmsvs_version2022#设置python路径(如果需要)npmconfigsetpython"C:\Python39\python.exe"#清除npm缓存后重新安装npmcacheclean--forcenpminstalldeasync```###相关问题§§相关问题§§1.如何在Windows配置Node.js原生模块编译环境?2.使用npm安装依赖时遇到权限被拒绝(EACCES)错误如何解决?3.如何升级或降级node-gyp以兼容不同的Node.js版本?</think> ### 解决 Windows 10 上安装 deasync 模块的 node-gyp 配置错误 #### 根本原因分析 在 Windows 10 使用 Node.js v18.19.0 安装 `deasync` 时出现 `gyp ERR find VS` 错误,通常是由于: 1. **缺失编译工具链**:deasync 包含原生 C++ 代码,需要 Visual Studio 构建工具编译 2. **未配置系统环境**:node-gyp v10.0.1 需要明确识别 Visual Studio 路径 3. **权限问题**:系统可能阻止创建构建目录(参考[^2]) #### 解决方案(分步操作) ##### 1. 安装必备构建工具 安装 **Microsoft Visual C++ 构建工具**(非完整VS): ```powershell # 使用管理员权限运行 PowerShell npm install --global windows-build-tools ``` » 该命令自动安装: - Python 2.7(node-gyp 兼容所需) - Visual C++ Build Tools 2022 - Windows SDK ##### 2. 配置系统环境变量 ```powershell # 设置 node-gyp 的 VS 版本标识 npm config set msvs_version 2022 # 验证配置 npm config list | Select-String "msvs" ``` » 应显示: `msvs_version = 2022` ##### 3. 修复权限问题(参考[^2]) ```powershell # 授予当前用户完全控制权限 icacls "C:\Program Files\nodejs" /grant "$env:USERNAME:(OI)(CI)F" # 清理缓存后重试 npm cache clean --force ``` ##### 4. 安全安装 deasync ```powershell npm install deasync --save --legacy-peer-deps ``` » `--legacy-peer-deps` 规避依赖冲突(参考[^3]) #### 验证安装 ```javascript // test.js const deasync = require('deasync'); console.log("Deasync 加载成功!"); ``` 运行:`node test.js` » 应输出成功消息 #### 备用方案 若仍失败,**推荐使用 Docker 容器编译**: ```dockerfile FROM node:18.19.0-windowsservercore RUN npm install --global windows-build-tools WORKDIR /app COPY package.json . RUN npm install --legacy-peer-deps ``` ### 故障排查矩阵 | 错误现象 | 解决方案 | 验证命令 | |----------|----------|----------| | `gyp ERR! find VS` | 重装 windows-build-tools | `npm ls -g windows-build-tools` | | `EACCES: permission denied` | 执行权限授予步骤 | `icacls "C:\Program Files\nodejs"` | | `ERR! stack Error: Could not find any Python` | 检查 Python 2.7 路径 | `where python` | ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值