2010-04-27 46 views
-1

该x值是一些挑战什么是加载和存储

在单处理器系统,其中,加载和存储被认为是 原子,什么是对于x两个线程后所有可能的值有假设x被初始化为O,在 以下执行完成。提示:您需要 考虑如何将此代码编译为机器语言。

for(int i = 0; i < 5; i ++): x = x + 1; (int j = 0; j < 5; j ++): x = x + 1;

回答

-1

好,最体面的编译器会优化,为x=10;

+0

是什么原因?你是怎么得到的? – Kevinniceguy 2010-04-27 21:09:36

-1

嗯,10赐教否则。

1

你的问题中的每一行代表一个单独的线程。由于共享变量x没有被保护,几乎任何事情都可能发生。你有什么可能性? (否则我会觉得我只是回答你的问题你)

第二提示:让你一个C编译器帮助您展示一些例子...

int x; 

void f(void) 
{ 
    int i; 
    for (i = 0; i < 5; i++) x = x + 1; 
} 

(这是你的程序翻译进入C)

gcc -S -fno-PIC t.c 

(这是我要在我的机器上输入获得可读的汇编)

_f: 
pushl %ebp 
movl %esp, %ebp 
subl $24, %esp 
movl $0, -12(%ebp) 
jmp L2 
L3: 
movl _x, %eax 
incl %eax 
movl %eax, _x 
leal -12(%ebp), %eax 
incl (%eax) 
L2: 
cmpl $4, -12(%ebp) 
jle L3 
leave 
ret 

现在与优化(新增选项-02到编辑):

_f: 
movl _x, %eax 
xorl %edx, %edx 
pushl %ebp 
movl %esp, %ebp 
.align 4,0x90 
L2: 
incl %edx 
incl %eax 
cmpl $5, %edx 
jne L2 
movl %eax, _x 
leave 
ret 
+0

应该已经评论了 – Nifle 2010-04-27 21:19:17

+0

还是没有线索.......... – Kevinniceguy 2010-04-27 21:33:32

0

提示:你不需要考虑所有可能的序列,你只需要考虑最极端的情况。 x可能是什么最小值? x可能的最大值是多少?

当一个线程的加载总是发生在加载之后和另一个线程中的存储之前时,会发生最小情况。

当不存在重叠的加载 - 修改 - 存储序列时将发生最大情况。

这应该是足够的提示,你现在就可以解决它。

+0

我会争辩说load r,x; R = R + 42; store x,r;负载r,x; R = R-37; store x,r;对于编译器提供的信息之一是一个正确的编译线程,它给出的结果高于你正在考虑的“最大情况”,但这是纯粹的挑剔。 – 2010-04-27 21:42:16

+0

如果语言是C,'x'是'volatile'变量,那么我会同意非重叠序列给出'x'的最大结果。 – 2010-04-27 21:47:17

+0

@帕斯卡尔:是的,但在新手级作业问题的背景下,我认为最好保持简单。 – 2010-04-27 21:48:40

0

每个线程将具有5台的操作的指令:

LOAD X 
INCREMENT X 
STORE X 

每个指令的CPU可以选择得到执行,有两种另一个线程之后。

  • 非常higherest X可以成为是 10.This当每个线程完成而不屈服 到其他执行发生。
  • 最低我可以 看到的是5。这是第一个 加载指令发生在两个 线程上,然后一个完成执行, 然后另一个完成。