- 论坛徽章:
- 0
|
瀚海书香 发表于 2012-06-05 09:42 ![]()
回复 31# honkiko
因为你只是禁止了当前CPU的中断,可以防止本CPU上进程的被抢占,但不代表不会任务切换,其实也不能保证其他CPU进入当前临界区。
所以可以说禁止了抢占,但无法达到临界区的功能。
看如下引用:
(1) 关 中 断;
(2) 执 行 临 界 区 程 序;
(3) 开 中 断。
关 中 断 之 后, 任 何 外 部 事 件 都 不 能 打 扰 处 理 机 连 续 执 行 临 界 区 程 序。 如 果 临 界 区 程 序 本 身 并 不 包 含 使 它 的 进 程 转 变 为 封 锁 状 态 的 因 素, 那 么 这 种 方 法 就 能 保 证 临 界 区 作 为 一 个 整 体 执 行。 这 种 方 法 的 优 点 是 简 单、 可 靠, 但 是 它 也 有 一 定 的 局 限 性 和 若 干 不 足 之 处。
(1) 它 不 能 用 于 多 处 理 机 系 统。 其 原 因 是: 由 于 该 系 统 中 的 多 个 处 理 机 都 有 其 各 自 的 中 断 开 关, 因 此 一 个 处 理 机 并 不 能 阻 止 在 其 它 处 理 机 上 运 行 的 进 程 进 入 同 类 临 界 区。
(2) 在 临 界 区 中 如 果 包 含 有 使 执 行 它 的 进 程 有 可 能 进 入 封 锁 状 态 的 因 素, 则 也 不 能 使 用 这 种 方 法。 因 为 在 该 进 程 进 入 封 锁 状 态 后, 系 统 将 调 度 另 一 进 程 使 用 处 理 机, 如 果 需 要, 该 进 程 也 可 以 执 行 临 界 区 程 序, 不 会 受 到 任 何 阻 拦, 所 以 在 这 种 情 况 下, 开、 关 中 断 不 能 实 施 临 界 区 互 斥。
(3) 如 果 临 界 区 比 较 长, 则 本 法 会 降 低 中 断 响 应 速 度。
(4) 这 是 一 把 锁 处 理 各 类 临 界 区, 不 必 要 地 扩 大 了 互 斥 范 围。
33楼说的是用关中断来保护临界区时存在的问题,说的都很经典。我深表赞同。如果仅仅用关中断就能保护多处理机下的临界区,那要自旋锁又有何用呢?所以我们用spin_lock_irq来替换local_irq_disable().如果说禁止了当前CPU的中断,可以防止本CPU上进程的被抢占,但不代表不会任务切换,就像第2条描述的那样,那么加了preempt_disable(),就可以保证不会任务切换吗?
|
|