作为一个搞java开发的小菜鸟。其实一直很羡慕学C的,感觉人家的语言更接近本源,更能提高对计算机编程语言的认知程度。今天分享一个自认为能提高对代码理解的一道操作系统的题目
int total = 0;//P0 P1共享全局变量total
//P0 P1进程代码相同,如下
{
for(int i = 1;i <= 10;i ++) {
total = total + 1;
}
}
问:最后total可能的最小值、最大值分别是多少?
答案: 2、20
对于total = total + 1这种我们常用的算术操作,换成汇编代码确是三个过程:申请临时变量、对临时变量进行算术操作、将临时变量的值赋值给total,即代码如下:
//申请临时变量暂定为temporary
temporary = total;
temporary = temporary + 1;
total = temporary;
理解了上面的上面的解释,我们才能展开下面的分析过程
分析:我们暂定P0在total自增时申请的临时变量为temporary0,P1在total自增时申请的临时变量为temporary1,假设P0先获取执行权
1. 当P0在进行第一次total自增时,代码执行到temporary0 = total;temporary0 = temporary0 + 1;处,发生了中断
此时,temporary0=1,total=0;
2. 然后P1获得了执行权,P1执行较顺利,一直完整的循环了9次,然后进行最后一次循环时发生了中断
此时total=9
3. 然后P0重新获取执行权,继续上方红色标记开始执行,即开始执行total=temporary0;
此时total=1
4. 然后再次发生中断,P1获取执行权后开始进行最后一次循环,即
temporary1 = total;
temporary1 = temporary1 + 1;
//然后再次发生了中断。。。。。
此时temporary1 = 2,P1只差一句total = temporary1;即可完成全部循环
5. 不幸的是再次发生了中断(手动亚麻得),P0获取了执行权,然后P0将循环全部做完,即P0进程结束,我们大可不必去管P0执行完成后的结果了
此时无论P0执行完后的结果如何,接下来P1接着上方红色标记处开始执行,即
total = temporary1;
//而P1的temporary1=2,所以此时total变为2
6. 然后P0 P1循环都结束,total定格在了total=2
最大值20即两个进程顺序执行即得