【操作系统】死锁、活锁、自旋锁

死锁 :指两个或多个进程因互相持有对方所需的资源而处于等待状态,从而导致程序停止运行的现象。简单来说,在一个系统中,如果进程之间形成了一个循环依赖关系,那么就会发生死锁。
四个必要条件
互斥: 同一时刻只能有一个进程占用资源,如果其他进程想要访问该资源必须等待

占有等待:进程已经持有了至少一个资源,并且正在等待其他资源。这意味着当一个进程被阻塞时,它仍然在持有至少一个资源

不可抢占:资源不能被强制性地释放,只能由占用它的进程主动释放

循环等待:存在一个等待循环队列,其中每个进程都在等待下一个进程所持有的资源

活锁:指线程无法取得需要的资源而一直重试的现象。与死锁不同,活锁中的线程不会被阻塞,它们会一直尝试获取资源,但是却一直失败,最终导致程序无法正常执行。
举个生活中的小例子,两个人相向过马路,如果两人同时向一边谦让,那么两个人都过不去,紧接着两人同时又移到另一边,此时两个人依然过不去。 如果不受其他因素干扰,两个人一直在同步移动,那么最终的结果就是两个人都没有前进,产生了活锁 (这个词很形象,两个人都被对象活活地锁住了)

死锁:多个进程拿住资源不放手。
活锁:多个进程同时松开资源,又同时请求资源,依然造成阻塞。就像两个人相对着走,同时向同一边跨一步让行,结果还是对着。

处理方法

  1. 引入随机性

在代码中引入一定的随机性可以避免发生活锁,例如在重试的过程中,引入随机的休眠时间来中断死循环,让线程有机会释放资源并且重新获取资源。

  1. 引入系统时间戳

通过比较系统时间戳来决定线程是否需要继续等待,因为多个线程获取到的时间戳 (系统时钟)不可能完全一致,可以在时间戳的基础上进行优先级排序,最后通过排序后的线程顺序进行调度。

自旋锁:是一种互斥锁的实现方式,当线程尝试获得一个锁时,如果发现这个锁已经被其他线程占用,它会不断地重复尝试获取锁,而不是放弃 CPU 的控制权。这个过程被称为自旋,它能够有效地减少线程切换的开销,提高锁的性能。 自旋锁同时避免了进程上下文的调度开销,因此对于短时间内的线程阻塞场景是有效的。

你可能感兴趣的:(操作系统真象还原,java,服务器,jvm)