线程、进程与协程

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

进程 VS 线程

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

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

区别主要如下

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

协程是啥

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

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

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

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

上下文切换是指?

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

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

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

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

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

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

相关推荐

能干的三文鱼刷了10...:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
10
73
分享

创作者周榜

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