浅谈进程、线程和协程三者之间的区别和联系
一、进程、线程、协程
1,进程
经典定义:一个执行中程序的实例。系统中的每个程序都运行在某个进程的上下文中。(-摘自 CSAPP)
进程是系统资源分配的最小单位
2,线程(thread)
线程就是运行在进程上下文中的逻辑流。
线程是操作系统能够进行运算调度的最小单位。
3,协程
相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。
根据维基百科对子例程的描述:是一个大型程序中的某部分代码,由一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。我可以将子例程理解为一个函数。
4,区别和联系
首先,进程提供给应用程序的关键抽象为:
- 一个独立的逻辑控制流:它提供一个假象,好像我们的程序独占地使用处理器。
- 一个私有的地址空间,它提供一个假象,好像我们的程序独占地使用内存系统。
从以上描述我可以看出,一个进程是一个独立进行的任务,它占用的系统资源有:地址空间,全局变量,文件描述符,硬件资源等。
进程出现的目的,是为了更好的利用CPU资源。例如:
假设有两个任务A和B,当A遇到IO操作,CPU默默的等待任务A读取完操作再去执行任务B,这样无疑是对CPU资源的极大的浪费。若在任务A读取数据时,让任务B执行,当任务A读取完数据后,再切换到任务A执行,这样就可以更好地利用CPU资源。这里的切换涉及到状态的保存,状态的恢复,需要有一个东西去记录任务A和任务B分别需要什么资源,怎样去识别任务A和任务B,这时进程就出现了。
因此,通过进程来分配系统资源,标识任务。
如何分配CPU去执行进程称之为调度,进程状态的记录,恢复,上下文切换(简称切换)。
其次,若上面提及的任务A是一个文本程序,需要接受键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。
二、小结
核心只有一个,线程是操作系统调度,协程是用户态调度。
协程不必须是语言集成,例如C语言可以用setjmp/longjmp实现,也可以自己通过改变esp指针换栈实现协程。协程本身跟高吞吐没任何关系,基于io多路复用+回调就可以实现高并发和高吞吐。引入协程是为了将回调逻辑变成线性同步逻辑。
参考资料
进程、线程、轻量级进程、协程与 go 的 goroutine【转载+整理】

您的资助是我最大的动力!
金额随意,欢迎来赏!

本博客的所有打赏均将用于博主女朋友的化妆品购买以及养肥计划O(∩_∩)O。我是【~不会飞的章鱼~】!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架