2010年11月30日 星期二

system call

System call 是作業系統提供給 user program 服務的介面,例如處理 I/O 或是使用額外的記憶體,它的目的是為了保護系統的穩定,防止 user program 惡意或者不小心對系統造成的傷害。

System call 實際的運作機制和 Interrupt 相同,它也是透過同樣的對照表來採取對應的處理。

2010年11月28日 星期日

多執行緒 ( Multi - threading ) 先佔式多工 ( Preemptive Multitasking )

【多執行緒 ( Multi - threading ) 】 又稱為 Light - Weighted Process ,它與傳統的行程 ( Process ) 非常類似,只不過一個行程中可能會包含數個Threads ,同屬某個行程的各 Threads 會共用某塊共同記憶體,以降低彼此間控制權轉移時的負擔。Process與 Thread 兩者間的異同可用下表來說明: 

 

ProcessThreads
相同點
1、每一個 Process ( Thread ) 依序執行。
2、每一個 Process ( Thread ) 有自己的程式計數器 ( Program Counter ) ,可以用來記錄、追
  蹤執行的狀態。
3、所有的 Process ( Thread ) 共同分享 CPU 資源。
相異點
1、Processes 間彼此為獨立的個體。
2、Processes 間彼此各自擁有自己的位址空
間。
3、作業系統會提供 Processes 彼此之間的保
  護措施,使彼此間不會互相衝突。
1、一個 Process 可能包含許多的 Threads。
2、同屬一個 Process 的 Threads 會共用同樣
的位址空間。
3、對於同屬一個 Process 的 Threads 來說,
  作業系統並不提供 Threads 彼此間的保
  護措施,程式設計師必須要自行控制。
 【多工 ( Multi - tasking ) 】  通常一個具有多工處理能力的作業系統是表是這個作業系統可以同時執行兩個以上的「行程 ( Process ) 」。多工作業系統可分成先佔式多工 ( Preemptive Multitasking ) 與非先佔式多工 ( Non - Preemptive Multitasking )兩大類。  

1、先佔式多工 ( Preemptive Multitasking )  

作業系統可以讓系統正在執行中的行程公平使用電腦系統的 CPU 以及其它資源。
只要執行中的行程超過作業系統所配置給此行程的 CPU 時段時,作業系統會立刻中斷這個行程並將控制權交給另一個正在等待的行程。  

2、非先佔式多工 ( Non - Preemptive Multitasking )  

又稱為協同式多工 ( Cooperative Multitasking ) ,在此作業系統下,CPU 的控制權有可能被一個行程所佔用,除非該行程主動交出 CPU 的控制權,否則別的行程是沒有機會取得 CPU 的控制權。

2010年11月27日 星期六

韌體 firmware

韌體firmware),中國大陸譯作「固件」,港澳譯作「韌體」,是一種嵌入在硬體裝置中的軟體。通常它是位於特殊應用積體電路(ASIC)或可程式邏輯裝置(PLD)之中的快閃記憶體EEPROMPROM裡,有的可以讓使用者更新。可以應用在非常廣泛的電子產品中,從遙控器計算機電腦中的鍵盤硬碟,甚至工業機器人中都可見到它的身影。

顧名思義,韌體的所在是位於軟體和硬體之間的。像軟體一樣,他是一個被電腦所執行的程式。然而它是對於硬體內部而言更加貼近以及更加重要的部份,而對於外在的世界而言較無重要的意義。

網際網路上有不少將韌體(firmware)寫作「fireware」的情況,其實並沒有fireware這樣的單詞。

目錄

[隱藏]

[編輯]源起

"韌體"這個名詞是源自於為了 如AMD29xx之類的微程式所寫之微程式。後來它被當成取代一個低價的微處理器裡的一部分功能。

實際而言,一般硬體可以透過對韌體的升級提升其效能及可靠性。在眾多的有規律的韌體升級中燒錄裝置是其中之一,比如說光碟燒錄器(DVD, CD, HD DVD, Blu-ray),隨著媒體技術的日新月異,韌體的更新可以確保硬體保持在最新的狀態以及確保其相容性。

[編輯]韌體使用的演進

韌體已經演進為一個硬體裝置當中的可程式化的內容,比如說韌體可能包含有一處理器之機器碼或者固定功能之裝置,或是閘道陣列或者可程式化之邏輯裝置之設定。

韌體的一個一般性的特色是它可以被在生產後或用電子的方式或者用取代儲存媒介的方式更新。

韌體可以 — 但並非必需 — 暴露出一個可由外界連接的介面。比如說在某些數據機的實作中,韌體並非可以直接存取,但卻是由硬體以及韌體所組成回應主機的一部分。

韌體原本被存放在於ROM中,然而價格以及效能的需求已經讓原件供應商妥協於其他的替代方案,包含了非揮發性的媒體比如說EEPROM以及快閃記憶體或是SRAM的解決方案。


