为什么在 Windows 上创建新进程比在 Linux 上更昂贵?

2023-11-22

我听说在 Windows 机器上创建新进程比在 Linux 上更昂贵。这是真的?有人可以解释为什么它更昂贵的技术原因,并提供这些原因背后的设计决策的任何历史原因吗?


mweerden:NT 从第一天起就是为多用户设计的,所以这并不是一个真正的原因。然而,您说得对,进程创建在 NT 上的作用没有在 Unix 上那么重要,因为与 Unix 相比,NT 更喜欢多线程而不是多处理。

Rob,确实在使用COW时fork相对便宜,但事实上fork后面大多是exec。执行人员还必须加载所有图像。因此,讨论分叉的性能只是事实的一部分。

当讨论进程创建的速度时,区分 NT 和 Windows/Win32 可能是个好主意。就 NT(即内核本身)而言,我不认为进程创建 (NtCreateProcess) 和线程创建 (NtCreateThread) 比普通 Unix 慢得多。可能还有更多的事情发生,但我没有看到这里性能差异的主要原因。

但是,如果您查看 Win32,您会发现它为进程创建增加了相当多的开销。其一,它需要通知 CSRSS 有关进程创建的信息,这涉及到 LPC。它至少需要另外加载 kernel32,并且在该进程被视为成熟的 Win32 进程之前,它必须执行许多额外的簿记工作项。我们不要忘记解析清单、检查图像是否需要兼容性填充程序、检查软件限制策略是否适用等所带来的所有额外开销,yada yada。

