文章目录
- 1.为什么会引入进程和线程的概念
- 2.进程和线程的关系
- 2.1 坤坤吃鸡演示进程和线程区别
- 2.1.1 线程的安全问题
- 2.1.2 线程的异常问题
1.为什么会引入进程和线程的概念
引入进程这个概念,最主要的目的是为了解决并发编程这样的问题。
CPU 已经进入了多核心的时代,要想进一步提高程序的执行速度,就需要充分利用 CPU D多核资源。
其实,多进程编程已经可以解决并发编程问题了,这说明已经可以利用起CPU资源了。
但是不好的地方是,进程太重了(消耗的资源多、速度慢)
当创建一个进程、销毁一个进程、调度一个进程时,它的开销会比较大。
这里说的太重了是指在资源分配和回收上执行的效率太慢了,消耗的资源多。
鉴于上面的情况,线程应运而生。
线程把申请资源和释放资源的操作给省下来了。
在解决并发编程的前提下,让创建、销毁、调度的速度更快一些。
因此线程也叫 “轻量级进程”。
举个例子来演示进程和线程概念:
现在有一个工厂要加工一些产品。
此时由于销量比较大,需要将厂子扩建一下。
有两种方案可选。
方案1:再租一块场地,在搞一套设备。
方案1就是多进程的方案。
方案2:在原来的场地里,再搞一套生产设备线
方案2就是多线程的方案。
很明显方案2要比方案1成本小很多,因为场地和物流体系都可以复用之前的。
此时,在搞第一套生产线的时候,需要吧资源申请到位。
后续追加新的生产线的时候,复用之前的资源即可。
由此可以看出,线程之间资源是共享的。
2.进程和线程的关系
进程包含着线程。
一个进程可以包含一个线程,也可以包含多个线程,但是不能没有。
只有第一个线程启动的时候开销是比较大的,后续的线程就省事了。
同一个进程里的多个线程之间,共用了进程的同一份资源。
这里的资源指的是,内存和文件描述符表。
- 第一个线程创建的对象,进程里的其他线程可以直接使用。
- 第一个线程打开的文件,其他的线程都可以直接使用。
如果一个进程有多个线程,每个线程是独立在CPU上调度的,即线程是操作系统调度的基本单位。
每个线程也都有自己的支持逻辑(执行流)
2.1 坤坤吃鸡演示进程和线程区别
有一个坤坤要吃100只鸡
如果是采用多进程的方式吃鸡:
现在有两个坤坤,两个房间、两个桌子,此时的成本会比较高。
如果是采用多线程的方式吃鸡:
现在增加一只坤坤即可。
两只坤坤同时吃鸡,不需要增加桌子和房间,效率提升的同时成本也减少了。
按照上面的逻辑,如果让更多的坤坤吃鸡,速度岂不是更快吗?
增加线程数量的时候,也不是可以一直可以提升速度的!!!
桌子的空间是有限的(CPU的核心数量也是有限的)
如果坤坤太多,大家挤来挤去,这就会导致正在吃的坤坤无法专心吃。
因此,线程太多,核心数目有限,不少的开销会浪费在线程调度上了。
2.1.1 线程的安全问题
多线程的情况下,多个坤坤共享一份鸡肉,此时就可能会打架。
大坤和小坤同时看上了一个一只鸡,都去吃,就可能会打起来。
在多进程中,不会出现这种情况,因为多进程里已经把鸡给分好了,自己吃自己的。
这就是线程的安全问题。(线程不安全)
2.1.2 线程的异常问题
大坤先把鸡给吃了,导致小坤吃不到了。小坤就会生气,你小坤哥就会把桌子掀了。
此时如果一个线程抛异常,如果处理不好,很可能把整个进程都给带走了。
其他的线程也就挂了。
多个执行流访问同一个共享资源的时候,就会有安全问题。
线程模型,天然就是资源共享的。
多线程争抢同一个资源(同一个变量),这时是非常容易触发安全问题的。
进程模型,天然是资源隔离的,不容易触发安全问题。
进行进程间通信的时候,多个进程访问同一个资源,可能就会出问题。