Ext2和Ext3文件系統

Ext2: 是 GNU/Linux 系統中標準的文件系統,其特點為存取文件的性能極好,對於中小型的文件更顯示出優勢,這主要得利於其簇快取層的優良設計。其單壹文件大小與文件系統本身的容量上限與文件系統本身的簇大小有關,在壹般常見的 x86 電腦系統中,簇最大為 4KB, 則單壹文件大小上限為 2048GB, 而文件系統的容量上限為 16384GB。但由於目前核心 2.4 所能使用的單壹分割區最大只有 2048GB,因此實際上能使用的文件系統容量最多也只有 2048GB。
  
  Ext3: 顧名思義,它就是 ext2 的下壹代,也就是在保有目前 ext2 的格式之下再加上日誌功能。目前它離實用階段還有壹段距離,也許在下壹版的核心就可以上路了。 ext3是壹種日誌式文件系統。日誌式文件系統的優越性在於:由於文件系統都有快取層參與運作,如不使用時必須將文件系統卸下,以便將快取層的資料寫回磁盤中。因此每當系統要關機時,必須將其所有的文件系統全部卸下後才能進行關機。
  
  如果在文件系統尚未卸下前就關機 (如停電) 時,下次重開機後會造成文件系統的資料不壹致,故這時必須做文件系統的重整工作,將不壹致與錯誤的地方修復。然而,此壹重整的工作是相當耗時的,特別是容量大的文件系統,而且也不能百分之百保證所有的資料都不會流失。故這在大型的伺服器上可能會造成問題。
  
  為了克服此問題,業界經長久的開發,而完成了所謂‘日誌式文件系統 (Journal File System) ’。此類文件系統最大的特色是,它會將整個磁盤的寫入動作完整記錄在磁盤的某個區域上,以便有需要時可以回朔追蹤。由於資料的寫入動作包含許多的細節,像是改變文件標頭資料、搜尋磁盤可寫入空間、壹個個寫入資料區段等等,每壹個細節進行到壹半若被中斷,就會造成文件系統的不壹致,因而需要重整。然而,在日誌式文件系統中,由於詳細紀錄了每個細節,故當在某個過程中被中斷時,系統可以根據這些記錄直接回朔並重整被中斷的部分,而不必花時間去檢查其他的部分,故重整的工作速度相當快,幾乎不需要花時間。
  
  另外Linux中還有壹種專門用於交換分區的swap文件系統,Linux使用整個分區來作為交換空間,而不象Windows使用交換文件。壹般這個SWAP格式的交換分區是主內存的2倍。

Java編譯過程與c/c++編譯的異同

Java編譯原理
    1、Java編譯過程與c/c++編譯過程不同
    Java編譯程序將java源程序編譯成jvm可執行代碼–java字節碼.
    c/c++編譯過程:
    當C編譯器編譯生成壹個對象的代碼時,該代碼是為在某壹特定硬件平臺運行而生成的。因此在編譯過程中,編譯程序通過查表將所有對符號的引用轉換為特定的內存偏移量,以保證程序運行。
    Java編譯過程:
    Java編譯器卻不將對變量和方法的引用編譯為數值引用,也不確定程序執行過程中的內存布局,而是將些符號引用信息保留在字節碼中,由解釋器在運行過程中創立內存布局,然後再通過查表來確定壹個方法所在的地址,這樣就有效地保證了java的可移植性和安全性。
    2、jvm工作原理
    運行jvm字符碼的工作是由解釋器來完成的。解釋執行過程分三步進行:代碼的裝入、代碼的校驗、和代碼的執行。
    裝入代碼的工作由“類裝載器classloader”完成。類裝載器負責裝入運行壹個程序需要的所有代碼,這也包括程序代碼中的類所繼承的類和被調
    用的類。當類裝載器裝入壹個類時,該類被放在自己的名字空間中。除了通過符號引用自己名字空間以外的類,類之間沒有其他辦法可以影響其他類。在本臺計算機的所有類都在同壹地址空間中,而所有從外部引進的類,都有壹個自己獨立的名字空間。這使得本地類通過共享相同的名字空間獲得較高的運行效率,同時又保證它們與從外部引進的類不會相互影響。
    當裝入了運行程序需要的所有類後,解釋器便可確定整個可執行程序的內存布局。解釋器為符號引用與特定的地址空間建立對應關系及查詢表。通過在這壹階段確定代碼的內布局,java很好地解決了由超類改變而使子類崩潰的問題,同時也防止了代碼的非法訪問。
    隨後,被裝入的代碼由字節碼校驗器進行檢查。校驗器可以發現操作數棧益處、非法數據類型轉化等多種錯誤。通過校驗後,代碼便開始執行了。
    java字節碼的執行有兩種方式:
    1)即時編譯方式:解釋器先將字節編譯成機器碼,然後再執行該機器碼。
    2)解釋執行方式:解釋器通過每次解釋並執行壹小段代碼來完成java字節碼程序的所有操作。本節關於Java編譯的內容介紹到這裏,請關註本節其他相關報道。

代理模式之Java動態代理

Proxy:完全由java產生的,而且實現了完整的subject接口。
    InvocationHandler:Proxy上的任何方法調用都會被傳入此類,InvocationHandler控制對RealSubject的訪問。
    因為Java已經幫助我們創建了Proxy類,我們需要有辦法告訴Proxy類妳要做什麽,我們不能像以前壹樣把代碼寫入到Proxy類中,因為Proxy類不是我們實現的。那麽我們應該放在哪裏?放在InvocationHandler類中,InvocationHandler類是響應代理的任何調用。我們可以吧InvocationHandler想成是代理收到方法調用後,請求做實際工作的對象。
    2. java.lang.reflect.InvocationHandler
    被代理實例所實現的壹個接口,內部只有壹個invoke()方法,簽名如下;
    Java代碼
    public Object invoke(Object proxy, Method method, Object[] args)
    當代理的方法被調用的時候,代理就會把這個調用轉發給InvocationHandler,也就會調用它的invoke()方法。
    3. java.lang.reflect.Proxy
    提供用於創建動態代理類和實例的靜態方法,它還是由這些方法創建的所有動態代理類的超類,我們經常使用的靜態方式是:
    Java代碼
    newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
    4. 示例:
    情形:自己可以查看修改姓名性別,但是不能修改rate。他人可以查看姓名,性別以及修改rate,但是不能修改姓名性別。
    4.1 定義壹個接口:
    Java代碼
    public interface Person {
    String getName();
    String getGender();
    void setName(String name);
    void setGender(String gender);
    void setRate(int rate);
    int getRate();
    }
    4.2 定義實現Person接口類
    Java代碼
    public class PersonImpl implements Person {
    String name;
    String gender;
    String interests;
    int rate;
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public String getGender() {
    return gender;
    }
    public void setGender(String gender) {
    this.gender = gender;
    }
    public String getInterests() {
    return interests;
    }
    public void setInterests(String interests) {
    this.interests = interests;
    }
    public int getRate() {
    return rate;
    }