进程?线程?协程?

进程和线程的关系?

线程是进程中的一个实体,线程本身是不会独立存在的。进程是操作系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。操作系统在分配资源时是把资源分配给进程的,但是CPU比较特殊,它是分配给线程的,因为真正要占用CPU运行的是线程,所以也说线程是CPU分配的基本单位

在Java中,当我们启动main函数时其实就启动了一个JVM的进程,而main函数所在的线程就是这个进程中的一个线程,也称主线程

进程和线程的关系图如下

 由图可知,一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器和栈区域

堆、方法区、程序计数器和栈的内容属于JVM 的内存布局(内存结构)的知识,可以查看我的另一篇博文——JVM--内存结构,谢谢

协程?

协程就像非常轻量级的线程。线程切换或线程阻塞的开销都比较大。协程依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无代价的,协程是由开发者控制的。所以协程也像用户态的线程,非常轻量级,一个线程中可以创建任意个协程

协程占用的内存小,大概1-2KB左右,线程占用内存大概1MB。

理解线程上下文切换

  在多线程编程中,线程个数一都大于CPU个数,而每个CPU同一时刻只能被一个线程使用,为了让用户感觉多个线程是在同时执行的,CPU资源的分配采用了时间片轮转的策略,也就是给每个线程分配一个时间片,线程在时间片内占用CPU执行任务。当前线程使用完时间片后,就会处于就绪状态并让出CPU让其他线程占用,这就是上下文切换,从当前线程的上下文切换到了其他线程。那么就有一个问题,让出CPU的线程等下次轮到自己占有CPU时如何知道自己之前运行到哪里了?所以在切换线程上下文时需要保存当前线程的执行现场,当再次执行时根据保存的执行现场信息恢复执行现场。

线程上下文切换时机有:当前线程的CPU时间片使用完处于就绪状态时,当前线程被其他线程中断时。

 参考

《Java并发编程之美》翟陆续

posted @ 2021-02-02 10:23  JustJavaIt  阅读(98)  评论(0编辑  收藏  举报