也就是说,除了进程、VA 空间和初始线程的原始创建之外,我发现所有必须完成的小事情的总和总体放缓。但正如一开始所说的——由于多线程比多任务更受青睐,唯一受到这种额外费用严重影响的软件是移植不佳的 Unix 软件。尽管当Chrome和IE8等软件突然重新发现多处理的好处并开始频繁启动和关闭进程时,这种情况发生了变化......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 Windows 上创建新进程比在 Linux 上更昂贵? 的相关文章

  • Windows 上的 ruby​​ 中出现 SSL 错误

    我收到以下错误 C Users user Desktop folder gt ruby exchange rate rb C Ruby23 x64 lib ruby 2 3 0 net http rb 933 in connect nonb
  • 在詹金斯管道作业中将变量传递给bash脚本

    我有一个 Jenkins 管道作业 其中我使用名为 setup sh 的 bash 脚本配置我的环境 如下所示 bin bash export ARCH 1 echo architecture ARCH 在 Jenkins 管道脚本中 我使
  • 我应该如何从非 root Debian Linux 守护进程登录?

    我正在编写一个新的守护进程 它将托管在 Debian Linux 上 我发现 var log 具有仅 root 写入权限 因此我的守护进程无法在那里写入日志文件 但是 如果它写入那里 它似乎将获得自动日志轮转 并且也按照用户期望的方式工作
  • 如何防止从快照恢复虚拟机时出现“本机与域之间的信任关系失败”错误?

    当您从 足够旧的 快照恢复虚拟机 属于 Windows 域 时 您将收到以下错误 本机与域之间的信任关系失败 发生这种情况是因为域控制器定期更新计算机帐户密码 可能还有其他一些事情 有什么方法可以配置域控制器 或其他任何东西 以防止这种情况
  • 使用 XAMPP 在 Windows 10 中安装 go-pear.phar 时出错

    我在尝试安装时总是遇到错误go pear phar 这是点击后的错误Enter对这个问题1 13 all or Enter to continue 1 13 all or Enter to continue ERROR Please ent
  • 如何将 Windows 窗体应用程序 (C++) 设置为具有 Aero/Glass 背景?

    我正在使用 Visual Studio 2010 Pro 用 C 创建 Windows 窗体应用程序 我想创建一个透明背景 即使用 Aero Glass 效果 类似于它围绕 Windows 照片查看器中 UI 底部的方式 此时 我已经查看了
  • c - 后台运行的程序的退出状态

    我有一个任务 其中我必须创建一个迷你 shell 它能够执行很多操作 包括作业控制 我设法使用 fork 和 execvp 创建新的工作 但我还想获取 execvp 运行的程序的退出代码 根据我从其他帖子中查找到的内容 我可以使用以下方法来
  • Zip 实用程序在 Linux 中每次都给我不同的 md5sum

    当我在 Linux 中压缩 Zip 2 31 同一个文件时 每次都会得到不同的校验和 如何保持上次的 md5sum 相同 我正在使用 yum 提供的最新 zip 更新 生成的存档不仅包含压缩文件数据 还包含 额外的文件属性 如参考zip 文
  • PHP中如何找出特定进程仍在运行

    我正在编写一个脚本 该脚本构建其他脚本的队列 并应该管理它们的启动 管理器脚本应该知道哪个子进程已经完成 因此它可以启动在队列中等待的其他脚本 我添加了一个 echo 获取每个子进程的进程 ID 所以我有我的子进程进程 ID 现在正在使用系
  • 强制 shell 在 SunGrid 引擎中使用 conda 变量中的 python [重复]

    这个问题在这里已经有答案了 我正在尝试在 SunGrid 引擎中执行 python 文件 并且从 anaconda3 环境变量中执行它 我的代码很简单 from future import print function import url
  • 找出用户属于哪些组

    我有一个刚刚创建的 Windows 用户帐户 以 XYZ 为例 此 XYZ 属于我在计算机管理 gt 本地用户和组中创建的用户组和自定义组 因此 在属性中我看到该用户属于 2 个组 现在我想获取这些组并显示它们 有什么建议么 我已经这样做了
  • 适用于 Python 的旧版本 Windows 二进制库 Wheel 的存储库?

    作为很多用户 我使用很棒的Christopher 的 Windows 二进制轮子 http www lfd uci edu gohlke pythonlibs vlfd当尝试在 Windows 上安装一些 python 包 例如 GDAL
  • 如何检查应用程序的另一个实例是否正在运行[重复]

    这个问题在这里已经有答案了 有人可以展示如何检查程序的另一个实例 例如 test exe 是否正在运行 如果是 则停止加载应用程序 如果存在该实例 想要一些严肃的代码吗 这里是 var exists System Diagnostics P
  • 在Linux上如何找到当前目录的所有直接子目录?

    在Linux上如何找到当前目录的所有直接子目录 最简单的方法是通过编写来利用 shell 通配功能echo 如果你喜欢使用ls 例如要应用格式 排序选项 请使其ls d 解释 斜杠确保仅考虑目录 而不考虑文件 Option d 列出目录本身
  • 强制 Java 最低版本以“java -version:”运行在 Windows 上不起作用

    我想强制应用程序运行的 JVM 最低版本为 1 6 或更高版本 即 1 6 我的理解是 您可以使用 version 命令行参数来执行此操作 我尝试了一下 在Linux下似乎可以正常工作 但在Windows下却不行 LINUX 我在 Linu
  • 将 HTML 字符串加载到 UIWebView 中的延迟

    我在导航控制器中有两个视图控制器 第一个视图控制器有一个带有按钮的菜单 按下此按钮将移动到第二个视图控制器并将 html 字符串加载到 UIWebView 中 没有其他东西被加载到 webview 中 只是一个简单的 NSString 其中
  • WinSock.h 和 WinSock2.h 使用哪个?

    有谁知道 WinSock h 和 WinSock2 h 之间的区别 我知道它们不使用相同的库 lib 但我不知道 WinSock2 是否仅添加了新功能 或者是否还改进了 WinSock 1 功能 我正在使用 IP TCP 套接字 并希望使用
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • Linux 堆栈大小

    我正在寻找 Linux 内核中堆栈的良好描述 但我发现找到任何有用的东西出奇地困难 我知道大多数系统的堆栈限制为 4k 而其他系统则限制为 8k 我假设每个内核线程 下半部分都有自己的堆栈 我还听说 如果中断发生 它会使用当前线程的堆栈 但

