Re: [問題] 程式設計的自我修養 Ch.1 疑問
※ 引述《QQ29 (我愛阿蓉)》之銘言:
: 1. virtual memory
: 在"非"share memory, 兩process溝通的情況下
: 他書上是講 process能見的virtual memory都是獨立的
他講的是對的。
: 但從前到現在都有聽到說
: 你指標若存取到非法的記憶體位址 有可能會改到別的process的值??
我想你誤會文中之意,或別人是真的寫錯。
virtual memory 開出來後,有些是給 kernel 用的,
有些才是存放程式所需記憶體,「非法」指的是在 virtual memory 開出來之後,
有些 address 是不能修改,甚至不能讀取,但光就「指標」而言,
是不會改到其他 process address value。
: 但是常常會有人提到heap corruption
: 你存取超過你new的空間 並不會"立即"的crash...
: 若只是單純改到自己process的其他變數的value, 頂多邏輯上出錯, 而不是發生
: exception 導致crash..
: 而且為啥不是"立即"出錯, 到底OS是怎麼判定你這一次的存取非法記憶體才是該發出
: exception的呢?
這個去念 OS 可能好點吧?
: 我不知道這邊觀念到底錯在哪裡
: 若無法改變其他process的value, 那那些hacker是如何寫那些精妙的程式呢....
簡單的方式是一系列 api 的呼叫,
OpenProcess、ReadProcessMemory、QueryMemory、
WriteProcessMemory、CloaseHandle。
: 2. 他在書上p28頁 有舉出最佳化的問題
: 但29頁那邊 他提到加上volatile 可以做到兩件事情
你誤會它的意思了。先從「優化」談起。
compiler 優化 一個是 lazy evaluation, lazy evaluation 簡單但不完全正確的說,
如果在運算過程中需要先計算大量的 tmp[] 去計算 rst[],
若去求 tmp 沒有切迫性的需要時,compiler 開優化後,
有權可以調整求 tmp 之順序 (是一連串的指令),也可以是等到需要求 rst 時
再去計算 tmp, (這動作看起來似乎沒什麼,但有時候效能就是會快些)
然而你開了 volatile 之後,和該 variable 相關的就不會進行先後順序之調整。
故 volatile 能更動的只是 instr. re-range,而不是 thread re-range.
另一 compiler 優化是較為常人所知,過程中如果有 garbge variable,
會企圖去消掉 garbge variable,這也是為何 vc 在 release mode 下,
下斷點後,卻找不到某個變數之原因,因該變數被 opt. 掉。舉個例
int a, b, c;
a = b;
c = b;
c = a + 1;
printf("c = %d\n", c);
最後優化之結果可能是
int c;
++c;
printf("c = %d\n", c);
上面的 a, b 都被優化掉。 volatile 保證的是這二個。
: 但馬上又補一句 "可見volatile可以完美的解決第一個問題"
我看他上下文的意思,不能解決的是和 multi-thread 扯上關係的,
意思是 thread 開出來後,你不能確定哪一個 thread 會先做、後做,
甚至不能保證 thread 下一個會切到哪,這和 instr. re-range 意義不同。
: 讓我不知道他在講啥了, 看到後面....他也沒提出解法
他提的作法不就在 p30 頁提出來了嗎?使用 CPU 提供之相關 barrier 指令。
: 如果我們無法阻止編譯對指令做重排
阻止指令重排用 volatile;
但 volatile 不可限定 thread 順序。
: 他提30頁提到的barrier 說真的我從沒看過跟用過....
: 這是硬體support的嗎?
他在 p30 中後段不是說了嗎?
許多架構 CPU 都提供 barrier 指令,不過名稱各不相同
: 3. 他在書上p.27 也提到兩個東西 一個是 Read-Write-Lock 和 Condition Variable.
這點你有興趣的話,還是去看本 multi-thread 之類的書或好一點的教學文,
我沒力再講。
--
我知道 ~ 但別說出來 ,
說出來讓人感到特別難過...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.195.165.40
→
03/03 09:05, , 1F
03/03 09:05, 1F
→
03/03 09:06, , 2F
03/03 09:06, 2F
推
03/03 20:38, , 3F
03/03 20:38, 3F
→
03/03 20:38, , 4F
03/03 20:38, 4F
推
03/03 23:20, , 5F
03/03 23:20, 5F
→
03/03 23:20, , 6F
03/03 23:20, 6F
→
03/04 10:26, , 7F
03/04 10:26, 7F
→
03/04 10:26, , 8F
03/04 10:26, 8F
討論串 (同標題文章)