文章目录
7.并发相关概念总结(程序/进程/线程、并行/并发、同步/异步、死锁/避免、线程安全/三大特性)
7.1程序、进程与线程
- 程序是静态的概念,windows下通常指exe文件,即可执行文件。
- 进程
- 定义:进程是动态的概念,是程序在运行状态,进程说明程序在内存中的边界。
- 内存:每个进程拥有不同的内存空间(例如:打开多个记事本)
- 开销方面:每个进程都有独立的代码和数据空间(程序上下文),进程之间的切换会有较大的开销
- 线程:
- 定义:线程是进程内的一个"基本任务",每个线程都有自己的功能,是CPU分配与调度的基本单位。
- 内存:对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源
- 开销方面:每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小
7.2并行和并发
- 并行:多个处理器(或者多核的处理器)同时处理多个不同的任务(物理上同时发生);
- 并发:一个处理器同时处理多个任务(逻辑上同时发生);
举例:像我们去⾷堂打饭,并⾏就是我们在多个窗⼜排队,⼏个阿姨同时打菜;并发就是我们挤在⼀个窗 ⼜,阿姨给这个打⼀勺,又⼿忙脚乱地给那个打⼀勺。
7.3同步和异步
- 同步(阻塞模式):
- 定义:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
- 举例:当客户端发送请求给服务端,在等待服务端响应的请求时,客户端不做其他的事情。当服务端做完了才返回到客户端。
- 异步(非阻塞模式):
- 定义:异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。
- 举例:客户端发送给服务端请求时,在等待服务端响应的时候,客户端可以做其他的事情,这样节约了时间,提高了效率。
- 小例子:
- 比方说一个人边吃饭,边看手机,边说话,就是异步处理的方式。
- 同步处理就不一样了,说话后在吃饭,吃完饭后在看手机,必须等待上一件事完了,才执行后面的事情。
7.4什么是死锁?如何避免?
- 定义:死锁(Deadlock)是指多个进程/线程同时被阻塞 ,它们中的 一个或者全部都在等待 某个资源被释放 。由于进程/线程被无限期地阻塞,因此程序不可能正常终止。
- 四个必要条件
- 互斥(x):资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放。
- 请求并保持: 进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分配到的资源。
- 非抢占: 进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程资源释放
- 循环等待(资源有序分配,即标序号):在发生死锁时必然存在一个进程等待队列{P1,P2,...,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,...,Pn等待P1占有的资源,形成一个进程等待环路,环路中每一个进程所占有的资源同时被另一个申请,也就是前一个进程占有后一个进程所深情地资源。
- 破坏死锁:那么避免死锁问题就只需要破环其中一个条件就可以,最常见的并且可行的就是 使用资源有序分配法,来破环环路等待条件 。
- 例如:进程PA,使用资源的顺序是R1,R2;
进程PB,使用资源的顺序是R2,R1;
若采用动态分配有可能形成环路条件,造成死锁。
采用有序资源分配法:R1的编号为1,R2的编号为2;
PA:申请次序应是:R1,R2
PB:申请次序应是:R1,R2
- 例如:进程PA,使用资源的顺序是R1,R2;
7.5何为线程安全?以及三大特性
在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
所谓线程安全,主要体现在三方面:原子性、可见性和有序性。
- 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。(synchronized、lock)
- 可见性:一个线程对主内存的修改可以及时被其他线程看到。(volatile)
- 有序性:一个线程观察其他线程的指令执行顺序,由于在JMM中允许编译器和处理器对指令重排序,因此该观察结果一般杂乱无序。(volatile)