« 游戏,一种奇怪的软件 | 返回首页 | 保重身体 »

纤程

Widnows 是提供了用户级线程的,类似 coroutine 需要用户主动是切换。这在单线程程序中非常有用。线程调度模块只负责提供堆栈,环境的保存。不负责分配时间片等。

自己实现 coroutine 并不难,但能用操作系统提供的可以得到更多的便利。Windows 中把这种用户级线程叫做 Fiber,纤维的意思。比较通用的译名是纤程。

我们可以把一个 thread 转换成一个 fiber ,用到的 API 是 ConvertThreadToFiber。其实用的更多的是CreateFiber,它可以创建一个纤程,但并不切换过去运行。

被创建出来的 Fiber 会有一个上下文的地址被返回,用于以后的切换操作。我们可以用 SwitchToFiber 来切换。这是唯一用于 Fiber 释放操作权的途径。SwitchToFiber 必须显式的指定切换的目标,所以 Fiber 调度的工作需要我们自己写代码来实现。

GetCurrentFiber 和 GetFiberData 这两个函数都很有用,一个用来取到运行环境,一个用来取得创建参数,这两个函数都是用 inline 函数的形式提供在 .h 文件中的。

TrackBack

如果你想引用这篇文章,请复制下面的链接发送引用通告(GBK)
http://blog.codingnow.com/mt/mt-tb.cgi/5

Comments

关注 Fiber , 看起来确实是个优秀的东西!

自己实现fiber也是可以的,但是想做完美很痛苦。
主要的担心是windows的TEB之类的结构可能会变,要考虑不少兼容性问题。如果不处理异常那就方便多了。

貌似线程至少要占用 8k 地址空间才是安全的。4k 是最小的页单位,还要空留 4k 做越界异常。

fiber 我没开过那么多,如果有这种需求,我会用自己的库,更为节省且容易控制。

我试的栈是4K。。。1K也试过

Fiber的默认堆栈是1M,在32位机上,地址空间很快就会用完的。把堆栈设少一点就行了

我认为fiber的用处还是很大的。可以用来很方便的描述逻辑。
但是c语言有先天性不足,很难实现100k级别的fiber同时运行。
要自己实现fiber,主要是保存线程上下文。注意要保存的信息有:各个寄存器,栈顶和栈底,异常信息,浮点寄存器。
windows自己实现的fiber切换都在用户态完成,速度还是比较快的。但是好像在我的机器上只能开2k左右个fiber,我的系统是win2k3 sp2,不知道是不是系统的问题。

POSIX的等价物是setcontext, getcontext, makecontext and swapcontext

云风把Fiber讲得很透彻啊.侯捷说纤程开始是微软便于用户把Unix程序port到windows中来的,然而Fiber作为coroutine的一个实现,在通讯中更好发挥作用.

几个月前偶尔逛书店看到云风的书,写得不错啊.牛人啊.

纤程用于化异步为同步。
你可以进行一个异步操作以后就切换纤程,等到异步操作完成以后在切换回来,这样,在逻辑上相关的代码就可以写到一个函数里面,而不用人为的分到多个回调函数中。

SQL Server就用到fiber的。

有没有用vs2003或者vs2005去调试过fiber呢?

纤程在一些特定场合非常有用。
linux有纤程么?

多线程的程序很多不是为了提高效率,充分利用多 CPU,而是为了逻辑描述方便。

纤程往往可以提供更加便捷的描述,因为它只能通过 SwitchToFiber 显式切换,这样可以少许多加解锁的过程。而且切换的效率也比真正的线程来的高。

Fiber 就是一种 coroutine 的实现,而 coroutine 其实是一种常见的算法表达方式。只是 C 语言和其衍生的基于一个环境堆栈的语言并没有直接支持。所以才少为人知。

我想知道纤程有什么用处,我真的很难想出它的使用场合

Post a comment

非这个主题相关的留言请到:留言本