- 论坛徽章:
- 0
|
回复 40# yulihua49
栈用于保存状态,一个业务没有完成,栈如何回收?
线程数量有限,业务数量远超线程数量,所以,当fiber(承载一个业务)得到I/O事件后,fiber获取一个线程开始执行。
比如, aio_send( callback ); (伪码)发起异步I/O,I/O由系统完成,调用callback回调函数,在这个callback函数里,继续fiber的工作。
在fiber未完成业务之前,栈无法回收。
比如,一个业务函数:
void biz(...)
{
aiop op;
char buff[100];
int len;
op = a_recv(buff, 100);
async_wait(op); /// *
op = a_send("ok", 2);
async_wait(op); /// **
}
在*和**处,fiber放弃线程,进入“等待I/O完成”的状态,此时,执行线程(可能是在回调,也可能是在线程池)的函数返回。
此时,fiber栈必须保留,因为异步I/O要用到那些内存,比如buff[100]这块内存,被异步a_recv函数填充。
我认为,异步过程(如这个biz函数)编程时注意一下,不要使用过多栈,如果要用,就用malloc分配。就是使用上注意一下就可以了。
我现在只用 4K~16K之间。
|
|