进程和线程(2)
线程:
1.前面提到了进程,但是进程是一个比较“重”的概念。
因为在创建/销毁进程,开销是很大的。(尤其当我们需要频繁的创建/销毁进程)
为了解决上面的问题,我们引入线程(Thread),线程也是轻量级的进程(线程的创建和销毁开销更小)
1)进程中,每个进程都相当于是一个执行的任务。
2)线程中,每个线程也是一个执行的任务(运行的一段代码的指令)
3)每个进程中,都会包含多个线程
2.进程是操作系统资源分配的基本单位(cpu,内存,硬盘资源(文件描述符),网络带宽等资源)
进程内部中管辖的多个线程,这写线程会共享上面的内存资源,硬盘资源和网络带宽。
通俗的说:进程就像吃火锅,线程就像火锅餐桌的人,资源就是火锅,你是吃不到别桌的火锅。
线程的创建和销毁:
首先,我们知道进程的创建和销毁是重量级的事情。
1.对于线程来说:只有第一个线程创建的时候(和进程一起创建)一起申请资源。
后续再创建线程:不涉及到资源申请操作(干的事少,但快)
只有所有线程都销毁时,才能真正的释放资源(单独销毁某一个线程,不会释放资源)
2.对于进程来说:进程和进程之间,所涉及到的资源是各自独立的,彼此之间互不干扰(稳定性)。
线程调度:
每一个线程中,都有一份数据(其中包括线程状态,线程优先级,线程的记账信息和线程的上下文),如果一个进程里面有10个线程,就会有10份这样的数据。但是这10个线程共用一份(文件描述符表和内存指针)
线程在CPU上执行的这一系列过程,即线程调度,和前面讲的进程调度是一样的。
线程是CPU调度执行的基本单位:一个进程包含了多个线程,此时多线程之间,各自都会去CPU上调度执行。
比如:一个进程中有:线程1,线程2,线程3。他们在CPU上执行时有多种可能
注意:具体哪一线程去哪个核心执行并不是固定的。
***线程安全问题:
在一定限制内,线程越多,整体的效率能够大幅度提高,节省了CPU的开销。
比如上面吃火锅的例子:一个人吃一盆火锅的效率肯定慢于几个人吃火锅的效率;
但是如果吃火锅的人越多越快吗?那如果来一千个人吃一盆火锅,这样就会导致有的人吃不到,有的人又能吃到,就会增加竞争,同时火锅店也不一定能装下这一千人。所以效率也就不快反慢了。
线程也是如此,当线程数目达到一定程度后,就算线程再多,也没法起到效果了。还会拖慢效率,线程调度开销也会非常明显,从而拖慢程序的性能。
最重要的一个问题:当线程数目很多,可能导致多个线程并发访问共享资源且访问共享资源从而引发*线程安全问题。
进程和线程的区别:
1.进程是包含线程的,且一个进程中至少包含一个线程,即包含一个主线程。
2.进程和进程之间是不共享内存空间的,只有在同一进程中的多个线程之间才共享同一个内存空间。
3.进程是CPU资源分配的最小单位,线程是CPU执行调度的最小单位。
4.因为进程和进程之间是互相独立的,所以一个进程挂了一般不会影响到其他的进程。
但是在同一个进程中,一个线程挂了,就有可能把该进程中的其他线程一并带走(整个崩溃)