Windows 与 fork() 最接近的东西是什么?

2023-12-19

我想这个问题已经说明了一切。

我想在 Windows 上 fork。最相似的操作是什么以及如何使用它。


Cygwin http://www.cygwin.com/Windows 上有功能齐全的 fork()。因此,如果您可以接受使用 Cygwin,那么在性能不是问题的情况下问题就解决了。

否则你可以看看Cygwin是如何实现fork()的。来自相当古老的 Cygwin 架构doc http://www.redhat.com/support/wpapers/cygnus/cygnus_cygwin/architecture.html:

5.6.流程创建 Cygwin 中的 fork 调用特别有趣 因为它不能很好地映射到 Win32 API。这使得它非常 很难正确实施。 目前,Cygwin 叉子是 非写时复制实现 类似于早期出现的情况 UNIX 的风格。

当 父进程fork出一个子进程 是父进程初始化一个空间 在 Cygwin 进程表中 孩子。然后它创建一个暂停的 使用 Win32 的子进程 创建进程调用。接下来,家长 进程调用setjmp来保存自己的 context 并设置一个指向 this 的指针 Cygwin 共享内存区域(共享 在所有 Cygwin 任务中)。然后它填充 在孩子的 .data 和 .bss 部分 通过从自己的地址空间复制 进入被暂停孩子的地址 空间。孩子的地址空间之后 初始化后,子进程运行 父进程等待互斥锁。孩子 发现它已经被分叉并且 使用保存的跳转缓冲区进行长跳转。 然后孩子将互斥体设置为 父母正在等待并阻止 另一个互斥体。这是信号 父级复制其堆栈和堆 进入孩子体内,之后 释放子进程的互斥体 等待并从叉口返回 称呼。终于,孩子从梦中醒来 阻塞在最后一个互斥体上,重新创建 传递给它的任何内存映射区域 通过共享区域,并从 分叉本身。

虽然我们对如何做有一些想法 加快我们的分叉实施速度 减少上下文的数量 在父子之间切换 进程,fork 几乎肯定会 在Win32下总是效率低下。 幸运的是,在大多数情况下 提供的调用的生成家族 Cygwin 可以替代 fork/exec 对只有一点点 努力。这些调用清晰地映射在顶部 Win32 API 的。结果,他们 效率更高。改变 编译器调用的驱动程序 使用spawn代替fork是一件微不足道的事情 改变并增加编译 速度提高百分之二十到百分之三十 我们的测试。

然而,spawn 和 exec 展示了他们的 自己的一系列困难。因为那里 没有办法在下面进行实际的执行 Win32、Cygwin 必须发明自己的 进程 ID (PID)。结果,当 一个进程执行多个exec 调用时,会有多个Windows 与单个 Cygwin 关联的 PID PID。在某些情况下,每个的存根 这些 Win32 进程可能会持续存在, 等待他们的 exec'd Cygwin 进程退出。

听起来工作量很大,不是吗?是的,它很慢。

编辑:该文档已过时,请参阅这个优秀的answer https://stackoverflow.com/questions/985281/what-is-the-closest-thing-windows-has-to-fork/985525#985525更新

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

Windows 与 fork() 最接近的东西是什么? 的相关文章

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • Windows C++ 中的键盘钩子还是什么?

    我希望构建自己的应用程序 它可以将键盘命令 消息 发送到 Windows 操作系统 例如 当我按下组合键 ctrl shift n 时 我希望启动 notepad exe 我怎样才能做到这一点 您对所使用的概念有什么建议吗 我读过 何时使用
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • Windows 目录永远不会包含临时文件的非 ASCII 字符?

    在 Windows 上使用 MinGW 7 3 0 由于 Windows 限制 Hunspell 无法从包含非 ASCII 字符的位置加载字典文件 我已经尝试了所有方法 1 现在我将文件复制到没有 ASCII 字符的路径 然后再将其交给 H
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new

