同步机制1

进程互斥的软件解决方案

解法1 (可行)

  • 解法1 (尝试1行不通!)横向箭头处下CPU, 两个都进CS了!
  • 应该把while 和 free 写成一个 lock() 和unlock()函数 并设计成原子操作 这样则有了可行的解法1

解法2 (不可行)

以上尝试行不通,因为如果Q 在外面根本不想进去,那么P就永远进不了,即使临界区没人!

解法3 (不可行)


若是P上CPU后被换下,Q后进临界区,没有完成就被换下,现在P和Q都想进 (both pturn and qturn are true).
这样P Q 都在自己的时间片循环,认为对方想进就都不进(谦让问题!)(After you problem!)

解法4 Dekker 算法 强制轮流法 (可行) (1965年第一个解决临界区问题的方案)

在解法3的基础上引入了turn变量(枚举类型),When After you happen, turn decides who gets in! 两人总有一个根据turn的值让出

Problem About this approach? Busy waiting!!!!


假如只有一个CPU,你在CPU等,那就没人上CPU了!极其低效!

解法5!划重点! Peterson 算法!必考!

Peterson算法满足互斥、空闲让进, 有限等待3条同步机制准则。 1981年,解决了互斥访问的问题,而且克服了强制轮流法的缺点,可以完全正常工作!


若是0 和1 都想进CS,那就看谁先赋值给turn变量!先赋值的会被后赋值的给覆盖掉!turn始终保存后面进的进程号. while(turn == process && interested[other] = TRUE); 这样没有进CS的在enter_region 作循环

在临界区域之前非常简单的调用enter_region 和 leave_region, 对于程序员友好!

同步机制2

Monitor 的基本概念

  • Monitor def:
    • 一个特殊的模块
    • 有一个名字
    • 由关于共享资源的数据结构及在其上操作的一组过程组成

results matching ""

    No results matching ""