线程、进程与协程

『面试问答』:进程、线程和协程的区别是什么?

进程 VS 线程

进程是程序的一次执行过程,是操作系统进行资源分配和调度执行的基本单位。

线程是进程内的执行单元,是程序执行的最小单位。

区别主要如下

  1. 资源占用上进程是独立的执行单位,拥有独立的内存空间和系统资源,包括文件描述符、进程上下文等。而线程是进程内的实体,共享进程的资源,每个线程有自己的程序计数器、栈空间和私有数据
  2. 调度与切换代价进程切换需要保存和恢复的状态较多,开销较大;而线程的切换相对较轻量,只需要保存和恢复栈和寄存器的状态
  3. 通信与同步进程间通信需要使用操作系统提供的进程间同步机制:如管道、共享内存、消息队列等线程可以通过共享内存来进程数据交换与通信,同时也需要使用同步机制来避免竞态条件
  4. 独立性进程拥有独立的地址空间,一个进程奔溃后,在保护模式下不会对其他进程产生影响而线程共享进程的资源,一个线程的错误可能导致整个进程的崩溃

协程是啥

协程是一种用户态的,不被操作系统内核所管理,完全由用户控制的,比线程更加轻量级的存在;

一个进程可以由有多个线程,一个线程也可以有多个协程;

用户态执行,性能大大提升:线程的切换由操作系统负责调度,协程由用户自己进行调度,因此减少了上下文切换,提高了效率。

协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到线程的堆区,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以协程的上下文切换非常快。

上下文切换是指?

当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。

线程在执行过程中会有自己的运行条件和状态(也称上下文),比如程序计数器,栈信息等。

如下情况会出现上下文切换

  • 主动让出 CPU,比如调用了 sleep(), wait() 等。
  • 时间片用完,因为操作系统要防止一个线程或者进程长时间占用 CPU 导致其他线程或者进程饿死。
  • 调用了阻塞类型的系统中断,比如请求 IO,线程被阻塞。
重生之八股仙帝 文章被收录于专栏

曾有一千古奇人,精修八股文,成遁世之高人,彻天彻地畅游天地间。 今人皆忙忙,急于求成,岂不知八股乃道门口径,背负天人,若经熟读背诵,更能开拓智慧之门,探寻未来之路。 天下繁华,不尽长夜,唯有读书为伴,熟读八股文更是攀登高峰之路。磨砺文字,升腾智慧,唯有勤玉立志,始可破天荒,登临九重不竭之巅! 吾辈修炼之路,虽曲折荆棘,但信念不曾磨灭,唯有铭记八股精髓,方能指引灵魂归宿,成就一生辉煌!

全部评论
我上次答协程也是这么说的,面试官马上反问:协程跟线程的区别就这一个吗?
点赞 回复 分享
发布于 2023-09-04 14:56 北京
m
点赞 回复 分享
发布于 2023-09-03 18:47 陕西

相关推荐

## redis### 都用过哪些指令?具体一些我的项目中redis除了分布式锁的使用,就剩下一个验证码的存储了,所以我就说了加key、设置key过期时间的### 分布式锁的流程问:拿不到锁的业务怎么办?> 如果别的业务拿不到锁就会自旋or进入队列等待和超时。问:这样的话,会导致并发性能降低,有什么解决方法?> 我不会,瞎说的:用乐观锁和版本控制降低锁的颗粒度。这里同学告诉我setnx就是乐观锁TAT问:redis怎么实现乐观锁?> 依旧不会,于是让我讲了mysql的乐观锁## 项目拷打了很久的项目,甚至让我投屏演示项目,我的docker有个一直卡着没启动好,耽误了10分钟,而且我投屏投错了,让面试官看着空白划鼠标了5分钟,汗流浃背了,好在最后启动成功了,挑了一个接口让我详细讲下如何写的。### 服务发现&负载均衡用的consul和nacos实现的,我自己写了个轮训的算法实现负载均衡,问我还有什么算法,我答了加权,保持最小连接数,urlhash,iphash,最短连接时间### 链路追踪怎么实现的?怎么找到性能瓶颈怎么解决?用的Jaeger,当时死活想不起来叫什么。找到瓶颈后,如果是路由方面的瓶颈,尝试考虑扩容,如果是数据的瓶颈,尝试redis存储热点数据### 测试和保证系统稳定性怎么做的?用的接口管理平台,接口管理平台自带一个压测### grpc+protobuf相比传统的http+json优势在哪?grpc可扩展性很强,再多台服务器部署扩容几乎是无痛的,只要做好服务发现和负载均衡。而protobuf相比json传输效率和压缩性能更强### jwt相比cookie+session优势在哪?我只说出来了jwt的优势,没说出cookie+session的劣势。### 讲一下gmp?协程和线程的区别gmp我讲完后,觉得我只是解释了3个词语分别是什么,没有讲到精髓。我又补充了窃取g,以及p队列初始化和流程,下来查看笔记觉得少答了抢占式调度吧我提到协程锁用户级轻量的线程,切换性能更高,并发性更强,并且由用户调度,对内核无感## 实习经历问我了都做了什么?在实习的不同阶段都有什么不同收获,我没理解面试官的意思,把项目讲到比较细节的部分,他打断我说主要说阶段性的,以周或者月为单位。我就聊了下。## 总结依旧没有按照顺序写,想到什么写什么。拷打了很多项目,我发现我很多时候,用到了xx技术,只是单纯看的教程和找的代码用到了,并不清楚为什么要用,以及相比于同类技术的优缺点在哪,这也是我接下来一个思考的方向,面试官给到了一些压力,也让我认识到了我的不足,八股方面特别是redis的,感谢面试官。
查看12道真题和解析
点赞 评论 收藏
分享
12-03 16:15
门头沟学院 Java
查看14道真题和解析
点赞 评论 收藏
分享
评论
10
74
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务