gem-universe / blog

0 stars 0 forks source link

[操作系统]6. 并发控制基础 #6

Open supergem3000 opened 7 months ago

supergem3000 commented 7 months ago

6. 并发控制基础 (jyywiki.cn)

互斥问题

人类是sequential creature,编译优化+weak memory model导致难以理解的并发执行。 手段:“回退到”顺序执行。 插入神秘代码,使得所有其他神秘代码都不能并发。

void Tsum() {
stop_the_world();
// 临界区 critical section
sum++;
resume_the_world();
}

都不能并发了,那多处理器的意义是什么?实际上临界区代码是可能访问共享内存的代码,多数代码是不需要访问共享内存的。

失败的尝试

int locked = UNLOCK;

void critical_section() {
retry:
  if (locked != UNLOCK) {
    goto retry;
  }
  locked = LOCK;
  // critical section
  locked = UNLOCK;
}

和山寨支付宝一样的错误,不能保证load + store操作原子性。 更严肃的尝试 假设:内存的读/写可以保证顺序、原子完成。 val = atomic_load(ptr)

回到前文的假设:Atomic load/store。但这个假设在现代多处理器上并不成立。那么Peterson算法是错的吗?合理需求一定能实现。 Compiler barrier/volatile保证不被优化的前提下:

supergem3000 commented 7 months ago

对课程视频中实现Peterson算法代码,使用了__sync_synchronize()让读写操作原子,视频评论区一位同学的看法:

image