2010-04-27 95 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。這是第一個 加載指令發生在兩個 線程上,然後一個完成執行, 然後另一個完成。