线程和进程的概念
什么是进程?
正在运行中的应用程序,通常称为进程。每个进程都有自己独立的地址空间(内存空间),每当用户启动一个进程时,操作系统就会为该进程分配一个独立的内存空间,让应用程序在这个独立的内存空间中运行。
什么是线程?
线程是一个轻量级的子进程,是最小的处理单元;是一个单独的执行路径。线程可以理解成是在进程中独立运行的子任务。比如,QQ.exe 运行时就有很多的子任务在同时运行。像好友视频、下载文件、传输数据、发送表情等,这些不同的任务或者说功能都可以同时运行,其中每一项任务完全可以理解成是“线程”在工作,传文件、听音乐、发送图片表情等功能都有对应的线程在后台默默地运行
线程是独立的。如果在一个线程中发生异常,则不会影响其他线程。它使用共享内存区域。
看图就完事了
首先这是一段程序,它本身不会执行,就像是一个菜谱.
程序会由程序员写好放在硬盘中,就相当于食谱可能会放在抽屉里.
然后为了做这道菜,需要将食谱拿到桌子上然后按步骤做菜,这就相当于为了进行这个程序,CPU会从硬盘中读取程序到内存中,方便CPU读取,那这个在内存中的可执行程序实例就叫做进程,也就是进行中的程序.
这里还可以举一个例子,程序就代表某个流程,规定了先做什么再做什么。可以是打印出的一张白纸,可以是手机、电脑上的pdf,也可以就是领导的口头描述。而进程指的是进行中的程序。工作人员遵循程序(比如领导的话)开始做事,那做事这个过程就称为进程。事情做完了,进程就终止了。
一个程序如果多次读取到内存中,就会产生多个进程,就像是n次拿出一个菜谱那就会n次做这道菜;硬盘中多个程序读取到内存中进行时,自然也就创造了更多进程,就相当于拿出不同的菜谱就会做出不同的菜.
每个进程通常只有一个程序计数器,记录当前程序执行的位置,会按照程序顺序计算,这里一个执行流就是一个线程.如果有多个线程的话,就需要多个程序计数器.每个线程会独自运行.
除此之外,每个线程还有寄存器,堆,栈等程序运行时的状态信息.同时,线程间共享的则有地址空间,全局变量,打开的文件等等信息.
那为什么在进程中还要有更小的"进程"----线程呢?
假如这是一个文档编辑器,自然就是一个进程,里面存放着相应的程序和文档.此时用户在第二行末打一个回车,我们需要交互的程序接受键盘的按下事件,
然后,布局的程序将文字重新计算位置,再把他们渲染出来.另外,每隔一段时间,需要写入的程序保存文档在硬盘中.
这三个程序最好是同时并行,但它们有需要访问修改同一个文档,所以肯定是在同一个进程中的.所以这时需要更轻量级的三个线程.
现在我们了解到线程是并行的最小单位.假如现在计算机只有一个单核CPU,也就是一次只能执行一个线程,那就需要对每个线程轮流执行,每次单个计算时间成为一个CPU时间片,实际只有几十毫秒,用户根本感觉不到.
然后对于线程来说,存在等待CPU的时候,称为就绪状态,一旦CPU过来执行,就变成运行状态.
当CPU转而执行其他线程时,线程就又变为就绪状态.假如线程正在执行中,程序向硬盘发送访问请求,然后等待,这时CPU就变成空转了,所以线程变成阻塞状态,CPU转而执行其他线程.等到硬盘的数据回复,程序又将从阻塞状态转变为就绪状态,等待CPU的再次光临,然后继续执行.
那如果是多个CPU,确实可以让多个线程真正的并行计算.但是往往线程会很多,所以还是需要时间片轮转.那么为了简化CPU在内核中为每个线程提供各自的虚拟CPU,每个线程会认为自己一直独占CPU,它们就不用考虑时间片轮转问题了.
.
结语
总结一下,进程就相当于程序运行的过程;而线程是用于实现每个过程或是实现其中的的一小部分.线程存在的主要目的是实现同时并行,所以线程里放的所有方法不一定是实现一个功能的也可能是实现不同功能的,因为主要还是实现同时并行.而在线程中又有方法区,堆栈,程序计数器等来完成其中内容的实现.