随机推荐

  • 将“e.target”与 jQuery 对象进行比较

    我想做的事 clickedObject someDiv returns true or false 我尝试过的 e target selector returns a false negative 我的解决方法 e target attr
  • 如何在 BootstrapVue 元素上使用 Vue Test Utils 触发事件?

    这个问题让我很困难 我不明白如何制作Vue 测试工具 and BootstrapVue一起玩得很开心 一个最小的例子如下所示 MyComponent vue
  • Python 日志记录:使用毫秒时间格式

    默认情况下logging Formatter asctime s 使用以下格式打印 2011 06 09 10 54 40 638 其中 638 是毫秒 我需要将逗号更改为点 2011 06 09 10 54 40 638 要格式化时间 我
  • forEach 循环未根据需要更新数组

    我正在尝试循环 consoleOuputParamsOBJ 并更新我的 taskparamscompiled 对象列表中的记录 所需输出 process00x00 i D Code UnitTest ConsoleApp 1 00x00 p
  • 如何检查列是否等于可以为空的变量

    我有一个表 其中包含允许 null 或空值的 varchar 列 我正在编写一个存储过程 其中包含一个可以分配给空值或常规字符串 非空 的变量 它的定义如下 declare myvar varchar 50 现在我正在尝试编写一个查询 该查
  • Rust 中的(嵌套)Vec 是否可以进行模式匹配?

    一个库向我提供了一个我想要匹配的深度嵌套的数据结构 它包含Vec内部 我希望像注释掉的行之一一样起作用 struct Foo bar Vec
  • 带延迟的顺序 Promise 循环

    我正在尝试按顺序加载一组 请求 每个请求之间由延迟分隔 我正在使用承诺 但由于某些原因 我在并行而不是按顺序执行请求时遇到问题 我如下编写了一些测试代码 有用 它发出请求 处理请求 超时 3 秒 然后转到第二个请求 var batches
  • 如何将我的 godaddy 域名链接到 Windows Azure [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我四处搜寻 但仍然找不到任何有关如何执行此操作的信息 理想情况下 我想知道如何链接多个域名 因为我现在使用 SDK 1 3 有人对如何执行此操作有任何
  • 视频上传并在 Django 网站上显示

    我有一个上传视频的模型 我想在浏览器中显示相同的视频 但不知何故我无法做到 请帮助我 我制作了一个名为 部署 的应用程序 我在其中上传视频并保存它 请告诉我哪里做错了以及应该做什么 我希望上传的视频应该显示在页面上 并且应该有一个下载选项
  • 为什么我安装 rmagick 时遇到问题

    在 Ruby 1 8 7 和 Rails 2 3 5 上我得到 gem install rmagick ERROR Error installing rmagick ERROR Failed to build gem native exte
  • SQL语法区分大小写吗?

    SQL 区分大小写吗 我用过MySQL https en wikipedia org wiki MySQL and SQL 服务器 https en wikipedia org wiki Microsoft SQL Server这两者似乎都
  • 什么是 uber JAR 文件?

    我正在阅读 Maven 文档并偶然发现了这个名字uber jar 一个是什么意思uber jar是什么意思以及它的特点 优点是什么 ber德语单词是above or over 它实际上与英语同源over Hence in this cont
  • 如何匹配小于或等于100的数字?

    我想匹配一个小于或等于 100 的数字 它可以是 0 100 之间的任何数字 但正则表达式不应该匹配大于 100 的数字 如 120 130 150 999 等 Try this b 0 1 9 0 9 100 b 解释 b Assert
  • PHP 致命错误:调用未定义的函数 mysqli_stmt_get_result()

    我不断收到错误 PHP Fatal error Call to undefined function mysqli stmt get result 我正在使用 PHP 版本 5 6 并在我的托管提供商 c 面板中启用了扩展 mysqlind
  • XSelectInput 不适用于 ButtonPressEvents,怎么办?

    我正在用 C 语言编写一个简单的程序 我想捕获正在发生的所有鼠标和键盘事件 我尝试使用 XGrabPointer 但它会导致锁定屏幕 并且我无法转到其他应用程序 我尝试使用 XSelectInput 现在我成功接收键盘事件 但没有收到任何鼠
  • 什么是从虚拟基类继承的虚拟函数的“虚拟 thunk”?

    当我尝试访问从虚拟基类继承的派生类对象的内存布局时 出现了问题 编程环境 GNU Linux 3 19 0 32 generic x86 64编译器 gcc 4 8 4 virtual base class class Base publi
  • 有模板方法但不公开实现

    我在 TFRuntime h 中有一个函数 class TFRuntime template
  • 在 C++ 中,std::end 对于所有容器类型都保证为 O(1) 吗? [复制]

    这个问题在这里已经有答案了 如果一个容器可能包含大量项目 从性能角度来看 应该写 for auto p std begin container p std end container p 或者应该在循环之外访问容器的末端 const aut
  • 通过反射动态调用textboxfor

    我想做的最终结果是通过反映对象及其属性来动态构建表单 我已经创建了调用 TextBoxFor 和 CheckBoxFor 等的 HtmlHelper 方法 但现在我需要帮助弄清楚如何在将属性传递给 Html TextBoxFor 时正确反映
  • Windows 与 fork() 最接近的东西是什么?

    我想这个问题已经说明了一切 我想在 Windows 上 fork 最相似的操作是什么以及如何使用它 Cygwin http www cygwin com Windows 上有功能齐全的 fork 因此 如果您可以接受使用 Cygwin 那么