问题标签 [fiber]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
channel - oVirt Multipathing MPIO Fibre Channel如何?
我有一个关于 oVirt 和多路径的问题。我有一个包含 4 台主机和一个通过光纤通道连接的存储系统 (Dell EMC) 的集群。目前我在主机和存储系统之间有一个 SAN 交换机,但我想通过每台主机上的两条光纤通道路径直接连接主机和存储系统。
因此,我需要多路径。主机运行 centos 7 minimum 并且多路径已安装并处于活动状态。我需要更改 multipath.conf 文件,还是 centos 自动识别这两个路径?负载平衡是主动/被动还是主动/主动?oVirt 的文档对 iSCSI 的解释很少而且更多。
我是这个话题的新手,所以请多多包涵。:)
ruby - 如何使用“方法”而不是代码块来创建光纤
而不是这样做,
我正在尝试做这样的事情:
如何使Fiber
代码看起来像已完成的部分?
theory - Fibers / Coroutines vs Delimited Continuations
所以我在这里阅读了一篇关于并发工作窃取双端队列的论文:http: //open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3872.pdf。他们提到了“Child-Stealing vs Continuation Stealing”,他们说儿童窃取可能需要无限的堆栈空间来保存尚未执行的任务,而持续窃取是 P=#processors 的常数因子。
我对纤维/协程和定界延续之间的区别有一个理论问题。首先,我承认协程和纤程几乎是等价的,但纤程也等同于延续吗?我有一个偷偷摸摸的怀疑,我将要实现的内容从根本上是错误的(即用光纤替换线程,而不是实际实现不需要无限内存的版本)。
c++ - 具有 Boost::Fiber 的多个共享工作池
我一直在寻找boost::fibers
一种方法来处理我的一些数据处理和 IO 问题。特别shared_work
是调度程序看起来很有希望,因为它可以让我为每个数据处理源启动一个数据处理任务,然后让它们根据需要在几个线程中相互分配。
然而,这让我想到了我的问题的根源:看起来我每个进程只能有一个shared_work
“池”。如果我想在 4 个线程之间共享处理数据中的一组 12 根光纤,而同时另一组 12 根光纤正在将处理后的数据写入另外 4 个线程之间共享的文件,我该怎么办。
就像是:
如果不编写自己的光纤调度程序,这可能吗?如果是这样,怎么做?
c++ - 使用 C++ 异常时 Windows 上可能的最小堆栈大小(使用 boost 上下文纤程)
我正在使用 boost context 1.67 在 Windows 10 上创建一个具有尽可能小的堆栈大小的光纤(fcontext API)。
可能这个问题不仅特定于提升上下文,而且适用于我们使用具有最小堆栈大小的 Windows 线程的任何场景。
我在使用非常小的堆栈(低于 10kb)时遇到了问题,这些堆栈溢出异常是由 boost 上下文引发的内部堆栈展开异常引起的,如下所示:
当使用更大的堆栈(> 10 kb)时,我没有遇到任何问题。
对于复制,以下示例就足够了:
Boost context 在这里仅用于执行与用户分配的堆栈的上下文切换,可能是由于 MSVC C++ 异常的一些限制引起的,这可能需要一定的最小堆栈大小才能工作。此外,SetThreadStackGuarantee
WinAPI 函数对该问题没有任何影响。
如示例所示,堆栈是通过 malloc 分配的。
使用 C++ 异常时,是否可以在 Windows 上使用小于 10kb 的堆栈?哪种情况可能导致这里的限制?
c - 为什么调用 setjmp() 中的函数会出现分段错误?
我不明白为什么在函数中,在语句 内部调用middleFunc()
时会引发分段错误。entry_point(arg)
if ( setjmp(middle) )
c - 为什么用户级线程(纤程)的实现需要为每个纤程分配一个新的堆栈?
setjmp()
在 C 中可以使用和longjmp()
在用户级别实现上下文切换来编码光纤。
如
evanjones.ca和Portable Multithreading(pdf)中所述,还要求每条光纤都有一个新分配的堆栈。
由于纤程存在于线程上下文中,当它被调用时,它会自动关联一个堆栈帧,那么为什么它需要这个新分配的堆栈呢?:当一根光纤想要切换到另一根时,可以使用以下方法:
新堆栈的必要性是因为如此处所写 ,不可能使用 longjmp()
返回到堆栈帧从光纤调用的那一刻起不再有效的光纤执行longjmp()
?
编辑:这些光纤必须是非抢占式的,并且可以自愿从一根光纤切换到另一根光纤
windows - 以简单的方式使用 windows 光纤但出现无法解释的错误
当发生一些奇怪的崩溃和未定义的行为时,我使用Windows Fiber实现了我自己的任务调度程序。为了简单起见,我开始了一个新项目并编写了一个执行以下操作的简单程序:
- 主线程创建一堆纤维,然后启动两个线程
- 主线程一直等到你杀死程序
- 每个工作线程都将自己转换为纤维
- 每个工作线程试图找到一个空闲的光纤,然后切换到这个新的空闲光纤
- 一旦线程切换到新的光纤,它会将之前的光纤推入空闲光纤容器
- 每个工作线程进入第 4 步
如果您不熟悉光纤概念,本次讲座是一个好的开始。
数据
每个线程都有自己的ThreadData数据结构来存储其先前的、当前的纤程实例及其线程索引。我尝试了几种在执行期间检索ThreadData数据结构的方法:
- 我使用线程本地存储来存储 ThreadData 指针
- 我使用了一个将 thread_id 与 ThreadData 结构相关联的容器
问题
当第一次输入纤程时(查看FiberFunc函数),使用该纤程的线程必须将其前一个纤程推入自由纤程容器中。但是碰巧有时之前的光纤是空的,这是不可能的。这是不可能的,因为在切换到新光纤之前,线程将其先前的光纤值设置为其当前的光纤值(并将其当前的光纤值设置为新的光纤值)。
因此,如果一个线程进入一个全新的光纤,其先前的光纤设置为空,这意味着它来自无处(这没有任何意义)。
ThreadData在进入全新的 Fiber 时将其先前的 Fiber值设置为 null的唯一原因是另一个线程将其设置为 null 或者编译器在后台重新排序了指令。
我检查了程序集,似乎编译器不负责。
有几个我无法解释的错误:
如果我使用第一个GetThreadData()函数来检索 ThreadData 结构,我可以检索其索引与线程本地索引不同的实例(这些索引已在线程启动时设置)。这将使程序断言 (assert(threadData->index == localThreadIndex))。
如果我使用任何其他函数来检索 ThreadData 结构,我将在FiberFunc函数中断言,因为先前的 Fiber值为 null (assert(threadData->previousFiber))。
你知道为什么这段代码不起作用吗?我花了无数个小时试图找出问题所在,但我没有看到我的错误。
规格
操作系统:Windows 10
IDE:Visual Studio 2015 和 Visual Studio 2017
编译器:VC++
配置:发布
请注意,调试配置中没有错误。
编码
在断言触发之前,您可能会尝试多次运行它。
node.js - 将 Meteor 应用程序部署到 Synology armv7:`node-fibers` 存在问题
我花了几天时间尝试在我的 Synology ds213j(Armv7,512MB 内存)上运行来自 Meteor 的构建应用程序。
我一直遇到以下错误
但是,fibers.node 实际上存在!
我之前做的:
构建流星应用
meteor build --server-only --architecture os.linux.x86_32
在 /program/server 文件夹上
npm install --production
npm install fibers
我试图解决的问题:
- 转到 /programs/server/ 并运行 npm install fiber(并重新安装)
按照https://www.npmjs.com/package/fibers上的说明从源代码安装
我的流星应用程序使用节点 8.11.2,但唯一可用于群晖的节点版本是 8.9.4。删除它并手动安装 8.11.2
构建一个默认的流星应用程序来检查我的应用程序是否有问题。
到目前为止没有任何效果,我不知道下一步该做什么。
我怀疑问题是光纤是为 linux-arm-57 构建的,我想我需要 arm-7I?我可以做些什么来完成这项工作?
谢谢!