- 主题:觉得协程不是一个太好的编程模型
协程的目的是用一个线程处理多个连接。
多线程的目的是利用多核的并行能力。
我的目的是二者都要,就是多线程协程。
多线程协程的服务器,加上带热插拔的动态模块管理,可以随时往服务器里添加处理模块。
【 在 z16166 的大作中提到: 】
: 啊,还有人在用32位的系统当服务器吗?哈哈
: 你这个是具体的应用,ylh1969搞的是一个能跑多个应用的平台,考虑的东西不同
:
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
您的同一个协程,有跨线程执行吗?
【 在 ylh1969 的大作中提到: 】
: 协程的目的是用一个线程处理多个连接。
: 多线程的目的是利用多核的并行能力。
: 我的目的是二者都要,就是多线程协程。
--
FROM 111.199.149.*
在一个应用模块里,使用了IO,就可能在IO后换线程。
如果没有IO,就可以一直运行下去,不受打扰,没有调度开销。
【 在 z16166 的大作中提到: 】
: 您的同一个协程,有跨线程执行吗?
:
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
我的方案是交易中间件,所有的客户与商家(服务器)做交易(远过程调用,RPC),客户间没有联系,所以不能做游戏。
【 在 z16166 的大作中提到: 】
: 您的同一个协程,有跨线程执行吗?
:
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
这个是 go, java 这些语言的做法。
我感觉你的实现是有 BUG 的。我记得你会迁移协程的内存,而不是使用我说的 mmap(MAP_STACK). 这样会导致引用到栈的指针出现问题。这是 c/c++ 在实现协程(纤程)时特有的问题。
go, java 不需要使用 mmap(MAP_STACK) 的原因是因为他们其实并不使用栈,底层实现是 stackless 是一种编译期的变换,而是使用的函数调用帧,这东东其实是存堆里的。
【 在 ylh1969 的大作中提到: 】
: 在一个应用模块里,使用了IO,就可能在IO后换线程。
: 如果没有IO,就可以一直运行下去,不受打扰,没有调度开销。
--
修改:hgoldfish FROM 27.152.128.*
FROM 27.152.128.*
我的协程栈是mmap分配的,向下生长。
线程池和协程栈尺寸一样,由配置文件决定。
函数调用桢就在栈里呀。
每个连接一个协程,10000个链接就10000个协程,但是不分配它栈。直到收到远过程调用的请求才分配它栈,调用完成收回。在远过程中间有IO调用的话,就会使用这个栈进行yield-resume。
【 在 hgoldfish 的大作中提到: 】
: 这个是 go, java 这些语言的做法。
: 我感觉你的实现是有 BUG 的。我记得你会迁移协程的内存,而不是使用我说的 mmap(MAP_STACK). 这样会导致引用到栈的指针出现问题。这是 c/c++ 在实现协程(纤程)时特有的问题。
: go, java 不需要使用 mmap(MAP_STACK) 的原因是因为他们其实并不使用栈,底层实现是 stackless 是一种编译期的变换,而是使用的函数调用帧,这东东其实是存堆里的。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
【 在 finlab 的大作中提到: 】
: 协程机制与线程混用带来更高 的复杂性。
:
: 异步调用到最后,还是要同步,不如一开始就同步。
: ...................
很多协程就是提供了读写socket的协程实现啊, 调用协程的co_read, co_write不会阻塞线程
--
FROM 61.48.14.*
应该没有了吧。
不过现在有些纤程的实现原理。比如国内的 libgo,这个现在已经停止维护了好像,以前 oppo 家开源的可惜了,它家就是基于复制内存的。这一招在其它语言里面没问题,但是在 c/cpp 里面有一定的概率导致崩溃。
【 在 z16166 的大作中提到: 】
: 啊,还有人在用32位的系统当服务器吗?哈哈
: 你这个是具体的应用,ylh1969搞的是一个能跑多个应用的平台,考虑的东西不同
--
FROM 59.61.196.*
是 mmap(MAP_STACK) 吗? 如果不是的话,mmap() 也会提前分配出内存,非常浪费内存。
【 在 ylh1969 的大作中提到: 】
: 我的协程栈是mmap分配的,向下生长。
: 线程池和协程栈尺寸一样,由配置文件决定。
: 函数调用桢就在栈里呀。
: ...................
--
FROM 59.61.196.*
对,即使线程内部的跳转, 只要工作内容变化了,同样会导致缓存失效,这个跟线程切换是差不多的。
【 在 hgoldfish 的大作中提到: 】
: 协程调度的开销相对内核调度的开销低。但也算比较大的开销。因为有 cpu cache miss 还要保存恢复寄存器。
: 写大带宽 IO 程序最大的开销应该是陷入内核取数据,处理完成后,再次调用操作系统 API 把数据发送出去。收发数据都要陷入内核,即使是用上 mmap() 也是一样陷入内核。
: 现在 linux 的 io_uring 出来,有了这东东,可以做成不陷入内核了。这个才是王道。
: ...................
--
FROM 223.72.68.*