一个C/C++协程库的思考与实现之协程栈的动态按需增长

https://github.com/DoasIsay/ToyCoroutine

如何检测协程是否需要进行栈扩充?

我们先思考一个问题,glibc的pthread_create创建的线程是如何检测到用户栈的溢出而及时终止线程的?

如下代码

g++ test.cpp -lpthread

strace ./a.out 结果如下图

 

由strace 结果可知pthread_create先使用mmap为线程申请了的用户空间stack,然后使用mprotect对stack的栈顶进行保护,即栈顶的4kb无读写权限,一旦被读写就说明产生了栈溢出,操作系统就会向读写此4kb的任务发送SIGSEGV信号,最后才是调用clone创建线程

如果越过这4kb访问前面的内存会怎样?如果刚好是另一个线程的stack?只要不访问这4kb或其它线程的这4kb都不会有问题,顶多就是会破坏其它线程的栈,或自已的栈被其它线程破坏,然后进程core掉,,&#

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
orchid是一个构建于强大的boost基础上的C ,类似于python下的gevent/eventlet,为用户提供基于程的并发模型。 程,顾名思义,作式程序,其思想是,一系列互相依赖的程间依次使用CPU,每次只有一个程工作,而其他程处于休眠状态。程在控制离开时暂停执行,当控制再次进入时只能从离开的位置继续执行。 程已经被证明是一种非常有用的程序组件,不仅被python、lua、ruby等脚本语言广泛采用,而且被新一代面向多核的编程语言如golang rust-lang等采用作为并发的基本单位。 程可以被认为是一种用户空间线程,与传统的抢占式线程相比,有2个主要的优点: 与线程不同,程是自己主动让出CPU,并交付他期望的下一个程运行,而不是在任何时候都有可能被系统调度打断。因此程的使用更加清晰易懂,并且多数情况下不要锁机制。 与线程相比,程的切换由程序控制,发生在用户空间而非内核空间,因此切换的代价非常的小。 green化 术语“green化”来自于python下著名的greenlet,指改造IO对象以能和程配合。某种意义上,程与线程的关系类似与线程与进程的关系,多个程会在同一个线程的上下文之中运行。因此,当出现IO操作的时候,为了能够与程相互配合,只阻塞当前程而非整个线程,要将io对象“green化”。目前orchid提供的green化的io对象包括: tcp socket(还不支持udp) descriptor(目前仅支持非文件类型文件描述符,如管道和标准输入/输出,文件类型的支持会在以后版本添加) timer (定时器) signal (信号) chan:程间通信 chan这个概念引用自golang的chan。每个程是一个独立的执行单元,为了能够方便程之间的通信/同步,orchid提供了chan这种机制。chan本质上是一个阻塞消息队列,后面我们将看到,chan不仅可以用于同一个调度器上的程之间的通信,而且可以用于不同调度器上的程之间的通信。 多核 建议使用的scheduler per cpu的的模型来支持多核的机器,即为每个CPU核心分配一个调度器,有多少核心就创建多少个调度器。不同调度器的程之间也可以通过chan来通信。程应该被创建在哪个调度器里由用户自己决定。 进一步信息请阅读doc目录下tutorial。如果您发现任何bug或者有任何改进意见,请联系[email protected] 标签:orchid

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值