1.为什么要有线程
明明多进程已经很好的实现了并发编程的效果,为什么还要引入线程?
因为进程有一个明显的缺点:太重了!!!(消耗资源更多,速度更慢)
如果进程创建销毁不频繁还好,一旦需要大规模频繁的创建和销毁,开销(给进程分配的资源)就比较大(需要申请和释放资源)
所以引入了轻量级进程,也就是线程,更高效的解决上述问题
2.线程的概念
- 一个进程至少要包含一个线程,最初创建出来的可以视为是一个只包含一个线程的进程(由于此时创建的过程需要分配资源,所以第一个线程的创建开销可能比较大)
- 其实创建的还是进程,在创建进程的时候,把资源都分配好,后续创建的线程都在进程内部,可以认为是进程包含了线程,并且后续创建的新的线程,直接复用前面进程里创建好的资源即可,就可以省略分配资源的过程,资源已经有了
- 这个进程中的多个线程,共同复用了进程中的各种资源(内存,硬盘...)
- 线程同样也是通过PCB来描述的,此时一个PCB对应一个线程,多个PCB对应一个进程
- 这些线程各自独立在CPU上进行调度(状态,上下文,优先级,记账信息......各有各的一份),即线程是系统调度执行的基本单位
- 同一个进程的多个PCB中,内存指针和文件描述符表的内容是一样的,但状态,上下文,优先级,记账信息......等支持调度的属性是不一样的
- 当然不是说创建线程一点资源都不消耗,只是比创建进程更轻量而已
- 线程太多的时候,线程调度的开销也会降低整个程序的效率
- 举个例子: 在一张只能容纳8个人的桌子上,有十个人入席,那就只能这八个人先吃,吃完才能挤出位置给后面的人,而且这八个人吃的时候可能会因为太挤而不好夹菜,所以这个效率肯定不如只有八个人高,降低了整体的效率
- 就比如:一个CPU的逻辑核心数是一定的,如果线程的数量超过了内核的核心数,那么效率就不会提高,并且线程调度的开销会更大
3.线程和进程的工作原理
举个简单的例子,如果一个工厂里只有一个车间,为了提高收入,工厂会增加车间
下面分别按多进程和线程的方式来展示工厂的操作方式
3.1 进程
按照多进程的方式,是又建造了其它工厂及车间,由此来提高目的.
3.2 线程
对于线程来说,只是在原有的工厂里增加了一个车间,开销较小,比进程更轻量.
4.线程的安全问题
4.1 问题一
举个例子:
此时,有两个人看上了同一条鱼,这两个人就可能去争抢,就会发生冲突
就比如多个进程同时去访问同一个变量,就会出现线程不安全的问题
但是多进程就不存在这个安全问题,因为每个进程已经分配了独立的地址空间
4.2 问题二
举个例子:
还是刚刚问题一的情况,如果当这两个了起了冲突,没人成功劝阻,这时其中一个人不乐意了,就想着我不吃,谁都别想吃,直接把桌子给掀翻了
就比如一个线程一旦抛出异常,没有及时处理,就可能会导致整个进程异常结束
5.线程和进程的区别与联系[面试题][重点]
- 进程包含线程,一个进程里至少包含一个线程,也可以包含多个.
- 多进程和多线程都是为了实现并发编程的方式,线程是轻量级进程. 创建线程比创建进程更快. 销毁线程比销毁进程更快. 调度线程比调度进程更快.
- 进程是系统分配资源的基本单位,线程是系统调度执行的基本单位.
- 进程比线程更安全. 进程有独立的地址空间,彼此之间不会相互影响到,即进程具有独立性,保证了系统的稳定性. 但是多个线程共用一份地址空间,多个线程之间容易相互影响,一个线程一旦抛出异常,就可能会导致整个进程异常结束,所以进程比线程更安全.