共享队列和加锁·任何要访问队列的代码首先都需要占住相应的锁,这样该锁就能阻止来自其它内核任务的并发访问:任务2r试图锁定队列任务1失败:等待...试图锁定队列等待...成功:获得锁等待...访问队列...成功:获得锁为队列解除锁访问队列..为队列解除锁
• 任何要访问队列的代码首先都需要占住相 应的锁,这样该锁就能阻止来自其它内核 任务的并发访问: < > 任务 1 试图锁定队列 成功:获得锁 访问队列. 为队列解除锁 . 任务2 试图锁定队列 失败:等待. 等待. 等待. 成功:获得锁 访问队列. 为队列解除锁 共享队列和加锁
确定保护对象找出哪些数据需要保护是关键所在X内核任务的局部数据仅仅被它本身访问,X显然不需要保护r如果数据只会被特定的进程访问,也不需加锁心大多数内核数据结构都需要加锁:若有其它内核任务可以访问这些数据,那么就给这些数据加上某种形式的锁;若任何其它东西能看到它,那么就要锁住它<二>
❖ 找出哪些数据需要保护是关键所在 ❖ 内核任务的局部数据仅仅被它本身访问, 显然不需要保护 ❖ 如果数据只会被特定的进程访问,也不 需加锁 ❖ 大多数内核数据结构都需要加锁:若有 其它内核任务可以访问这些数据,那么 就给这些数据加上某种形式的锁;若任 何其它东西能看到它,那么就要锁住它 < > 确定保护对象
死锁心死锁产生的条件:有一个或多个并发执行的内核任务和一个或多个资源,每个任务都在等待其中的一个资源,但所有的资源都已经被占用。所有任务都在相互等待,但它们永r远不会释放已经占有的资源,于是任何任务都无法继续典型的死锁:心四路交通堵塞*自死锁:一个执行任务试图去获得一个自已已经持有的锁<>
❖ 死锁产生的条件:有一个或多个并发执行的 内核任务和一个或多个资源,每个任务都在 等待其中的一个资源,但所有的资源都已经 被占用。所有任务都在相互等待,但它们永 远不会释放已经占有的资源,于是任何任务 都无法继续 ❖ 典型的死锁: ❖ 四路交通堵塞 ❖ 自死锁:一个执行任务试图去获得一个自 己已经持有的锁 < > 死 锁
死锁的避免心加锁的顺序是关键。使用嵌套的锁时必须保证以相同的顺序获取锁,这样可以阻止致命拥抱类型的死锁rX防止发生饥饿不要重复请求同一个锁。X越复杂的加锁方案越有可能造成死锁X因此设计应力求简单KM
❖ 加锁的顺序是关键。使用嵌套的锁 时必须保证以相同的顺序获取锁,这 样可以阻止致命拥抱类型的死锁 ❖ 防止发生饥饿 ❖ 不要重复请求同一个锁。 ❖ 越复杂的加锁方案越有可能造成死锁, 因此设计应力求简单 < > 死锁的避免
并发执行的原因中断二中断几乎可以在任何时刻异步发生,也可能随时打断正在执行的代码。心内核抢占一一若内核具有抢占性,内核r中的任务就可能会被另一任务抢占心睡眠及与用户空间的同步一一在内核执行的进程可能会睡眠,这将唤醒调度程序,导致调度一个新的用户进程执行心对称多处理一一两个或多个处理器可以同时执行代码
❖ 中断——中断几乎可以在任何时刻异步 发生,也可能随时打断正在执行的代码。 ❖ 内核抢占——若内核具有抢占性,内核 中的任务就可能会被另一任务抢占 ❖ 睡眠及与用户空间的同步——在内核执 行的进程可能会睡眠,这将唤醒调度程 序,导致调度一个新的用户进程执行 ❖ 对称多处理——两个或多个处理器可以 同时执行代码 < > 并发执行的原因