2010年11月30日 星期二
system call
2010年11月28日 星期日
多執行緒 ( Multi - threading ) 先佔式多工 ( Preemptive Multitasking )
| Process | Threads | ||||||||||||
相同點 |
| |||||||||||||
相異點 |
|
|
2010年11月27日 星期六
韌體 firmware
韌體(firmware),中國大陸譯作「固件」,港澳譯作「韌體」,是一種嵌入在硬體裝置中的軟體。通常它是位於特殊應用積體電路(ASIC)或可程式邏輯裝置(PLD)之中的快閃記憶體或EEPROM或PROM裡,有的可以讓使用者更新。可以應用在非常廣泛的電子產品中,從遙控器、計算機到電腦中的鍵盤、硬碟,甚至工業機器人中都可見到它的身影。
顧名思義,韌體的所在是位於軟體和硬體之間的。像軟體一樣,他是一個被電腦所執行的程式。然而它是對於硬體內部而言更加貼近以及更加重要的部份,而對於外在的世界而言較無重要的意義。
網際網路上有不少將韌體(firmware)寫作「fireware」的情況,其實並沒有fireware這樣的單詞。
目錄[隱藏] |
[編輯]源起
"韌體"這個名詞是源自於為了 如AMD29xx之類的微程式所寫之微程式。後來它被當成取代一個低價的微處理器裡的一部分功能。
實際而言,一般硬體可以透過對韌體的升級提升其效能及可靠性。在眾多的有規律的韌體升級中燒錄裝置是其中之一,比如說光碟燒錄器(DVD, CD, HD DVD, Blu-ray),隨著媒體技術的日新月異,韌體的更新可以確保硬體保持在最新的狀態以及確保其相容性。
[編輯]韌體使用的演進
韌體已經演進為一個硬體裝置當中的可程式化的內容,比如說韌體可能包含有一處理器之機器碼或者固定功能之裝置,或是閘道陣列或者可程式化之邏輯裝置之設定。
韌體的一個一般性的特色是它可以被在生產後或用電子的方式或者用取代儲存媒介的方式更新。
韌體可以 — 但並非必需 — 暴露出一個可由外界連接的介面。比如說在某些數據機的實作中,韌體並非可以直接存取,但卻是由硬體以及韌體所組成回應主機的一部分。
韌體原本被存放在於ROM中,然而價格以及效能的需求已經讓原件供應商妥協於其他的替代方案,包含了非揮發性的媒體比如說EEPROM以及快閃記憶體或是SRAM的解決方案。
2010年11月25日 星期四
2010年11月18日 星期四
Applet、進入點
他有自己的生命週期,不像一般程式的進入點是main,
Applet的生命週期是建構函式->init()->start()->paint()->stop()->destory(),
call by name
call-by-name 被定義為 Name Replacement:「參數列中的每個參數,如果未指定以
傳值的方式來傳遞,就必須以實際傳入的參數來取代。」在 Compilers - Principles,
Techniques, and Tools 這本書的 7.5 節中,它被解釋為 inline-expansion。其原因
是,以 call-by-name 的方式呼叫函式時,如果在某個參數位置上指定了一個運算式
(expression) 當作參數,那麼這個 expression 會被直接傳入函式裡面進行展開,所以,
這個 expression 是在函式裡面才進行運算的,而不是在參數列中預先計算好它的值再傳
進去。這就產生了 delayed evaluation (延遲計算) 的效果。delayed evaluation 的好處
是,只有當函式需要某個 expression 參數的值,該 expression 才會被計算,否則就不
用了。call-by-name 比較顯著的例子是 swap 函式,swap 通常是這樣寫的:
proc swap(A, B) {
tmp = A;
A = B;
B = tmp;
}
proc main() {
i = 2;
a[3] = {5, 6, 7};
swap(i, a[i]);
}
swap 的實際工作情形是:
swap(i, a[i]) { // i is 2
tmp = i; // tmp becomes 2, since i is 2
i = a[i]; // i becomes 7, since a[2] is 7
a[i] = i; // inline expansion of B, delayed evaluation ==> a[7] = 7
}
在 P(X, Y, Z) 這個例子中:
proc P(X, Y, Z) {
Y = Y + 1;
Z = Z + X;
}
P(a+b, a, a) { // a = 2, b = 3
a = a + 1; // a becomes 3
a = a + (a+b); // inline expansion of X, a becomes 9
}
modifier
access modifier
OOP程式有三大特性:封裝性、繼承性、多形性,後面兩者我們已經談過了,至於封裝性我們來說明一下。所謂的封裝性,亦即讓使用者只能接觸到應該接觸到的資料,有一些變數可以被隱藏起來,讓使用者完全看不到,至於怎麼達到這種特性呢?靠的就是access modifier!前面我們常常會看到一些public、private等等字眼,這些就是access modifier,他們限制了成員對使用者來說的可見度,一個public的成員是外面所有人都能夠看得到的,而一個private的成員就只有class自己看得到了。底下列出一張表整理所有的access modifier:
private | member data and function | 只有class本身能看到 |
預設(friendly) | member data and function and class | 同一package都能看到 |
protected | member data and function | 同一package或繼承者都可以看到 |
public | member data and function and class | 所有class都可以看到 |
另外,請注意在進行繼承之後,access modifier是可以更改的,但是只能改得更接近public而不能更private。
modifier
事實上,除了access modifier之外,還有很多種modifier,這裡列的是Java程式中用到的,作為參考:
l static:該成員不屬於任何object,而是直接屬於class本身,換言之,即使沒有任何object從該class被建立出來,這個成員還是存在的。
l final:該成員或class是不允許任何改變的,如果放在class前面,就表示這個class不能夠被繼承。
l synchronized:該函式在同一時間僅能被一個執行緒(thread)執行。
l transient:在將該object序列化[3]之時,該變數不被序列化。
l volatile:對該變數不做任何最佳化處理,亦即要求JVM不對該變數進行cache的動作,以保證每次讀取該變數的時候,都能讀到最新的值。
[1] 嚴格說起來,java class並沒有解構子,只有一個類似解構子的finalize()函式。
[2] 產生object的時候,會一並產生所有的父類別。
[3] Java裡面有一種特殊的serialization功能,可以將一個物件打平成為一群bytes,甚至可以用來存在檔案裡面。
bytecode
位元組碼
- ByteCode 是給予 JVM 執行的一種虛擬機器碼,也就是給於 JVM 的指令‧
- 反過來說,JVM 就是 ByteCode 的解譯程式‧
- extends 的原始程式碼 (.java) 經由編譯後產生的類別檔 (.class) 就是 ByteCode 檔案‧
- 雖然 JVM 可能因平台而異,但是所有的 JVM 都能執行 extends 的 ByteCode‧
Bytecode直譯器
考量程式執行之前所需要分析的時間,存在了一個介於直譯與編譯之間的可能性。例如,用Emacs Lisp所撰寫的原始碼會被編譯成一種高度壓縮且最佳化的另一種 Lisp 原始碼格式,這就是一種 bytecode,而它並不是機器碼(因此不會被綁死在特定的硬體上)。這個"編譯過的"碼之後會被 bytecode interpreter(使用C寫成的)轉譯。在這種情況下,這個"編譯過的"碼可以被說成是 virtual machine (不是真的硬體,而是一種 bytecode 直譯器)的機器碼。這個方式被用在 Open Firmware 系統所使用的 Forth 程式碼中: 原始程式將會被編譯成 "F code" (一種bytecode),然後被一個特定平台的虛擬機器直譯和執行。
http://zh.wikipedia.org/zh-tw/%E7%9B%B4%E8%AD%AF%E5%99%A8#Bytecode.E7.9B.B4.E8.AD.AF.E5.99.A8
2010年11月7日 星期日
cpu、register
一個CPU所具有的暫存器數量與每個暫存器所能處理的位元數決定著CPU的運算能力與速度。舉例來說,在一個32-bit的CPU上,每個暫存器是32-bit寬,代表著每個指令能夠處理32-bit的資料。
一般來說,CPU是由一個將指令從記憶體中取出,然後執行執行指令的控制單元,與執行數學與邏輯操作的算數邏輯單元(ALU)所組成。控制單元僅會在有需要的時候才會呼叫ALU。
精簡指令集(Reduced Instruction Set Computer;RISC)CPU是手持應用裝置上最常見的。RISC的特徵是具有一小組的指令與許多的暫存器。指令通常可以在單一的時脈循環中執行。RISC架構的根據是載入/儲存的概念,一個具有載入/儲存的電腦可以從外部儲存體載入資料到內部儲存體,或者是從內部儲存體到暫存器上;又或者是從一個暫存器上儲存資料到內部儲存體上,或從內部儲存體到外部儲存體。
***32位元與64位元版本系統之限制與特色*** |
Windows Vista作業系統除了分成六大種類作業系統,包括Home Starter、Home Basic、Home Premium、Business、Enterprise、Ultimate之外,所有作業系統皆擁有32位元及64位元兩種版本(Home Starter除外,只有32位元版本)。對於使用者而言,目前幾個硬體與軟體上的限制會導致64位元作業並不如消費者想像的那麼理想,使用上反而會造成使用者的困擾,這也是聯強Lemel電腦未立即推出64位元Vista的主要考量。請參考下列32位元與64位元版本系統之限制與特色: |
差異1:CPU的核心程式架構支援度 安裝Windows Vista 64位元作業系統,CPU必須支援Intel EM64T功能的Intel CPU或是支援AMD64功能的AMD CPU,否則在安裝時就會出現警告而導致無法安裝這個問題以目前CPU支援度而言,是硬體結構中較沒有問題的部份。 |
差異2:記憶體實體容量的支援度 32位元作業系統受限於CPU內32位元運算暫存器的關係,能使用在記憶體定址的範圍只有「2^32次方」 = 「4GB」,所以32位元CPU及作業系統可以使用的記憶體大小只有4GB容量。如果記憶體需求超過4GB以上時,就必須使用64位元的定址方式才能繼續支援。 現實上目前市場上的晶片組記憶體支援並無法真正達成實體4GB的真實容量。支援記憶體容量的限制,取決於主機板晶片組的支援與實體記憶體的單條記憶體容量支援度。以現今晶片組Intel 965 chipset 只支援到8GB記憶體,而且市場上單條記憶體容量超過2GB的記憶體也寥寥可數,這造就了硬體暫時無法發揮64位元作業系統的優點,對一般使用者而言超過記憶體4GB的需求實際上也不多。 |
差異3:應用軟體與驅動程式的支援度 在64位元的作業系統上,雖然部分軟體可相容32位元的模式,但對核心程式而言則需完全使用64位元的軟體,例如:驅動程式和防毒軟體。以現在硬體廠商提供的64位元驅動程式尚不齊全,所以在產品支援的廣度上,就會產生問題。另外目前僅有極少數例如SQL server、Exchange server、Office等軟體才另外有64位元版本。雖然64位元作業系統提供相容模式執行這些32位元軟體,但不保證百分之百相容,而且執行效能可能會差。所以想在Windows Vista 64位元作業系統上執行應用軟體,建議是都需要重新編譯成64位元版本才可完全正常運作。
|
註:在Windows XP Professional x64 Edition可以使用的應用軟體,並不包證可以相容於Windows Vista 64位元作業系統上。 |