先来一组图片类比说明:非常形象具体!!!!
图.1.1
1.进程:
先给一个定义:进程是程序执行一次时的一个实例(类比于类与对象),每个进程都有一个独立的内存空间,进程实例会在内存空间保存包括程序计数器,寄存器,程序变量等参数的当前值,所以进程是分配系统资源(CPU时间片,内存等)的基本单位
1.1.进程的执行过程
再上一张图:
图.1.2
这张图形象生动的说明的CPU轮转执行进程的过程。
根据这张图我想不由的大家脑子里都蹦出了几个问题:
1.1.1.为什么需要轮转执行?
为了解答这个问题我们需要知道一个基本的事实前提:一个CPU在一个瞬间只能处理一个任务(硬件设计时就限制了),所以按照这个思路,如果CPU不轮转执行进程就会出现例如你只能听歌不能打游戏的问题,只要想想大家就知道这个体验有多差啦,所以为了解决这个问题,CPU轮转执行这个概念就被提出了(即CPU一个执行进程a一会执行进程b,参考上图),但是随之而来的问题就是进程执行一会停一会电脑用户不会还是感觉一卡一卡的吗?其实这个问题可以参考电脑屏幕的刷新率即帧率,即只要我们的CPU轮转的速度够快,我们用户就感觉不到,这样就“完美”的解决了用户感觉卡的问题。所以总结就是为了提高系统的交互性能和用户体验
1.1.2.什么是上下文?
其实所谓的进程上下文,就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容,当内核需要切换到另一个进程时,它 需要保存当前进程的所有状态,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,继续执行(其实就是为了解决轮转时告诉进程在执行流程的哪个点继续执行)
2.线程:
先给定义:线程是进程的子集,一个进程可以包含多个线程,线程代表着进程中的一个指令流(即执行流),是系统任务调度和执行的基本单位。
从定义可以看出线程其实就是更小的单位,那按道理说有了进程之后就已经实现多任务处理和资源管理的目的。
2.1.为什么还要提出线程呢?
我们从图1.2可以看出进程间的切换需要加载上下文,但是在实际的开发中可能因为这个加载速度(还有进程创建销毁开销大,速度慢)导致整个系统响应速度过慢,影响用户体验。所以提出了线程的概念,线程被设计成进程的一个执行路径(参考图1.3),同一个进程中的线程共享进程的资源,因此系统对线程的调度所需的成本远远小于进程。
3.那线程和进程的关系
图1.3
进程与线程的区别总结:
本质区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。
包含关系:一个进程至少有一个线程,线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
资源开销:每个进程都有独立的地址空间,进程之间的切换会有较大的开销;线程可以看做轻量级的进程,同一个进程内的线程共享进程的地址空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。
影响关系:一个进程崩溃后,在保护模式下其他进程不会被影响,而线程只是一个进程中的不同执行路径。进程有自己的堆栈和局部变量,但线程没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程要比多线程健壮。