Dynamic Loading:可在執行階段遇到需要的程式碼再load,好處是error handling的code不用被全部塞在memory裡面
Static Linking:沒什麼特別,假設好幾個程式都include stdio.h,就會有好幾份程式碼分布在記憶體當中,很冗
Dynamic Linking:假設好幾個程式都include stdio.h,只load一份,大家共用。程式內指向Lib的部分稱為stub,當作出對Library的要求,會檢查這個Library有沒有被loaded在memory中,如果沒有就load,Windows下常見的Dll(Dynamic link library)檔就是這個
Dynamic Loading無法解決Static Linking重複code的問題!Loadin和Linking分清楚
疑問:寫好的程式第一次執行總是慢很多跟這個有沒有關聯?
2014年10月26日 星期日
Memory Addressing-1 Address Binding:Compile Time、Load time、Execution Time
Compile Time
assembly code
要改變記憶體位置就得重新compile
Load Time
assembly code
assembly code
.BASE 0x1000 POP AX .END .SPACE (4) #在硬碟中的情況 | PUSH AX MOVE AX, 3 MULT AX, 7 MOVE (0x1018), AX CALL print, (0x1018) POP AX #Memory中的內容 |
要改變記憶體位置就得重新compile
Load Time
assembly code
.START PUSH AX MOVE AX, 3 MULT AX, 7 MOVE (.BS+0x18), AX CALL print, (.BS+0x18) POP AX .END .SPACE (4) #在硬碟中的情況 | PUSH AX MOVE AX, 3 MULT AX, 7 MOVE (0x2018), AX CALL print, (0x2018) POP AX #Memory中的內容 |
要改變記憶體位置要重開程式
Execution Time
assembly code
assembly code
.START PUSH AX MOVE AX, 3 MULT AX, 7 MOVE (0x18), AX CALL print, (0x18) POP AX .END .SPACE (4) #在硬碟中的情況 | PUSH AX MOVE AX, 3 MULT AX, 7 MOVE (0x18), AX CALL print, (0x18) POP AX #Memory中的內容 |
不論在實體記憶體中的哪個部分都沒問題,會透過MMU把虛擬的位置轉成實體
Logical Address、Physical Address
在Compile Time和Load Time:Logical Address=Physical Address
Logical Address、Physical Address
在Compile Time和Load Time:Logical Address=Physical Address
在Execution Time:Logical Address!=Physical Address
疑問:如果MMU可以吃超過32個bit,整個OS是不是能調度超過4GB呢?
2014年10月25日 星期六
Virtualization雜談之雲端化
一堆電腦堆在一起,過去會先想到Cluster(叢集),現在或許會先想到Cloud?
過去為了加速程式的進行,將多台電腦平行分配處理一隻program,這是叢集。如果買了很多電腦很快地跑出結果,電腦們可能就閒置在那裡發呆,等於浪費資本成本,如果用很少電腦跑,會花費許多時間成本。
如果能夠租用電腦,program跑出結果就還回去,用多少算多少,這就是雲端的IaaS(Infrastructure as a Service)。
IaaS現在能提供哪些服務呢?
過去為了加速程式的進行,將多台電腦平行分配處理一隻program,這是叢集。如果買了很多電腦很快地跑出結果,電腦們可能就閒置在那裡發呆,等於浪費資本成本,如果用很少電腦跑,會花費許多時間成本。
如果能夠租用電腦,program跑出結果就還回去,用多少算多少,這就是雲端的IaaS(Infrastructure as a Service)。
IaaS現在能提供哪些服務呢?
- 最基本當然是選租用多少CPU、多少RAM、多少Storage、網路
- 開好多台VM,大家的system都一樣,那麼memory裡的資料有很多都是重複的,讓一台電腦上的VM們共用重複的資料,有效利用memory
- 進階一點:一天中的尖峰時間,平常租用的效能不夠力,可以動態增加更多的效能
- 穩定性:
- VMware High Availablity
- 一台實體機器無預警跳掉,可以自動把在這台實體機器上的VM們轉移到別的實體機器上自動重啟(有off line)
- VMware Fault Tolerance
- 開兩台VM在不同的實體電腦上,一台當另外一台的影子,當其中一台有硬體上的問題時,可以立刻切換過去,達成no offline
- 切換過去之後,可以立刻對整個VM做image,透過網路傳到另外一台電腦,然後再次建置一台影子VM
Swap
Normal
temp=*a; *a=*b; *b=temp;Advance
*a=*a+*b; *b=*a-*b; *a=*a-*b;Magic
*a=*a^*b; *b=*a^*b; *a=*a^*b;
Virtualization雜談
Virtualization一些名詞
VT-x for x86
VT-i for itanium
AMD-v from AMD
Full Virtualization:不需要修改Guest OS就能使用,Guest OS的privileged instructions會被VM轉換,效能消耗較高
Para Virtualization:修改Guest OS的code,把privileged instructions都改寫成一般程式使用的instructions
VT-x 使Guest OS可直接借用CPU
VT-d 使Guest OS可直接借用I/O controller
VT-x for x86
VT-i for itanium
AMD-v from AMD
Full Virtualization:不需要修改Guest OS就能使用,Guest OS的privileged instructions會被VM轉換,效能消耗較高
Para Virtualization:修改Guest OS的code,把privileged instructions都改寫成一般程式使用的instructions
VT-x 使Guest OS可直接借用CPU
VT-d 使Guest OS可直接借用I/O controller
ASCII、ANSI、Big5、GB、GBK、Unicode、UTF-X
- ASCII:只定義128個字(包含控制碼),理論上只需要7bits
- ANSI:定義了更多字,包括ascii定義的字共256個字,一個字使用8bits
- Big5:,一個字使用16bits分為兩個byte,然而電腦不知道這2byte要連在一起看,如果Second byte內容跟'\'一樣,會造成許多的errors(google"許蓋功")
- GB2312、GBK、GB18030:GB2312同Big5使用兩個byte;GBK收入更多字,使用2byte,向下相容GB;GB18030使用浮動編碼,相容GB基本兼容GBK,收入更多字
- Unicode:收錄標準
- UTF-8:實作Unicode,屬於浮動編碼,不同的字可能用1~6bytes,英文字1byte、拉丁文等字2bytes,漢字3bytes
- UTF-16:實作Unicode,最常見的字放在/U+0000~/U+FFFF這些位置
- UTF-16的UCS-2:Windows的notepad中的Unicode指的是這個UCS-2,固定編碼,都用2bytes,在UTF-16超過2bytes範圍的部分不一定支援
- UTF-32、UCS-4:使用32個bits==4bytes,包含所有Unicode的字,但也浪費了許多空間
- 應用:
- 把Big5轉成UTF-8會變接近1.5倍的大小,因為UTF-8中漢字佔3bytes,而Big5只佔2bytes,但UTF-8不會發生慘絕人寰的悲劇(許蓋功)
- UTF-16通常也會和UTF-8差一點五倍的大小
- UTF-8的第一個byte跟ascii定義的一樣,使得大多英文程式不大需要修改
參考資料:
Unicode, UTF-8, UTF-16, UCS-2 和一些程式語言的支援方式
<http://fcamel-life.blogspot.tw/2010/04/unicode-utf-8-utf-16-ucs-2.html>
Encoding Gossip: Unicode 與 UTF
<http://openhome.cc/Gossip/Encoding/UnicodeUTF.html>
字符編碼筆記:ASCII,Unicode和UTF-8
<http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html>
訂閱:
文章 (Atom)