一个操作系统的习题

作为一个搞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即两个进程顺序执行即得

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值