对线程、协程和同步异步、阻塞非阻塞的理解
线程、协程#
参考文章:goroutine 和线程的区别
对比项 | 线程 | 协程 |
---|---|---|
内存消耗 | 1M | 2K,自动扩容 |
创建销毀 | 内核级 | 用户级 |
切换 | 需保存恢复 16 个通用寄存器、4 个段寄存器 16 个 XMM、16 个 AVX、PC、FP、SP |
需保存恢复 PC、BP、SP |
(耗时) | 1000-1500 纳秒 | 200 纳秒 |
同步异步、阻塞非阻塞#
当应用程序通过系统调用向操作系统发起请求时,此时:
- 应用程序是调用者
- 操作系统是执行者
阻塞非阻塞是针对调用者而言的:
- 阻塞是死等结果
- 非阻塞是发出请求后干别的,后续取结果
同步异步是针对执行者而言的:
- 同步是收到请求 -> 处理请求 -> 返回结果
- 异步是收到请求立即返回 ok-> 处理请求 -> 异步通知结果
所以个人觉得用 “同步异步、阻塞非阻塞” 来描述网络模型是非常容易产生混淆的,不如用 IO 复用、信号驱动 IO 来描述,参考简述同步 IO、异步 IO、阻塞 IO、非阻塞 IO 之间的联系与区别
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: