临界区

操作系统中的互斥和JVM中的互斥

末鹿安然 提交于 2019-11-28 20:22:58
前几天再写synchronized的JVM实现时候,想起如果是2个线程同时想获得对象锁,即修改对象头的lock位时候,同时发现对象锁可用,同时修改lock的值,天了噜想想真是太可怕,想解决互斥却在解决方法中也有互斥的问题。后来发现: 任何互斥尝试必须基于一些基础硬件的互斥! 任何互斥尝试必须基于一些基础硬件的互斥! 任何互斥尝试必须基于一些基础硬件的互斥! 重要的话要说3遍!! 那我们来看看硬件的支持吧。 1、中断禁用 在单处理器中,并发进程不能同时执行,只能交替。因此要保证互斥,只需要保证一个进程不被中断就行,这种能力可以通过系统内核启用中断和禁止中断定义的原语实现。 禁用中断 临界区 启用中断 这种方法代价很高,因为处理器只能交替执行程序。还有个问题对于多处理器并没有什么用。 2、专用机器指令 在多处理器中,所有处理器都是共享内存。所以要保证互斥,在硬件级别上,对存储单位的访问要排斥对相同单位的其他访问。基于这一点,处理器设计者设计了一些机器指令,来保证两个动作的完整性,如我们喜闻乐见的compareAndSwap。 机器指令方法使用了忙等待。可能饥饿,导致某些进程无限期进入临界区。最重要的是可能产生死锁,假设进程P1通过CAS进入临界区,但是在临界区的时候被迫中断把处理器让给优先级别更高的P2,如果P2想使用同一资源,由于互斥机制,那么P2将永远无法进入临界区。

1 走进并行世界

老子叫甜甜 提交于 2019-11-28 19:21:30
需要知道的几个概念 同步(Synchronous)和异步(Asynchronous) 同步 方法调用一旦开始,调用者必须等到方法调用返回后,才继续执行后续行为。 异步 方法一旦开始,方法调用会立即返回,调用者就可以继续执行后续行为。而异步方法通常会在另外一个线程“真实”地执行,当这个异步调用真实完成时,则会通知调用者。 并发(Concurrency)和并行(Parallelism) 并发 偏重于多个任务交替执行,而多个任务之间有可能还是串行的。 并行 是真实意义上的“同时执行”。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。 阻塞(Blocking)和非阻塞(Non-Blocking) 阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其他需要这个资源的线程就必须在这个临界区中等待。等待会导致线程挂起,这种情况就是阻塞。 非阻塞的意思与之相反,它强调没有一个线程可以妨碍其他线程执行。所有线程都会尝试不断前向执行。 死锁(Deadlock)、饥饿(Starvation)和活锁(Livelock) 死锁、饥饿和活锁都属于多线程的活跃性问题。 死锁 :A、B、C、D四辆小车在这种情况下都无法继续进行,它们彼此之间都占用了其他车辆的车道

分布式系统中的互斥算法

♀尐吖头ヾ 提交于 2019-11-28 04:23:01
1分布式系统简介及优势 分布式系统是一种多处理器。各处理器通过互联网构成统一的系统。系统采用分布式计算结构,即把原来系统内中央处理器处理的任务分散给相应的处理器,实现不同功能的各个处理器相互协调,共享系统的外设与软件。通过与集中式系统的比较,分布式系统的优点主要体现在以下几个方面:(1) 能够实现资源共享。例如: CPU、存储设备等硬件资源、软件工具和软件环境等软件资源能被系统内所有主机使用。(2) 系统具有很快的反应能力。分布式系统将所接受的任何任务都会分配给其所支配的所有主机并行执行,因此它的响应时间就大大缩短了。(3) 伸缩性较强。是否能伸缩自如,与性能的好坏息息相关,对分布式系统进行缩减和扩充,灵活性和可扩展性高。(4) 适应范围较广。分布式系统可以适用于不同的环境,例如一些需要相互合作的工作,如事务处理、过程控制等。 2 互斥问题的产生 当有多个进程竞争系统中相同的资源时,互斥问题就产生了。一个正确的互斥算法必须避免冲突( 死锁和饿死) 和保证公平性。通常分布式操作系统使用的互斥算法有:集中式算法、分布式算法和令牌环算法。评价互斥算法性能的准则有(1)每次临界区请求所需要的消息的个数(2)响应时间(RT)(3)同步延迟(SD)。一个好的互斥算法应该是无饥饿,无死锁的。 3 三种传统算法 3.1 集中式算法 集中式算法借鉴了集中式互斥算法的思想,在分布式系统中

进程间通信之-----信号量

我怕爱的太早我们不能终老 提交于 2019-11-28 03:40:49
进程间通信简单的说有三个问题,第一个问题是:一个进程如何把信息传递给另一个,第二个问题是:要确保两个或者更多的进程在互动中不会出现交叉(即是进程互斥问题),第三个问题是:进程间同步问题、 四种进程或者线程同步互斥的控制方法 1):临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2):互斥量:为协调共同对一个共享资源的单独访问而设计的 3):信号量:为控制一个具有有限数量用户资源而设计 4):事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 临界区(Critical Section)   保证在某一时刻只有一个线程能访问数据的简便办法,在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开,临界区在被释放后,其他线程可以继续抢占,并以此达到原子方式操作共享资源的目的。   临界区包含两个操作原语: EnterCriticalSection() 进入临界区 LeaveCriticalSection() 离开临界区 虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。 互斥量(Mutex)   互斥量跟临界区很相似,只有拥有互斥量对象的线程才具有访问资源的权限,由于互斥对象只有一个

计算机操作系统 - 进程管理

牧云@^-^@ 提交于 2019-11-27 23:54:11
进程与线程 1. 进程 2. 线程 3. 区别 进程状态的切换 进程调度算法 1. 批处理系统 2. 交互式系统 3. 实时系统 进程同步 1. 临界区 2. 同步与互斥 3. 信号量 4. 管程 经典同步问题 1. 读者-写者问题 2. 哲学家进餐问题 进程通信 1. 管道 2. FIFO 3. 消息队列 4. 信号量 5. 共享存储 6. 套接字 进程与线程 1. 进程 进程是资源分配的基本单位。 进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。 下图显示了 4 个程序创建了 4 个进程,这 4 个进程可以并发地执行。 2. 线程 线程是独立调度的基本单位。 一个进程中可以有多个线程,它们共享进程资源。 QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。 3. 区别 Ⅰ 拥有资源 进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。 Ⅱ 调度 线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。 Ⅲ 系统开销

多线程程序的临界区

╄→гoц情女王★ 提交于 2019-11-26 20:05:19
所谓的临界区: 是指进程中的一段需要访问共享资源并且当另一个进程处于相应代码区域时便不会被执行的代码区域 对于临界区的管理的必须要满足一下的四个要求: 互斥: 同一时间临界区中最多存在一个线程 Progress: 如是一个线程想要进入临界区,那么它最终会成功 有限等待: 如果一个线程i处于入口区,那么在i的请求被接受之前,其他线程进入临界区的时间是有限制的。 无忙等待(可选): 如果一个进程在等待进入临界区,那么在它可以进入之前会被挂起。 解决方案 ①:禁用硬件中断 缺点:一旦中断被禁用,线程就无法被停止,整个系统都会为你停下来。可能导致其他线程处于饥饿状态。 ②:基于软件的解决方法 ③:更高级的抽象 来源: https://www.cnblogs.com/lihuali/p/11332043.html

spin_lock spin_lock_irq spin_lock_irqsave

北城余情 提交于 2019-11-26 12:26:41
1,为啥需要自旋锁 很多时候我们并不能采用其他的锁,比如读写锁、互斥锁、信号量等。一方面这些锁会发生上下文切换,他的时间是不可预期的,对于一些简单的、极短的临界区完全是一种性能损耗;另一方面在中断上下文是不允许睡眠的,除了自旋锁以外的其他任何形式的锁都有可能导致睡眠或者进程切换,这是违背了中断的设计初衷,会发生不可预知的错误。基于两点,我们需要自旋锁,他是不可替代的。 2,为啥自旋锁禁止抢占 这一点其实很好理解,当一个 CPU 获取到一把自旋锁之后,开始执行临界区代码,此时假设他的时间片运转完毕,进程调度会主动触发调度将其调走,执行另一个线程/进程,结果恰巧了这个线程/进程也需要用到该自旋锁,而上一个线程/进程还在停留在临界区内未释放锁,导致本进程无法获取到锁而形成死锁,所以自旋锁为了规避此类情形的出现从而直接禁止对已经开始运行的临界区设置禁止抢占标志。 3,为什么临界区禁止睡眠 如果自旋锁锁住以后进入睡眠,而此时又不能进行处理器抢占,内核的调取器无法调取其他进程获得该 CPU,从而导致该 CPU 被挂起;同时该进程也无法自唤醒且一直持有该自旋锁,进一步会导致其他使用该自旋锁的位置出现死锁。 4,spin_lock 系列的分别 每一种锁出现都有自己的原因,spin_lock 系列的锁就是为了解决这一个又一个的问题才会新增的各种自旋锁变种,这也符合现代计算机代码设计逻辑