随机推荐

  • Async/await 与 then 哪个性能最好?

    我有一段简单的 JavaScript 代码 可以在 API 中执行请求并返回响应 很简单 但在这种情况下 我将收到数千个请求 那么 哪一个代码选项的性能会更好 以及为什么 目前还推荐哪一种作为良好实践 第一个选项是使用 then 来解析 P
  • 在 THREE.js 中使用纹理

    我从 THREE js 开始 尝试绘制一个带有纹理的矩形 由单一光源照亮 我认为这很简单 为简洁起见 省略了 HTML function loadScene var world document getElementById world W
  • 反应本机 |将选项添加到文本上下文菜单

    我正在开发一个版本为 0 51 的 React Native 应用程序 在一个视图中 我想向文本选择上下文菜单添加一个新选项 我在react native的Text组件中没有找到任何属性来执行此操作 经过几个小时的谷歌搜索后 我通过添加以下
  • 联合 SQL Server 表中的所有几何图形,例如 Postgres 中的 GeomUnion

    只是为了预先澄清 我正在谈论联合几何 而不是 SQL 关键字UNION 我正在尝试将一些空间数据从带有 PostGIS 的 Postgres 移动到 SQL Server 2008 直到我看到这样的语句之前一切都很好 SELECT Geom
  • QMetaProperty::read:无法处理未注册的数据类型“TreeItem*”

    Qt 不允许注册类模板 我的班级层次结构是 TreeItemTemplateBackend public QObject template
  • 如何为webpack设置多个环境变量?

    有谁知道如何向 webpack 提供多个环境变量 我试图运行以下脚本但没有成功 cross env NODE ENV production DTM ENV staging webpack config internals webpack p
  • 将数组从 jQuery 传递到 MVC.NET 控制器,在控制器上给出 null 结果,但 jQuery 函数上存在值

    我正在尝试将数组从 jQuery 函数传递到我的控制器 该数组包含内容和保存该内容的 div 的 id 当我检查通过 Firebug 中的 AJAX 发送的对象时 那里有正确的值 但在我的控制器上放置断点后 收到的值是一个空列表或数组或我尝
  • 使用gradle将jar上传到本地Maven仓库

    这个问题已经被问过好几次了 但不知何故我无法让它发挥作用 Gradle 是一个很棒的工具 但它的文档却一点也不出色 对于那些不每天使用它的人来说 没有任何例子几乎不可能理解它 我正在使用 Android Studio 我想将模块输出 jar
  • symfony2 注销

    我的问题是捕获用户注销 我所拥有的代码是 public function onAuthenticationFailure Request request AuthenticationException exception return ne
  • Angularjs:使用日期助手将时间戳格式化为 UTC 时间

    我正在寻找如何使用 AngularJS 日期助手格式化 unix 时间戳的想法 In 官方文档 只有字符串输入的解释 如果字符串输入中没有指定时区 则认为时间是本地时区 但是时间戳呢 有什么提示吗 我找到了一些带有自定义过滤器和 momen
  • 无法获取 Google Cloud Storage 存储桶的位置

    我尝试使用 Java 客户端将数据从 S3 传输到 GCS 但出现此错误 无法获取 Google Cloud Storage GCS 存储桶的位置 由于权限不足 请验证是否已授予必要的权限 我正在使用具有项目所有者角色的服务帐户 该帐户应授
  • onTouch MotionEvent getTouchMinor 和 getTouchMajor 的数字结果总是完全相同,为什么?

    查看文档 触摸主坐标和触摸副坐标是触摸事件的椭圆轴 一种是触摸区域的最长测量长度 另一种是触摸事件的最短测量长度 就像椭圆的测量一样 不过 我在几台 Android 平板电脑上测试了 getTouchMajor 和 getTouchMino
  • Magento 中多个模块覆盖同一个核心文件

    Magento 如何处理覆盖同一核心文件的多个模块 是否可以 它是如何完成的 您有 3 种解决冲突的选择 将一个冲突文件中的代码合并到另一个文件中 并关闭其中一个文件中的重写 config xml 关闭一个 config xml 中的重写
  • C++ 中的函数组合

    有许多令人印象深刻的 Boost 库 例如 Boost Lambda 或 Boost Phoenix 它们在使 C 成为真正的函数式语言方面大有帮助 但是是否有一种直接的方法可以从任意 2 个或更多任意函数或函子创建复合函数 如果我有 in
  • strstr() 在 gcc 和 VS 中的实现是否具有线性复杂度?

    我知道有快速的字符串搜索算法 例如博耶 摩尔 and 高德纳 莫里斯 普拉特 其复杂度为 O n m 而普通解决方案为 O n m 那么 最流行的工具链 gcc 和 Visual Studio 的 strstr 实现是使用这些快速 O n
  • css 过渡不透明度在元素显示:无然后更改为显示:块的情况下不起作用

    正如标题所说 我有这个代码 https jsfiddle net fwo9ym1o javascript var container document querySelector container container style disp
  • 如何在 subprocess.Popen() 中使用现有环境变量

    Scenario 在我的 python 脚本中 我需要将一个可执行文件作为子进程运行 其中包含可执行文件所期望的 x 个命令行参数 Example EG 1 myexec sh 参数1 参数2 EG 2 myexec sh param1 M
  • 了解 Matlab FFT 示例

    我是 matlab 和 FFT 新手 想了解Matlab FFT 示例 现在我有两个主要问题 1 为什么x轴 频率 以500结束 我怎么知道没有更多频率或者它们只是被忽略了 2 我如何知道频率在0到500之间 FFT 不应该告诉我频率的限制
  • 如何检测 `snprintf` 错误?

    int snprintf char restrict s size t n const char restrict format snprintf 很好地防止超出目的地s 然而 当目的地不足以获得完整结果时 如何检测该错误和其他错误 以下内
  • 为什么在 Windows 上创建新进程比在 Linux 上更昂贵?

    我听说在 Windows 机器上创建新进程比在 Linux 上更昂贵 这是真的 有人可以解释为什么它更昂贵的技术原因 并提供这些原因背后的设计决策的任何历史原因吗 mweerden NT 从第一天起就是为多用户设计的 所以这并不是一个真正的