引言:
首先声明的是,进程和线程都是存储空间,只不过任务不同,所以也可以叫 进程空间,线程空间
进程 / 进程空间:
把程序从磁盘加载到内存中并运行的应用程序。是资源分配单位(也就是一个程序的所有资源都会分配给一个进程空间,每个进程都有自己独立的一块内存空间,这个空间就是一个资源单位),比如在Windows系统中,一个运行的xx.exe就是一个进程。
线程 / 线程空间:
Java中 线程是cpu执行调度的最小单位,golang中 协程是cpu执行调度的最小单位
二者关系:
- 线程是进程的子集,这点很重要,也就是说没有进程,你执行个鬼的线程
- 由于二者的分工不同,导致了线程空间一般都很小,资源易回收,上下文切换快,进程资源大,空间大,资源回收麻烦,不易上下文切换
- 进程空间负责程序(操作系统把磁盘的程序内容称为管程)的资源存储,为线程的命令执行提供环境、数据支撑(像jvm进程的堆,方法区),线程空间则是存储着要执行的命令,等待cpu来调度执行
- 线程之间共享进程中的资源(像jvm进程的堆,方法区)
- 一个进程至少一个线程,当然也有特例,比如Java进程至少两个线程(主方法和gc回收器)
- 如果两个进程间因时间片结束而进行上下文切换,那么认为是进程的上下文切换
- 如果不同进程的线程要进行上下文切换,那么认为是进程的上下文切换
- 如果同一个进程的两个线程进行上下文切换,那么认为是线程的上下文切换
【补充:】什么是上下文切换
【注:】有些文章说如果一个进程只有一个线程,也可以认为进程就是线程,这个意思我觉得是因为进程中仅仅包含一个线程子集,你如果指了进程就相当于指了线程,还望各位大佬多多指正