协程库libgo原理探究hook原理

博客介绍了协程的概念,将其比喻为状态机,阐述了协程如何在遇到阻塞操作如sleep时,通过hook函数避免线程挂起,而将任务状态保存在堆空间。同时,文中通过代码验证了协程中临时变量的存储位置,并指出协程在处理网络编程中的优势,特别是在处理异步I/O时能显著减少线程资源消耗。协程的应用场景主要在网络请求和高并发场景下。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:最近学习使用协程,网上搜索一番,大多是讲协程在多个任务间切换有多好用,可能是我功底太薄,愣是摸索了很久才搞懂。现在分享下新手学习心得。

 

结论:对称协程就相当于状态机,各个协程就是各个任务,执行到阻塞操作时,比如sleep,调度的线程并不是真的一头扎进sleep函数,然后线程挂起,而是将这个任务设置为挂起状态,然后线程返回,执行其他任务去了,等sleep的时间到了,再调度过来执行后面的代码。很显然,sleep已经不是原来的sleep了,这儿是使用了hook函数(见hook函数解释)。那线程返回了,那些临时变量怎么办?sleep后回来执行怎么恢复这些数据?这里协程把临时变量声明也hook了,这些临时变量被分配保存到了堆空间。线程返回时根本就没释放!当然,协程执行完了就释放了。

hook函数:大概就是底层函数实现的时候,第一句就是判断有没设置了hook函数,就一个函数变量,如果是NULL,那就啥事没有执行具体操作,如果设置了,那就先调用你设置的函数。所以hook可以用来做木马病毒,hook了键盘输入,你输入的东西先复制一份发出去再继续交给系统处理。当然,我们的远程桌面工具也是用这个原理做的,把你鼠标键盘的输入劫持住,不传入系统,传到远程的电脑去了。具体可参考这篇博客:https://www.cnblogs.com/unnamedfish/p/8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值