请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

协程、用户级线程、内核级线程这三个概念的区别?

老师, 请问协程、用户级线程、内核级线程这三个概念有什么关联和区别呢?网上有说协程就是用户级线程的, 感觉概念还是不太清晰.

正在回答

1回答

可以简单的理解为函数,一个个函数调用不会涉及到底层的线程,也就是一个线程就可以完成多个函数的调用和切换,总结一下函数和线程都会存在的缺点:

    1. 函数无法中断,如果 一个函数中有阻塞的方法,那么这个函数不能中断就会造成整个所有任务全部阻塞

    2. 线程切换是有操作系统创建和切换的,相比进程而言已经轻量级了,但是对比函数的切换和调用,线程还是远大于函数的消耗

所以综上所述:1. 函数写法简单,但是不能中断满足不了我们多个任务的并发, 2.线程消耗太大,并发也上不去 

所以就提出了一个概念-“有没有一种方法可以兼顾这两者的缺点,又可以解决两者的缺点呢”- 这就是协程


但是协程如果想并发就一定会存在一个调度的问题,这点和线程很相似,但是以前写函数觉得非常方便,我们既然要设计新方案那么可以像写普通函数那样简单吗?所以我们设计的时候希望像普通函数那么简单,所以最后我们看到了协程的形态 - 既不像函数那么简单,也没有像线程那么复杂,这个也是没有办法的事情,但是协程加大的理解难度。

为什么协程会加大理解难度呢?

    1. 以前线程都是交给操作系统调度的,所以很多时候我们不关心是如何调度的,这就造成很多人觉得线程好像比协程简单,其实不是简单,其实线程的调度远比协程简单,只是这些调度工作交给操作系统做了,我们的工作也就集中在线程同步和通信上了

    2. 协程不一样,我们很多时候没法避免协程的调度原理,因为操作系统不管了,所以协程的调度也就交给我们的库去做了,所以理解这个问题就变得让我们很疑惑,协程到底是什么?这是因为我们已经习惯了线程的写法了,所以很多人就不想去理解协程的调度过程,但是因为协程的怪异写法和注意点导致了很多时候我们不得不去理解调度原理,但是实际上协程的原理比线程简单很多

    3. 协程之所以能实现主要还是因为事件循环,基本上所有语言的协程底层都是事件循环,也就是我们课程中讲解到的epoll,所以要先理解这个

0 回复 有任何疑惑可以回复我~
  • 提问者 慕粉1946152704 #1
    老师, 我理解了协程主要是把调度交给了用户, 而且实现了异步, 所以这和同步的线程是有区别的. 操作系统课上老师也说用户级线程的调度是在用户态实现的, 不是在内核态实现的, 这个感觉和您讲的协程很像, 这两个概念是不是一个东西我不态确定, 所以想和老师确认一下?
    回复 有任何疑惑可以回复我~ 2019-11-15 11:06:51
  • bobby 回复 提问者 慕粉1946152704 #2
    协程就是一种用户态线程的具体实现, 一般的普通的线程都是要操作系统支持的,这种也叫内核态线程
    回复 有任何疑惑可以回复我~ 2019-11-18 14:29:00
  • 提问者 慕粉1946152704 #3
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-11-18 14:50:02
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信