http://zh.wikipedia.org/zh-tw/%E9%9F%8C%E9%AB%94

2010年11月18日 星期四

static

http://wangshifuola.blogspot.com/2010/07/flexis.html


whlie(*s++=*t++)

http://zh-tw.w3support.net/index.php?db=so&id=247106


Applet、進入點

Java Applet指的是嵌入在網頁上藉由網頁瀏覽器來執行的Java程式,一個applet程式和一般的Application程式最大的不同在於applet沒有程式進入點main()的存在。而且applet程式在執行上也有一些限制,基於安全上的考量,applet程式不被允許存取任何client電腦上的資源。

Applet和一般的java不一樣,

他有自己的生命週期,不像一般程式的進入點是main,

Applet的生命週期是建構函式->init()->start()->paint()->stop()->destory(),

call by name

古早的程式語言,它定義了兩種參數傳遞方式,call-by-value 與 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!前面我們常常會看到一些publicprivate等等字眼,這些就是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,甚至可以用來存在檔案裡面。


http://webcache.googleusercontent.com/search?q=cache:-xYKF8I45iEJ:javateach.tripod.com/oop_introduction.doc+java+modifier&cd=18&hl=zh-TW&ct=clnk&lr=lang_zh-TW

bytecode

位元組碼

  1. ByteCode 是給予 JVM 執行的一種虛擬機器碼,也就是給於 JVM 的指令‧
  2. 反過來說,JVM 就是 ByteCode 的解譯程式‧
  3. extends 的原始程式碼 (.java) 經由編譯後產生的類別檔 (.class) 就是 ByteCode 檔案‧
  4. 雖然 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能夠執行的命令。資料寬度是以單一指令能夠處理的資訊的位元數(例如8-、16-、32-、或64-bit)來表示。而時脈速度,則是以百萬赫茲(MHz)來表示,這是由每秒鐘該CPU能夠執行多少指令來決定。愈高的資料寬度與時脈值代表著運算能力愈強的CPU。它同時也意味著CPU的電力消耗更高。

一個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 StarterHome BasicHome PremiumBusinessEnterpriseUltimate之外,所有作業系統皆擁有32位元及64位元兩種版本(Home Starter除外,只有32位元版本)。對於使用者而言,目前幾個硬體與軟體上的限制會導致64位元作業並不如消費者想像的那麼理想,使用上反而會造成使用者的困擾,這也是聯強Lemel電腦未立即推出64位元Vista的主要考量。請參考下列32位元與64位元版本系統之限制與特色:
差異1CPU的核心程式架構支援度
安裝Windows Vista 64位元作業系統,CPU必須支援Intel EM64T功能的Intel CPU或是支援AMD64功能的AMD CPU,否則在安裝時就會出現警告而導致無法安裝這個問題以目前CPU支援度而言,是硬體結構中較沒有問題的部份。

差異2:記憶體實體容量的支援度
32
位元作業系統受限於CPU32位元運算暫存器的關係,能使用在記憶體定址的範圍只有「2^32次方」 = 4GB」,所以32位元CPU及作業系統可以使用的記憶體大小只有4GB容量。如果記憶體需求超過4GB以上時,就必須使用64位元的定址方式才能繼續支援。

現實上目前市場上的晶片組記憶體支援並無法真正達成實體4GB的真實容量。支援記憶體容量的限制,取決於主機板晶片組的支援與實體記憶體的單條記憶體容量支援度。以現今晶片組Intel 965 chipset 只支援到8GB記憶體,而且市場上單條記憶體容量超過2GB的記憶體也寥寥可數,這造就了硬體暫時無法發揮64位元作業系統的優點,對一般使用者而言超過記憶體4GB的需求實際上也不多。

差異3:應用軟體與驅動程式的支援度
64位元的作業系統上,雖然部分軟體可相容32位元的模式,但對核心程式而言則需完全使用64位元的軟體,例如:驅動程式和防毒軟體。以現在硬體廠商提供的64位元驅動程式尚不齊全,所以在產品支援的廣度上,就會產生問題。另外目前僅有極少數例如SQL serverExchange serverOffice等軟體才另外有64位元版本。雖然64位元作業系統提供相容模式執行這些32位元軟體,但不保證百分之百相容,而且執行效能可能會差。所以想在Windows Vista 64位元作業系統上執行應用軟體,建議是都需要重新編譯成64位元版本才可完全正常運作。


 

註:在Windows XP Professional x64 Edition可以使用的應用軟體,並不包證可以相容於Windows Vista 64位元作業系統上。

綜合上述差異,Windows Vista 64位元作業系統雖然可以帶來未來軟體效益與速度的利基,但是在目前週邊硬體與應用軟體上尚未齊備的限制下,使用Windows Vista 32位元作業系統,仍是目前最佳建議的組合。