进程本质上就是程序的一次执行过程,是操作系统中资源分配和调度的基本单位。 其中进程所分配的资源(即内存分配)主要有:
- 只读段 :包括程序的二进制机器代码(代码段 text)、全局常量以及字符串常量(只读数据段radata)和编译初始化相关内容(init)
- 读写数据段:包括初始化数据段(初始化的全局变量和静态变量)和未初始化数据段(未初始化的全局变量和静态变量)
- 运行时堆:存放进程运行中被动态分配的内存段(比如new一个对象,对象实例存储在堆中),可动态调整大小
- 共享库的内存映射:共享库函数的硬盘存储位置和内存的映射关系
- 栈:程序运行中临时创建的局部变量(比如方法中定义的普通变量)
- 内核虚拟空间:包含内核态下的数据,代码等,如进程对应的数据结构(页表),内核态对应物理地址以及内核代码等。用户不可见。 其中堆和栈中间有未分配空间,以满足两者的动态调整空间大小。
线程是进程中执行运算的最小单位(线程是一个程序中实现单一功能的一个指令序列,是一个程序的单个执行流),是进程中的一个实体,一个进程中可以包含多个线程,是系统中独立运行和调度的基本单位。
其中线程拥有各自独立的独立的运行栈、程序计数器,共享进程的代码和数据空间。
由于线程所持有的系统资源少,所以调度时的开销比进程小(如切换时保存运行上下文环境)。
协程又称为微线程,是由线程创建的执行体,协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程,其是在用户态执行的,不需要进行用户态和内核态的切换,因而效率比较高。