我正在学习一个操作系统课程,并且我试图理解并发编程是如何工作的。
我唯一能解决的问题是理解"命令"两个或多个进程的操作/指令执行:
例如,给出了两个进程尝试访问关键部分的代码
来自Parbegin
,执行此代码的顺序是什么?
它们以1:1的方式运行(例如,一行代码由Process1和Process2交替执行,如1,1,2,2,3,3 ... n,n具有明显的进入/退出点条件)或我错过了一些特别的命令?
对于我所理解的,执行是这样的:
var and turn inizialized
turn is equal to 1 then P1 enter in the CS
turn is equal to 1 then P2 enter the while
P2 is now in busy-wait
P1 is doing the critical section
P1 exit from the critical section and set turn=2
P2 exit from the while and enter CS
P1 doing remainder
P2 exit CS and set turn=1
P1 can enter the cycle
等等。我做错了吗?
答案 0 :(得分:2)
并发的一个重要特征,也是许多困难的根源,是跨进程的操作顺序未知。操作顺序为non-deterministic。
对于第一个近似值,您可以将操作顺序视为随机。也就是说,考虑到处理器(更准确地说,scheduler)执行多进程程序如下:
处理器可以依次从每个进程执行一条指令。或者它可以从进程1执行2½循环,然后执行来自进程2的3条指令,而不是恢复进程1一段时间,再多进行进程2,等等。或者它可以执行来自进程1的3条指令,然后来自进程2的1条指令,那么4来自流程1,然后1来自流程2,然后5来自流程1,等等。或者它可能会继续执行流程1。
并发性研究的目标是确定无论随机选择的顺序是什么,或者至少对于“不太极端”的一类随机选择,都是真实的程序的属性。最常见的“不太极端”的类型是fairness假设,粗略地说,这意味着每个未被阻止的指令(被阻止的指令类似于等待输入事件的输入指令)将被执行最终。这排除了“永远执行过程1”,但没有上述其他示例。
关于您特别引用的算法,其目标是只有一个进程可以位于关键部分的开头和结尾之间。 (请注意,尽管临界区写在一行上,但它通常由多个指令组成。)无论两个进程的指令如何交错,都需要此属性。
我的答案有几个简化。特别是randomness and non-determinism are actually different concepts。使用随机调度程序,您可能会或可能不会幸运,如果不是,您可以再次尝试,而非确定性调度程序可能会出来帮助您。随机调度程序实际上是公平的,而真实世界的调度程序可能根本不公平。内化关于并发性的重要一点是你无法提前预测程序的行为:有许多可能的行为。