并发与并行、串行
明显区别
串行指只能进行一件事之后才能做另一件事,会发生阻塞情况,比如一个系统只能支持一个设备在线,这是有一个设备一直在线,另一个设备只能等那个设备下线之后才能上线,这时在线的设备一直不下线,后面的设备就无法上线,效率不高。

并发指在一个地点里可以做多件事情 强调可以发、交替进行、在单处理器跟多处理器都可以存在,在单处理器也可以存在的原因是它是并行的假象,看似可以处理很多事,其实是将时间分成若干份进行事件分发进行
并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。并发可以帮助应用程序提高响应速度、减少等待时间并增加吞吐量。
我们可以充分利用多核处理器的性能优势以及多任务并发的方法来提高程序运行效率和响应速度。但是其实现实更普遍的情况我们可以独立地执行某些操作,但最终还是需要将这些操作所得到的部分结果进行归并才能得到完整的结果。

所以线程之间需要能够相互交换彼此的数据,并且有时候某些线程还需要等待其他线程的结果出来之后才能继续运行。于是我们就需要在线程之间进行协调,并由此引出同步和死锁等一系列令人头痛的问题。
比如两个线程都用同一个内存位置进行读写,比如a线程本来在A时间点结束到b线程执行,但是此时a线程却延后结束,这就导致内存不够a线程跟b线程处理,此时a线程只能等b线程处理完,b线程又在等a线程处理完,从而导致死锁问题

死锁问题
当然并不是所有时候都会出现死锁问题
死锁有四个必要条件
互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
说明:T1、T2表示两个任务;R1和R2表示两个资源;由资源指向任务的箭头(如R1->T1,R2->T2)表示该资源被改任务所持有;由任务指向资源的箭头(如T1->S2,T2->S1)表示该任务正在请求对应目标资源;

其满足上面死锁的四个必要条件:
(1).互斥:资源S1和S2不能被共享,同一时间只能由一个任务使用;
(2).请求与保持条件:T1持有S1的同时,请求S2;T2持有S2的同时请求S1;
(3).非剥夺条件:T1无法从T2上剥夺S2,T2也无法从T1上剥夺S1;
(4).循环等待条件:上图中的箭头构成环路,存在循环等待。
死锁处理方法:
(1). 根据2中提供的sql,查看那个spid处于wait状态,然后用kill spid来干掉(即破坏死锁的第四个必要条件:循环等待);当然这只是一种临时解决方案,我们总不能在遇到死锁就在用户的生产环境上排查死锁、Kill sp,我们应该考虑如何去避免死锁。
(2). 使用SET LOCK_TIMEOUT timeout_period(单位为毫秒)来设定锁请求超时。默认情况下,数据库没有超时期限(timeout_period值为-1,可以用SELECT @@LOCK_TIMEOUT来查看该值,即无限期等待)。
当请求锁超过timeout_period时,将返回错误。timeout_period值为0时表示根本不等待,一遇到锁就返回消息。设置锁请求超时,破环了死锁的第二个必要条件(请求与保持条件)。
(3).选择一条SQL作死锁牺牲品:运行完上面的两个查询后,我们会发现有一条SQL能正常执行完毕,而另一个SQL会报错,即选择运行回滚开销最小的事务的会话作为死锁牺牲品达到最小代价。
既然死锁出现之后的处理解决如此繁琐,那么如何避免死锁。上面中列出了死锁的四个必要条件,我们只要想办法破其中的任意一个或多个条件,就可以避免死锁发生,一般有以下几种方法
(1).按同一顺序访问对象。(注:避免出现循环)
(2).避免事务中的用户交互。(注:减少持有资源的时间,较少锁竞争)
(3).保持事务简短并处于一个批处理中。(注:同(2),减少持有资源的时间)
(4).使用较低的隔离级别。(注:使用较低的隔离级别(例如已提交读)比使用较高的隔离级别(例如可序列化)持有共享锁的时间更短,减少锁竞争)
(5).使用基于行版本控制的隔离级别:2005中支持快照事务隔离和指定READ_COMMITTED隔离级别的事务使用行版本控制,可以将读与写操作之间发生的死锁几率降至最低:
SET ALLOW_SNAPSHOT_ISOLATION ON --事务可以指定 SNAPSHOT 事务隔离级别;
SET READ_COMMITTED_SNAPSHOT ON --指定 READ_COMMITTED 隔离级别的事务将使用行版本控制而不是锁定。默认情况下(没有开启此选项,没有加with nolock提示),SELECT语句会对请求的资源加S锁(共享锁);
而开启了此选项后,SELECT不会对请求的资源加S锁。
并行指在一个时间点可以做多件事情 比如一栋教学楼有两个通道,学生可以从任意一个通道通过,两个通道不会因为哪个通道塞住了影响另一个
在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。效率很高,但是成本太高。

本文介绍了并发、并行和串行的区别,强调并发是利用时间分片实现多任务交替执行,而并行则是在多处理器系统中同时处理多个任务。还探讨了线程间的数据交换、同步问题以及死锁的产生条件和解决策略,包括设置锁超时、选择死锁牺牲品以及避免死锁的方法。

761

被折叠的 条评论
为什么被折叠?



